Banjir scraper di paket Gratis Cloudflare: apa yang menghentikannya, dan apa yang kami biarkan tetap mati
Ops
Suatu pagi, salah satu situs listing kami berhenti terbuka. Cloudflare menampilkan error 524 kepada pengunjung, origin membutuhkan dua hingga enam menit per halaman, dan tidak ada yang memberi tahu kami selama sekitar sepuluh jam. Penyebabnya adalah scraper yang berjalan melalui residential proxy dengan kecepatan sekitar 225 permintaan per detik.
Bentuk banjir tersebut
- Ribuan alamat, satu hingga tiga permintaan masing-masing. Koneksi broadband rumah di AS, Spanyol, Prancis, Brasil, Inggris, dan tempat lain, jenis trafik yang disewakan oleh jaringan residential proxy.
- User agent Chrome di Mac, dengan nomor versi dari 103 hingga 151.
- Hampir tidak pernah ada cookie atau Referer. Dari 2.697 permintaan yang kami sampel di server, 4 membawa cookie dan 4 membawa Referer.
- Dua jenis klien. Sekitar setengahnya tidak mengirim header
Sec-Fetch-*dan tidak mengirim client hints: sebuah skrip dengan string user agent yang disalin. Setengah lainnya mengirim header browser lengkap: sebuah headless browser.
Setiap halaman dirender untuk setiap permintaan, sehingga setiap worker mengantre ratusan render dan mencapai batas CPU-nya.
Mengapa batas per-alamat tidak membantu
Rate limit menghitung permintaan per alamat. Dengan satu hingga tiga permintaan dari masing-masing ribuan alamat, tidak ada satu alamat pun yang mendekati batas. Memblokir negara akan memblokir pengunjung kami. Yang tidak dapat dipalsukan secara murah oleh scraper adalah berperilaku seperti browser yang pernah mengunjungi situs tersebut sebelumnya.
Di edge Cloudflare: tiga aturan gratis
Paket Gratis mengizinkan lima custom rule WAF per zone. Kami menggunakan tiga, semuanya dengan managed challenge alih-alih block, sehingga orang yang tertangkap karena kesalahan dapat mengklik untuk melanjutkan:
- Browser palsu: sebuah GET yang user agent-nya mengandung
Chrome/dan tidak memiliki headerSec-Fetch-Mode. Setiap Chrome sejak 2019 mengirimnya. - Cloud scraper: permintaan halaman dari jaringan Alibaba, Tencent, dan Huawei Cloud, tempat sebagian besar yang kami challenge berasal.
- Darurat, mati secara default: sebuah GET tanpa cookie sama sekali dan tanpa Referer. Orang yang pernah mengunjungi situs, atau yang datang melalui tautan, lolos tanpa gangguan; scraper yang tidak menyimpan cookie akan bertemu challenge di setiap permintaan. Kami mengaktifkannya hanya selama banjir, karena aturan ini juga men-challenge orang yang mengetik alamat ke browser baru.
Ketiganya meloloskan bot terverifikasi Cloudflare, user agent yang menyebut dirinya sebagai robot, alamat kami sendiri, jalur API dan webhook, serta file yang bukan halaman. Dua hari kemudian, banjir masih berlanjut: dalam satu jam, aturan browser palsu menantang lebih dari 10.000 permintaan. 10.000 peristiwa yang dikembalikan Cloudflare per kueri berasal dari 9.627 alamat, tidak ada yang lebih dari 4.
Di origin: gerbang di dalam aplikasi
Bagian headless memiliki header browser lengkap, sehingga aturan edge saja tidak menangkapnya saat aturan darurat dimatikan. Di dalam aplikasi itu sendiri, kami menempatkan middleware kecil di depan perender halaman:
- user agent Chrome tanpa
Sec-Fetch-Modemaupun client hints mendapat 403 sebelum ada pekerjaan yang dilakukan; - orang asing, tanpa cookie kami dan tanpa Referer, hanya dilayani saat worker memiliki kapasitas cadangan, pada beberapa halaman per detik. Di atas itu, halaman 503 berukuran 400 byte mengatur cookie dan memuat ulang setelah dua detik. Orang mendapat halaman pada percobaan kedua; scraper yang tidak menyimpan cookie tidak pernah mendapatnya.
Pada menit pertama, gerbang menolak sekitar 6.700 browser palsu dan mengusir sekitar 6.700 orang asing, sambil melayani orang asing sekitar 9 halaman per detik. Permintaan lambat turun ke nol, CPU worker turun dari batasnya ke 12 hingga 15 persen, dan memori mereka dari 4 hingga 5 GB masing-masing menjadi 0,65 GB.
Yang kami biarkan mati
- Bot Fight Mode. Mode ini menantang lalu lintas otomatis dan tidak dapat dilewati dengan aturan khusus pada paket Free, dan mode ini menangkap webhook penyedia pembayaran kami.
- Under Attack mode untuk seluruh zone. Mode ini menempatkan setiap pengunjung, klien API, dan webhook melalui interstitial. Aturan darurat melakukan pekerjaan yang sama hanya untuk permintaan halaman dari orang asing.
- Aturan pembatasan laju pada paket Free. Aturan ini menghitung per alamat, yang tidak pernah dipicu oleh banjir ini.
- Memblokir perayap AI. Kami ingin ditemukan oleh asisten pencarian AI, dan perayap tersebut bukan masalahnya.
Kesimpulan
Banjir melalui proxy residensial mudah dikenali dari apa yang tidak dimilikinya: header fetch browser, cookie, dan Referer. Tantang hal itu di edge, batasi orang asing dalam batas yang dapat dirender oleh worker Anda, dan pastikan sesuatu di luar server menyadari ketika halaman berhenti terbuka. Night Watch mengemas ketiganya: pengawas, aturan dengan sakelar otomatis untuk aturan darurat, dan gerbang untuk aplikasi web Python.