The payment form appears twice during checkout
A customer enters their card, the page reloads, and the real payment form asks for the same details again: that double entry is not a display glitch, it is the signature of browser-side card data theft.
Why double entry is the most reliable symptom
A customer writes in to say they had to enter their card twice: the first page seemed to reload, then the usual payment form asked for the same details again. The order went through, the amount is right, only one charge appears. From the back office, nothing looks wrong.
That is precisely the signature of a technique Sansec documented in February 2026 as “double-tap skimming”, detected on 16 February 2026 on the shop of a supermarket chain in the global top 10 — around €100 billion in annual revenue, more than 10,000 stores across 25 countries — part of whose e-commerce infrastructure runs on PrestaShop. A fake payment form appears first and captures the card details, then the real form takes over and the order completes normally. Most customers accept the second entry without suspecting the data has already been stolen.
The symptom is reliable because it is structural. The theft needs the customer to fill in a form that leads nowhere, so it needs them to start again. On the merchant side there is no alert, no abnormal failure rate, no odd line in the orders: you hear about it from a customer who found it strange, or from a fraud chargeback a month later.
What should trigger a check
- A customer describes entering their card details twice within a single order.
- A customer reports a payment screen that does not quite look like the one you know.
- Several fraud chargebacks involve customers who ordered in the same period.
- Your payment provider or bank flags an unusual concentration of fraud on your orders.
- A theme file carries a modification date that no work of yours explains.
Where to look: theme files, then the database
Sansec points to two places on the merchant side. First, script tags injected into theme files, notably _partials/head.tpl on PrestaShop: the template loaded on every page, checkout included. Second, JavaScript that watches input fields and stores the values in the browser’s localStorage under a prefix, to be picked up and sent elsewhere. I am not publishing the destination.
The database is the other place to open. In January 2025 PrestaShop documented a wave of attacks exploiting SQL injection in third-party modules, not in the core, to plant malicious content in the PS_SHOP_NAME configuration value. That value is then used to load unauthorised JavaScript which captures customer input. The recommended check is direct: read PS_SHOP_NAME in the database and confirm it holds nothing but your shop name. PrestaShop also advises updating every native and third-party module, using a custom database prefix rather than ps_, and running a web application firewall.
Both routes tell the same story: a theme template and a configuration value are two places nobody ever re-reads, and they decide what runs on the payment page.
Hosted payment fields do not put you out of reach
Many merchants consider the matter closed because card entry happens in a frame or on a page hosted by the payment provider, so card numbers never touch their server. That holds for the form itself. It does not hold for the page around it.
In the double entry scenario the injected code does not attack the provider’s field: it renders its own overlay before it, inside the page you control. The customer sees a credible payment screen, in their language and in your branding — Sansec notes these overlays are now carefully localised and that generative AI tools speed up their production. As long as the page hosting the payment can be modified, a hosted integration does not prevent the theft.
What I check, in this order
-
Compare theme files against a clean reference
A deployment copy, an earlier backup or a Git repository gives you the comparison point. Any script tag added to a template loaded on every page is a compromise until proven otherwise.
-
Read modification dates on the server
Files changed recently without any work from you frame the incident window: they give you a start date to look for in access logs and in back-office login history.
-
Read the PS_SHOP_NAME value in the database
On PrestaShop this configuration value should hold the shop name and nothing else. Any fragment of a tag, a script or an address there is a direct signal, and it points towards a vulnerable third-party module as the entry point.
-
Inventory the scripts actually loaded at checkout
Open checkout in a browser and list the scripts that load. Each one should map to a module, a theme or a tool you chose to install. Anything you cannot map has to be justified before it is left in place.
-
Deal with access before files
Cleaning a template without rotating access (back office, FTP/SFTP, database, hosting) leaves the door open and the code comes back. In the case Sansec documented, the skimmer was still live on 20 February 2026, after six notification attempts. This kind of infection does not stop on its own.
What this page does not contain
I am not writing any method for reproducing the attack, any injected code, any destination address, or any way of finding vulnerable shops. This page exists to observe, verify and fix, not to equip anyone.
If any of the signs above is present, the next step is not patching one file: it is a full clean-up, rotating every credential, and putting integrity monitoring on the payment page so the next change is caught the same day rather than a month later by a chargeback.
Where to go next
-
Checking whether my site is compromised
The full review, beyond the payment page alone.
-
Cleaning an infected site
What a clean-up that stops the code returning actually involves.
-
PrestaShop payment problems
Other possible causes of a checkout that behaves badly.
-
Checkout funnel
What the term covers exactly, step by step.
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.