DEV Community

Cover image for Solved: The Stripe slow-burn how to fraud playbook!
Darian Vance
Darian Vance

Posted on • Originally published at wp.me

Solved: The Stripe slow-burn how to fraud playbook!

🚀 Executive Summary

TL;DR: Merchants face “Stripe slow-burn” card testing attacks, where fraudsters validate stolen credit cards via low-friction payment forms, incurring dispute fees and risking account suspension. Combat this by implementing immediate rate limiting and CAPTCHA, then leveraging Stripe Radar and 3D Secure, and considering geo-blocking or identity verification for persistent threats.

🎯 Key Takeaways

  • The “slow-burn” attack involves fraudsters using bots to test thousands of stolen credit card numbers with small transactions on low-friction payment forms, leading to merchant transaction fees, dispute fees, and potential Stripe account shutdown.
  • Immediate mitigation strategies include implementing edge-level rate limiting (e.g., NGINX limit\_req\_zone) and client-side CAPTCHA (e.g., Google reCAPTCHA v3) to deter high-volume automated attacks.
  • Permanent solutions involve leveraging Stripe Radar (default or ‘for Fraud Teams’ for custom rules) to block high-risk payments, and dynamically implementing 3D Secure (SCA) to shift liability for fraudulent disputes to the card-issuing bank.

Struggling with a wave of small, fraudulent charges on your Stripe account? This guide breaks down the “slow-burn” card testing attack and provides actionable DevOps and architectural solutions to stop the bleeding, from quick firewall rules to robust, permanent fixes.

The “Stripe Slow-Burn”: How Card Testers Are Bleeding You Dry (And How to Stop Them)

It was 3 AM on a Saturday. My phone buzzed, but it wasn’t the usual PagerDuty alert about prod-db-01 hitting a CPU threshold. It was a Slack message from our Head of Finance: “Darian, why do we have over 4,000 new $1 ‘donations’ from all over the world in the last 12 hours?” My blood ran cold. We weren’t the target of some grand heist; we were the tool. Our simple, unprotected donation endpoint was being used as a credit card validator for fraudsters. Every one of those “successful” transactions was a ticking time bomb for a $15 dispute fee, and our reputation with Stripe was heading for a cliff.

So, What Is This “Slow-Burn” Attack?

Let’s get one thing straight: the attackers don’t want your money. Not your $1, anyway. They have massive lists of stolen credit card numbers, and they need to know which ones are still active. This is called “carding” or “card testing.” They build bots that hit simple, low-friction payment forms—like yours—to test thousands of cards with tiny transactions.

  • If the transaction succeeds, the card is marked as ‘LIVE’ and sold on the dark web for a much higher price.
  • If it fails, they just toss it and move on.

You, the merchant, are left holding the bag. You’re hit with transaction fees for every attempt, and worse, you’re slammed with chargeback and dispute fees when the real cardholders notice the fraudulent charges. Do this enough, and Stripe will shut your account down. It’s a low-and-slow attack that bleeds you dry through a thousand tiny cuts.

The Fixes: From Band-Aids to Body Armor

Panicking won’t help, but acting fast will. Here’s the playbook I use when this pattern emerges, broken down from immediate triage to a permanent architectural fix.

Solution 1: The Quick Fix – Rate Limiting and CAPTCHA

The first thing you need to do is stop the bleeding. The attackers are relying on automation and volume. You need to make that expensive and difficult for them, right now. This is the “get me through the weekend” fix.

Your best friends here are rate limiting at the edge (your load balancer, CDN, or web server) and a CAPTCHA on the form itself. This won’t stop a determined manual attacker, but it decimates the low-effort bots.

For example, here’s a simple NGINX config to limit requests to your payment endpoint:

# In your nginx.conf http block
limit_req_zone $binary_remote_addr zone=payment_limit:10m rate=5r/m;

# In your server block
location /api/v1/payment {
    limit_req zone=payment_limit burst=10 nodelay;
    # ... your other proxy/fastcgi settings
}
Enter fullscreen mode Exit fullscreen mode

This snippet limits a single IP address to 5 requests per minute for the payment endpoint, with a burst capacity of 10. It’s a hacky, blunt instrument, but it’s incredibly effective at stopping the firehose of requests while you work on a real solution. Combine this with adding Google reCAPTCHA v3 to your payment form, and you’ve just raised the bar significantly.

Solution 2: The Permanent Fix – Use the Tools You’re Already Paying For

Once you’ve stopped the immediate flood, it’s time to build a real wall. This means using the advanced fraud detection tools provided by your payment processor. For Stripe, this is Radar.

Stripe Radar uses machine learning across the entire Stripe network to identify and block fraudulent payments. The basic version is included with the standard transaction fee, and frankly, it’s malpractice not to be using it.

Here’s a comparison of your options:

Tool What It Does Why You Need It
Stripe Radar (Default) Provides risk scores and basic block rules. It’s on by default but needs to be configured to be aggressive. This is your baseline. Go into your Stripe Dashboard and set the “risk level” you’re comfortable with. Start blocking payments that Radar scores as high-risk.
Radar for Fraud Teams Lets you write complex, custom rules. E.g., “Block if card is from country X but IP is from country Y” or “Block if > 3 attempts from this IP in 1 hour”. This is where the real power is. It costs extra, but it’s cheaper than thousands in dispute fees. You can surgically target the exact patterns you’re seeing.
3D Secure (SCA) Forces an additional verification step with the cardholder’s bank (like an SMS code or app approval). This is a game-changer. When a payment is authenticated with 3D Secure, the liability for fraudulent disputes shifts from you to the card-issuing bank. It adds a little friction for users but kills this attack vector dead.

Implementing 3D Secure dynamically (e.g., only triggering it for suspicious transactions) is the gold standard. It gives legitimate users a smooth experience while forcing high-risk payments to go through an extra check.

Solution 3: The ‘Nuclear’ Option – Geo-Blocking and Identity Checks

Sometimes, the attack is so persistent and targeted that you need to take drastic measures. This is your “break glass in case of emergency” option, because it will impact legitimate users.

First, Geo-blocking. Dive into your analytics and the Stripe data. Is 95% of the fraud coming from IP addresses in countries where you have zero customers? Block them. Don’t do it on your application servers; that’s too slow. Implement the block at the edge: Cloudflare, AWS WAF, or your infrastructure firewall. This is a heavy-handed tool, but if your business is primarily North American and the attacks are coming from Eastern Europe, it’s a logical step.

A Word of Warning: Be careful with this. VPNs are a thing, and you can inadvertently block legitimate customers who are traveling or concerned about privacy. This is a business decision as much as a technical one. Communicate with your product and leadership teams before flipping this switch.

Second, you can increase sign-up friction. Fraudsters love easy targets. If your payment form only requires an email and a credit card, you’re a prime target. Consider adding a required phone number verification step (using a service like Twilio Verify) before a user can access the payment form. It’s a hurdle, but it’s one that most bots can’t jump.

Ultimately, fighting this kind of fraud is a continuous process, not a one-time fix. But by layering these defenses, you can turn your application from a soft, inviting target into a hardened, frustrating one for attackers, letting you and your team get back to sleeping through the night.


Darian Vance

👉 Read the original article on TechResolve.blog


☕ Support my work

If this article helped you, you can buy me a coffee:

👉 https://buymeacoffee.com/darianvance

Top comments (0)