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

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:

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:

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

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.

Diperbarui: