Website Anda live tapi tidak tahu cara buat waf custom rules cloudflare. Dan traffic mulai masuk. Di saat yang sama, ratusan bot otomatis sudah memetakan struktur situs Anda tanpa izin. Mereka mencari celah, versi plugin, dan file konfigurasi yang terbuka.
Cloudflare hadir sebagai solusi nyata. Namun banyak pengguna akun gratis berhenti di pengaturan default tanpa menyentuh fitur Custom WAF Rules. Padahal lima slot yang tersedia sudah lebih dari cukup untuk menutup mayoritas vektor serangan paling umum.
Panduan ini menyajikan lima aturan WAF siap pakai khusus akun Cloudflare gratis. Berlaku untuk semua platform: WordPress, Laravel, Joomla, bahkan HTML statis. Tidak ada teori kosong di sini. Setiap rule lahir dari pola serangan nyata yang terjadi setiap hari.
Highlight
Cloudflare WAF Custom Rules untuk Akun Gratis: 5 Rules Wajib
- Akun Cloudflare gratis menyediakan 5 slot Custom WAF Rules tanpa regex. Jumlah ini cukup menutup mayoritas jalur serangan utama sebelum menyentuh server Anda.
- Rule 1 memblokir puluhan bot berbahaya, scraper SEO agresif, dan tool eksploitasi berdasarkan User-Agent string yang mereka kirimkan ke server.
- Rule 2 menutup akses ke file konfigurasi, direktori version control, dan panel database yang bocor ke publik. Berlaku untuk semua CMS dan framework.
- Rule 3–5 menangkap payload SQLi, XSS, LFI, HTTP method berbahaya, dan eksekusi webshell. Ini adalah jalur serangan paling sering dieksploitasi setelah bot berhasil lolos.
- Urutan pemasangan dan satu langkah testing dengan mode Log menentukan apakah rules Anda bekerja dengan benar atau malah memblokir traffic legitimate.
Mengapa Custom WAF Rules Lebih Penting dari Pengaturan Default?

Proteksi default Cloudflare bersifat pasif dan general. Sistem tidak mengetahui arsitektur spesifik website Anda, tidak tahu file mana yang sensitif, dan tidak tahu tool apa yang penyerang gunakan untuk memetakan situs Anda.
Custom WAF Rules mengisi celah itu. Anda mendefinisikan sendiri kondisi pemblokiran. Cloudflare mengeksekusinya di edge network mereka, bukan di server Anda.
Artinya, sebelum request menyentuh PHP, Node.js, atau Apache Anda, serangan sudah berhenti di jaringan Cloudflare.
Perlu Anda ketahui dulu batasan akun gratis sebelum melanjutkan:
| Fitur | Akun Gratis | Akun Pro / Business |
|---|---|---|
| Jumlah Custom Rules | 5 rules | 100+ rules |
| Dukungan Regex | ❌ Tidak tersedia | ✓ Tersedia |
| Managed Rulesets | ❌ Tidak tersedia | ✓ Tersedia |
| Rate Limiting Rules | 1 rule | Lebih banyak |
Tanpa regex, Anda hanya bisa memakai operator contains, eq, starts_with, dan ends_with. Justru karena keterbatasan ini, efisiensi setiap rule menjadi sangat krusial.
Cara Kerja WAF Rules Cloudflare: 5 Rules Ini sebagai Layer Keamanan Berlapis

Lima rules berikut tidak berdiri sendiri-sendiri. Mereka membentuk funnel pertahanan berlapis. Jika satu penyerang lolos dari Rule 1 dengan memalsukan User-Agent, Rule 2 masih menunggunya di lapisan berikutnya.
- Rule 1: Identifikasi dan blokir berdasarkan identitas klien (User-Agent string)
- Rule 2: Tutup akses ke file dan direktori yang tidak boleh publik sentuh
- Rule 3: Deteksi payload serangan SQLi, XSS, LFI, dan RCE langsung di URL
- Rule 4: Blokir HTTP method yang tidak dibutuhkan website normal
- Rule 5: Cegah eksekusi webshell meskipun penyerang sudah berhasil meng-upload file berbahaya
Pasang rules ini secara berurutan di dashboard. Cloudflare mengeksekusi rules dari posisi atas ke bawah. Urutan yang salah bisa membuat proteksi berlapis ini tidak bekerja sebagaimana mestinya.
Artikel tentang cara membangun sistem keamanan berlapis yang pernah kami buat patut untuk baca juga untuk menambah wawasan dan tahu bagaimaan struktur penerapan keamanan berlapis untuk melindungin website.
Rule 1 – Block Bad Bots, Scrapers & Attack Tools
Dibawah ini adalah cara buat waf custom rules cloudflare untuk memblokir bot (robots) yang mengkonsumsi banyak resources server sehingga membuat website menjadi lemot.
Ingat! mayoritas serangan dimulai dari tahap reconnaissance. Yaitu: Bot otomatis memetakan struktur situs, mencari versi plugin, mendeteksi CMS, dan mengumpulkan informasi sebelum serangan nyata diluncurkan. Rule ini memotong proses itu dari akarnya.
Parahnya mereka melakukan itu secara membabibuta semua folder di scan satu persatu. Akibatnya ram dan prosesor server terkuras untuk melayaninya.
Cara kerjanya sederhana: setiap klien HTTP mengirimkan User-Agent string ke server sebagai tanda pengenal. Browser nyata mengirim string seperti Mozilla/5.0 (Windows NT 10.0...). Bot dan tool otomatis mengirim string khas yang mudah dikenali.
Perhatikan sebelum menerapkan rule ini:
- Jangan tambahkan
googlebot,bingbot, atauduckduckbot. Memblokir ketiganya langsung merusak SEO Anda. - Hapus
dotbotjika Anda ingin Domain Authority (DA) di Moz tetap diperbarui. - Hapus
gptbot,claudebot, dananthropic-aijika Anda ingin konten terindeks untuk AI training. - Hapus
ia_archiverjika Anda ingin situs ter-archive di Wayback Machine.
Action: Block
(lower(http.user_agent) contains "ahrefsbot") or
(lower(http.user_agent) contains "semrushbot") or
(lower(http.user_agent) contains "mj12bot") or
(lower(http.user_agent) contains "serpstatbot") or
(lower(http.user_agent) contains "seokicks") or
(lower(http.user_agent) contains "blexbot") or
(lower(http.user_agent) contains "screaming frog seo spider") or
(lower(http.user_agent) contains "ubersuggest") or
(lower(http.user_agent) contains "ccbot") or
(lower(http.user_agent) contains "bytespider") or
(lower(http.user_agent) contains "petalbot") or
(lower(http.user_agent) contains "perplexitybot") or
(lower(http.user_agent) contains "yandexbot") or
(lower(http.user_agent) contains "megaindex") or
(lower(http.user_agent) contains "omgili") or
(lower(http.user_agent) contains "omgilibot") or
(lower(http.user_agent) contains "grapeshotcrawler") or
(lower(http.user_agent) contains "dotbot") or
(lower(http.user_agent) contains "baiduspider") or
(lower(http.user_agent) contains "ia_archiver") or
(lower(http.user_agent) contains "msnbot") or
(lower(http.user_agent) contains "exabot") or
(lower(http.user_agent) contains "dataforseo") or
(lower(http.user_agent) contains "gptbot") or
(lower(http.user_agent) contains "chatgpt-user") or
(lower(http.user_agent) contains "claudebot") or
(lower(http.user_agent) contains "anthropic-ai") or
(lower(http.user_agent) contains "zgrab") or
(lower(http.user_agent) contains "masscan") or
(lower(http.user_agent) contains "nmap") or
(lower(http.user_agent) contains "sqlmap") or
(lower(http.user_agent) contains "nikto") or
(lower(http.user_agent) contains "acunetix") or
(lower(http.user_agent) contains "netsparker") or
(lower(http.user_agent) contains "nuclei") or
(lower(http.user_agent) contains "dirbuster") or
(lower(http.user_agent) contains "gobuster") or
(lower(http.user_agent) contains "wfuzz") or
(lower(http.user_agent) contains "burpsuite") or
(lower(http.user_agent) contains "scrapy") or
(lower(http.user_agent) contains "httrack") or
(lower(http.user_agent) contains "python-requests") or
(lower(http.user_agent) contains "python-urllib") or
(lower(http.user_agent) contains "go-http-client") or
(lower(http.user_agent) contains "libwww-perl") or
(lower(http.user_agent) contains "lwp-trivial") or
(lower(http.user_agent) contains "java/") or
(lower(http.user_agent) contains "curl/") or
(lower(http.user_agent) contains "wget/") or
(lower(http.user_agent) contains "php/") or
(http.user_agent eq "")
Cara Membaca Rule 1 Itu
Rule ini bekerja dengan logika sederhana: jika tanda pengenal pengunjung mengandung salah satu string yang ada di daftar, blokir sekarang sebelum request masuk lebih jauh.
Tanda pengenal yang dimaksud adalah User-Agent — semacam “kartu nama” yang setiap klien HTTP kirimkan ke server setiap kali membuat request.
Browser biasa mengirim string panjang seperti Mozilla/5.0 (Windows NT...). Bot dan tool otomatis hampir selalu mengirim nama mereka sendiri yang khas dan mudah dikenali.
Fungsi lower() membungkus field http.user_agent agar seluruh teks dikonversi ke huruf kecil sebelum diperiksa. Ini mencegah penyerang lolos hanya dengan mengganti kapitalisasi — misalnya mengirim AhrefsBot atau AHREFSBOT sebagai ganti ahrefsbot. Operator contains berarti cocok sebagian — tidak harus persis sama persis, cukup mengandung string tersebut di mana pun posisinya. Kondisi antar baris dihubungkan oleh or, artinya satu pun cocok sudah cukup untuk memicu pemblokiran — tidak harus semua kondisi terpenuhi sekaligus.
Kondisi terakhir, http.user_agent eq "", menangkap request yang tidak mengirimkan User-Agent sama sekali. Browser nyata dan crawler resmi selalu mengirim User-Agent. Request tanpa User-Agent hampir pasti berasal dari script kasar, tool scan otomatis, atau percobaan koneksi langsung ke server — tidak ada alasan legitimnya untuk membiarkan request semacam ini masuk.
Studi Kasus: Log Server Penuh 40.000 Request Mencurigakan dari Satu Bot dalam Sehari
Salahsatu tim HardaWebPro memeriksa laporan akses mingguan pada dasbor AWStats milik klien UMKM wilayah Tangerang. Tiba-tiba, grafik menunjukkan lonjakan aktivitas tidak wajar.
Kami menemukan satu alamat IP asing mengirim empat puluh ribu permintaan dalam satu hari saja. Secara cepat, kami menelusuri isi log akses server Linux tersebut secara manual.
Hal ini mengungkap pola perayapan agresif pada folder sensitif sistem. Kami segera mengambil tindakan preventif.
Bot jahat tersebut terus mencoba membebani sumber daya CPU server secara berlebihan.
Akibatnya, kecepatan muat website menurun drastis sehingga mengganggu kenyamanan pengunjung asli.
Tidak sampai itu saja, bot menggunakan identitas peramban palsu untuk mengelabui firewall standar.
Kami langsung mengenali ancaman skrip otomatis yang sedang mencari celah keamanan website klien. Oleh karena itu, langkah pemblokiran IP merupakan prioritas utama tim saat itu. Situasi makin genting.
Akhirnya, kami coba googling untuk menemukan cara buat waf custom rules cloudflare khusus untuk menanggulangi masalah ini.
Pas! kami memasang aturan WAF khusus berdasarkan string User-Agent mencurigakan melalui Cloudflare. Kami mengarahkan trafik tersebut ke tantangan Managed Challenge agar bot tidak bisa tembus.
Secara instan, statistik serangan pada panel keamanan menunjukkan penurunan angka secara drastis. Bahkan, beban kerja prosesor server kembali normal dalam hitungan menit saja.
Kini, website klien beroperasi dengan aman tanpa gangguan bot pengganggu lagi. Kami sukses mengamankan aset berharga mereka. Alhamdulillah 🙏.
Rule 2 – Block Akses File Konfigurasi dan Sistem
Cara buat waf custom rules cloudflare untuk block akses ke file sensitif, mungkin berisi konfigurasi atau semacamnya dimana terdapat data credential seperti db_name dan db_user bahkan db_pass dst.

Penyerang yang lolos dari Rule 1 biasanya langsung mencari “peta” situs Anda. Mereka mencoba mengakses .env, membuka /phpmyadmin, atau melihat isi wp-config.php. Informasi dari file-file ini memberi amunisi untuk serangan lebih dalam.
Rule 2 menutup semua jalur akses itu. Sifatnya platform-agnostic, berlaku sama efektifnya untuk WordPress, Laravel, CodeIgniter, Django, maupun situs HTML statis yang mengekspos file konfigurasi secara tidak sengaja.
Perlu Anda perhatikan satu hal: readme.html dan readme.txt adalah file bawaan WordPress yang berisi versi instalasi. Sebaiknya Anda blokir keduanya agar penyerang tidak bisa memetakan versi WordPress Anda dengan mudah.
Action: Block
(lower(http.request.uri.path) contains "/.env") or
(lower(http.request.uri.path) contains "/.git/") or
(lower(http.request.uri.path) contains "/.svn/") or
(lower(http.request.uri.path) contains "/.hg/") or
(lower(http.request.uri.path) contains "/.htaccess") or
(lower(http.request.uri.path) contains "/.htpasswd") or
(lower(http.request.uri.path) contains "/.ds_store") or
(lower(http.request.uri.path) contains "/.bash_history") or
(lower(http.request.uri.path) contains "/.ssh/") or
(lower(http.request.uri.path) contains "/wp-config.php") or
(lower(http.request.uri.path) contains "/wp-activate.php") or
(lower(http.request.uri.path) contains "/wp-signup.php") or
(lower(http.request.uri.path) contains "/xmlrpc.php") or
(lower(http.request.uri.path) contains "/phpinfo") or
(lower(http.request.uri.path) contains "/phpmyadmin") or
(lower(http.request.uri.path) contains "/adminer") or
(lower(http.request.uri.path) contains "/server-status") or
(lower(http.request.uri.path) contains "/server-info") or
(lower(http.request.uri.path) contains "/nginx-status") or
(lower(http.request.uri.path) contains "/install.php") or
(lower(http.request.uri.path) contains "/setup.php") or
(lower(http.request.uri.path) contains "/config.php") or
(lower(http.request.uri.path) contains "/configuration.php") or
(lower(http.request.uri.path) contains "/database.php") or
(lower(http.request.uri.path) contains "/web.config") or
(lower(http.request.uri.path) contains "/composer.json") or
(lower(http.request.uri.path) contains "/composer.lock") or
(lower(http.request.uri.path) contains "/package.json") or
(lower(http.request.uri.path) contains "/yarn.lock") or
(lower(http.request.uri.path) contains "/backup/") or
(lower(http.request.uri.path) contains "/.backup") or
(lower(http.request.uri.path) contains "readme.html") or
(lower(http.request.uri.path) contains "readme.txt") or
(lower(http.request.uri.path) contains "license.txt") or
(lower(http.request.uri.path) contains "/etc/passwd") or
(lower(http.request.uri.path) contains "/proc/self")
Cara Membaca Rule 2
Rule ini bekerja dengan memeriksa path URL yang dikirim pengunjung — bukan User-Agent seperti Rule 1. Field http.request.uri.path berisi bagian URL setelah domain, misalnya /wp-config.php atau /.env.
Setiap kali ada request masuk, Cloudflare memeriksa apakah path tersebut mengandung salah satu string yang ada di daftar.
Jika ya, request langsung diblokir di edge sebelum sempat menyentuh server. Sama seperti Rule 1, antar kondisi dihubungkan or — satu kecocokan sudah cukup untuk memicu blokir.
Logika di balik daftar ini sederhana: file dan direktori yang ada di sini tidak punya alasan sah untuk diakses publik lewat browser. File seperti .env berisi kredensial database dan API key. Direktori .git/ menyimpan seluruh histori kode sumber — termasuk commit lama yang mungkin mengandung password.
Panel seperti /phpmyadmin dan /adminer membuka akses langsung ke database. File readme.html dan license.txt bawaan WordPress mengekspos versi instalasi yang bisa penyerang gunakan untuk mencocokkan dengan daftar known vulnerabilities. Semua ini adalah informasi yang penyerang kumpulkan di tahap awal sebelum serangan nyata dimulai.
Yang membuat Rule 2 berbeda dari Rule 1 adalah sifatnya yang tidak peduli siapa yang meminta — bahkan jika request datang dari browser nyata dengan User-Agent yang sah dan lolos dari Rule 1. Selama path-nya cocok dengan daftar, tetap diblokir.
Ini penting karena penyerang berpengalaman tahu cara memalsukan User-Agent — tapi mereka tidak bisa mengubah path yang mereka tuju jika memang itu file yang ingin mereka akses.
Rule 3 – Block Payload Serangan Web: SQLi, XSS, LFI, dan RCE
Nah ini yang paling butuh penanganan serius. Cara buat waf custom rules cloudflare untuk block serangan yang mencoba menggunakan SQL Injection. Bagi pemilik toko online wajib memperhatikan ini.
Berbeda dari Rule 1 dan 2, Rule 3 memeriksa isi URL secara mendalam termasuk query string. Penyerang yang mencoba SQL Injection tidak menyerang lewat User-Agent. Mereka menyisipkan payload langsung di parameter URL seperti ?id=1 UNION SELECT atau ?page=../../etc/passwd.
Bahkan jika aplikasi Anda belum ter-patch, Cloudflare memblokir eksploitasi dari sisi jaringan sebelum request sampai ke aplikasi.
Beberapa kondisi di rule ini juga menangkap URL encoding ganda seperti %20 dan %2f yang biasa penyerang gunakan untuk mencoba bypass WAF.
Action: Block
(lower(http.request.uri) contains "select%20") or
(lower(http.request.uri) contains "select+") or
(lower(http.request.uri) contains "union%20select") or
(lower(http.request.uri) contains "union+select") or
(lower(http.request.uri) contains "order+by") or
(lower(http.request.uri) contains "order%20by") or
(lower(http.request.uri) contains "group+by") or
(lower(http.request.uri) contains "group%20by") or
(lower(http.request.uri) contains "1=1--") or
(lower(http.request.uri) contains "'%20or%20'") or
(lower(http.request.uri) contains "%27or%271") or
(lower(http.request.uri) contains "<script") or
(lower(http.request.uri) contains "%3cscript") or
(lower(http.request.uri) contains "javascript:") or
(lower(http.request.uri) contains "vbscript:") or
(lower(http.request.uri) contains "onload=") or
(lower(http.request.uri) contains "onerror=") or
(lower(http.request.uri) contains "onclick=") or
(lower(http.request.uri) contains "../") or
(lower(http.request.uri) contains "..%2f") or
(lower(http.request.uri) contains "%2e%2e%2f") or
(lower(http.request.uri) contains "%2e%2e/") or
(lower(http.request.uri) contains "etc/passwd") or
(lower(http.request.uri) contains "etc%2fpasswd") or
(lower(http.request.uri) contains "cmd.exe") or
(lower(http.request.uri) contains "cmd%2eexe") or
(lower(http.request.uri) contains "/bin/bash") or
(lower(http.request.uri) contains "/bin/sh") or
(lower(http.request.uri) contains "base64_decode") or
(lower(http.request.uri) contains "eval%28") or
(lower(http.request.uri) contains "exec%28") or
(lower(http.request.uri) contains "system%28") or
(lower(http.request.uri) contains "passthru%28") or
(lower(http.request.uri) contains "shell_exec%28") or
(lower(http.request.uri) contains "preg_replace%28") or
(lower(http.request.uri) contains "wget%20") or
(lower(http.request.uri) contains "curl%20")
Cara Membaca Rule 3
Rule ini beroperasi satu level lebih dalam dari Rule 2. Field yang diperiksa bukan hanya http.request.uri.path — melainkan http.request.uri secara keseluruhan, yang mencakup path sekaligus query string. Ini penting karena payload serangan hampir tidak pernah disisipkan di path URL. Penyerang meletakkannya di parameter — misalnya ?id=1 UNION SELECT, ?page=../../../etc/passwd, atau ?search=<script>alert(1)</script>. Rule 2 tidak menangkap ini karena query string bukan bagian dari uri.path. Rule 3 mengisi celah itu.
Banyak kondisi di rule ini hadir dalam dua versi sekaligus — versi teks biasa dan versi URL-encoded. Misalnya select%20 dan select+ keduanya merepresentasikan SELECT dengan spasi, hanya dikodekan dengan cara berbeda.
Begitu pula ../ dan ..%2f yang keduanya berarti path traversal naik satu direktori. Ini bukan duplikasi tanpa alasan. Penyerang yang tahu cara kerja WAF sering mencoba bypass dengan URL encoding — mengganti karakter biasa dengan padanan hex-nya berharap rule gagal mencocokkan. Dengan memasukkan keduanya, celah bypass itu ditutup. Kondisi seperti %3cscript (bentuk encoded dari <script) dan %27or%271 (bentuk encoded dari 'or'1) bekerja dengan logika yang sama.
Yang membedakan Rule 3 dari dua rule sebelumnya adalah ia mendeteksi niat, bukan identitas. Rule 1 memeriksa siapa pengirimnya. Rule 2 memeriksa ke mana mereka pergi. Rule 3 memeriksa apa yang mereka bawa.
Penyerang yang lolos Rule 1 dengan memalsukan User-Agent, dan lolos Rule 2 karena tidak mengincar file sensitif, tetap tertangkap di sini begitu payload SQLi, XSS, LFI, atau perintah RCE seperti shell_exec, passthru, atau base64_decode muncul di URL mereka.
Rule 4 – Block HTTP Method Berbahaya dan Eksploitasi WebDAV
Website normal hanya membutuhkan empat HTTP method: GET, POST, HEAD, dan OPTIONS. Method lainnya hampir tidak pernah muncul di website biasa. Namun penyerang aktif mengeksploitasinya.
Misalnya, TRACE memungkinkan serangan Cross-Site Tracing (XST). Teknik ini bisa mencuri sesi cookie bahkan saat flag HttpOnly sudah aktif. Sementara itu, method WebDAV (PROPFIND, MKCOL, MOVE, COPY, LOCK, dan kawan-kawannya) membuka kemungkinan manipulasi file langsung di server jika konfigurasi Apache atau Nginx Anda bermasalah.
Perlu Anda ketahui: rule ini tidak memblokir DELETE, PUT, dan PATCH karena ketiganya dibutuhkan oleh REST API. Namun bila website Anda bukan REST API, tambahkan ketiga method tersebut ke dalam rule ini untuk proteksi lebih ketat.
Action: Block
(http.request.method eq "TRACE") or
(http.request.method eq "TRACK") or
(http.request.method eq "CONNECT") or
(http.request.method eq "PROPFIND") or
(http.request.method eq "PROPPATCH") or
(http.request.method eq "MKCOL") or
(http.request.method eq "MOVE") or
(http.request.method eq "COPY") or
(http.request.method eq "LOCK") or
(http.request.method eq "UNLOCK") or
(http.request.method eq "SEARCH") or
(http.request.method eq "ORDERPATCH") or
(http.request.method eq "ACL") or
(http.request.method eq "REPORT") or
(http.request.method eq "CHECKIN") or
(http.request.method eq "CHECKOUT") or
(http.request.method eq "UNCHECKOUT") or
(http.request.method eq "MKWORKSPACE") or
(http.request.method eq "MERGE") or
(http.request.method eq "BASELINE-CONTROL") or
(http.request.method eq "MKACTIVITY")
Cara Baca Rule 4
Berbeda dari tiga rule sebelumnya yang memeriksa isi request, Rule 4 memeriksa metode HTTP yang digunakan — field http.request.method. Metode HTTP adalah instruksi yang dikirim klien untuk memberitahu server apa yang ingin dilakukan: GET untuk mengambil halaman, POST untuk mengirim data form. Kondisi di rule ini menggunakan operator eq (equals) bukan contains — artinya pencocokan harus persis sama karakter per karakter, bukan sebagian. Satu metode cocok, request langsung diblokir.
Daftar metode yang diblokir terbagi dua kelompok dengan risiko berbeda.
Kelompok pertama: TRACE dan TRACK — keduanya dirancang untuk keperluan debugging jaringan, namun penyerang memanfaatkannya untuk serangan Cross-Site Tracing (XST) yang bisa mencuri sesi login bahkan saat proteksi HttpOnly sudah aktif. CONNECT berbeda lagi — method ini bisa menjadikan server Anda sebagai proxy tunnel untuk menyembunyikan traffic berbahaya.
Kelompok kedua adalah seluruh keluarga WebDAV: PROPFIND, MKCOL, MOVE, COPY, LOCK, UNLOCK, dan sejenisnya. WebDAV adalah ekstensi HTTP yang memungkinkan manipulasi file langsung di server — fitur yang berguna di lingkungan kolaborasi, namun pada server web biasa yang tidak dikonfigurasi dengan ketat, method-method ini bisa menjadi pintu masuk untuk membuat, memindahkan, atau menimpa file di server.
Yang perlu dipahami adalah website normal tidak pernah membutuhkan satu pun method di daftar ini. Pengunjung membaca halaman dengan GET. Mengisi form dengan POST. Tidak ada skenario legitimate di mana browser pengunjung biasa mengirim PROPFIND atau MERGE ke website Anda.
Maka memblokir seluruh daftar ini tidak akan pernah mengganggu traffic nyata — risikonya nol untuk pengunjung normal, sementara pintu yang ditutup cukup signifikan bagi penyerang.
Rule 5 – Block Upload Webshell dan Eksekusi Backdoor

Rule 5 adalah jaring pengaman terakhir. Andaikata penyerang menemukan celah di plugin upload, form, atau endpoint API Anda dan berhasil memasukkan file berbahaya ke server, Rule 5 memastikan mereka tidak bisa mengaksesnya lewat browser.
Rule ini menangkap dua kategori sekaligus. Pertama, ekstensi PHP alternatif yang penyerang gunakan untuk bypass filter upload: .php5, .phtml, dan .phar. Kedua, file PHP yang muncul di direktori yang seharusnya hanya berisi aset statis seperti /uploads, /images, /media, dan /cache.
Satu catatan penting: kondisi yang menggabungkan direktori dengan .php perlu penyesuaian jika aplikasi Anda secara legitim menempatkan file PHP di direktori tersebut. Untuk instalasi WordPress standar, tidak ada false positive yang perlu Anda khawatirkan.
Action: Block
(lower(http.request.uri.path) contains ".php5") or
(lower(http.request.uri.path) contains ".phtml") or
(lower(http.request.uri.path) contains ".phar") or
(lower(http.request.uri.path) contains ".shtml") or
(lower(http.request.uri.path) contains ".shtm") or
(lower(http.request.uri.path) contains ".php.jpg") or
(lower(http.request.uri.path) contains ".php.png") or
(lower(http.request.uri.path) contains ".php.gif") or
(lower(http.request.uri.path) contains ".asp;") or
(lower(http.request.uri.path) contains ".aspx;") or
(lower(http.request.uri.path) contains "/uploads" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/upload" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/files" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/images" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/media" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/assets" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/cache" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/tmp" and lower(http.request.uri.path) contains ".php") or
(lower(http.request.uri.path) contains "/temp" and lower(http.request.uri.path) contains ".php")
Cara Baca Rule 5
Rule 5 memeriksa http.request.uri.path seperti Rule 2, namun dengan fokus yang berbeda. Bukan mencari file konfigurasi yang tidak sengaja terbuka — melainkan mendeteksi eksekusi file berbahaya yang sengaja ditempatkan penyerang. Daftar kondisinya terbagi dua kelompok. Kelompok pertama memblokir ekstensi PHP alternatif: .php5, .phtml, .phar, .shtml.
Ekstensi-ekstensi ini secara fungsional dieksekusi server sama seperti .php biasa, namun sering lolos dari filter upload yang hanya memblokir ekstensi .php saja. Kelompok kedua menggabungkan dua kondisi sekaligus dengan operator and — misalnya path mengandung /uploads dan sekaligus mengandung .php. Ini menangkap file PHP yang muncul di direktori yang seharusnya hanya berisi gambar dan dokumen statis.
Logika di balik kelompok kedua mencerminkan skenario serangan yang paling umum terjadi. Penyerang yang berhasil mengeksploitasi celah di plugin upload tidak langsung merusak database atau mencuri file.
Langkah pertama mereka adalah menempatkan webshell — file PHP kecil yang memberi mereka akses eksekusi perintah lewat browser. File ini biasanya mereka sembunyikan di folder /uploads, /images, atau /cache dengan nama yang terlihat tidak mencurigakan. Begitu webshell aktif dan bisa diakses, seluruh server ada di tangan mereka. Rule 5 memotong akses itu sebelum webshell sempat merespons satu pun request.
Yang membuat Rule 5 berbeda secara konseptual dari semua rule sebelumnya: ini adalah pertahanan yang berasumsi Rule 1 hingga 4 sudah gagal. Penyerang sudah masuk, sudah meng-upload file, dan sekarang mencoba mengaksesnya. Rule 5 tidak mencegah upload — itu tugas validasi di sisi aplikasi. Rule 5 mencegah eksekusi — memastikan file berbahaya yang sudah terlanjur masuk tetap tidak bisa berjalan. Inilah mengapa rule ini disebut jaring pengaman terakhir, bukan lini pertama.
Studi Kasus: Kami Temukan File PHP Bersembunyi di Folder /uploads Selama Hampir 3 Bulan
Suatu pagi, klien toko online kecil menghubungi kami karena halaman produk melambat dan browser membuka situs asing. Kami segera memeriksa pola redirect serta beban server. Namun, log akses menunjukkan permintaan aneh menuju file berekstensi PHP.
Lalu, kami menelusuri folder /uploads dan membandingkan setiap nama file dengan katalog gambar produk. Kami menemukan skrip PHP kecil yang memakai nama hampir sama dengan foto sandal. Selain itu, cap waktunya menandakan skrip itu bertahan hampir tiga bulan tanpa menarik perhatian.
Setelah itu, kami menghapus skrip, menutup celah unggahan, dan mengganti seluruh kata sandi akses. Kemudian, kami memasang aturan WAF yang menolak eksekusi PHP dari folder /uploads. Aturan itu menghentikan webshell sebelum skrip lain menjalankan perintah server. Akhirnya, website kembali stabil dan klien dapat memeriksa pesanan tanpa redirect asing.
Baca Artikel Terkait Lainnya:
- Cara Membangun Sistem Keamanan Website Berlapis
- Spek Internet untuk Web Developer yang Benar-Benar Cukup Dipakai Seharian
- Bahaya Membuat Web Compro Dengan Hosting Domain Gratis — Risiko yang Jarang Dibicarakan
- App Untuk Membuat Website Compro Yang Mudah Tapi Apakah Itu Pilihan Tepat?
- Checklist yang Dilakukan Saat Maintenance Website
- Harga Jasa Maintenance Website Ini Kisaran Biayanya!
Cara Deploy 5 Rules Ini di Dashboard Cloudflare
Buka dash.cloudflare.com dan pilih domain Anda. Navigasikan ke Security → WAF → Custom Rules, lalu klik Create rule.
Tambahkan setiap rule sesuai nomor urut di atas. Beri nama yang jelas, misalnya Rule 1 - Block Bad Bots agar mudah Anda identifikasi saat mengecek Security Events nanti.
Satu tips yang wajib Anda ikuti sebelum deploy ke production: ganti action Block ke Log terlebih dahulu selama 24–48 jam. Buka Security → Events dan cek request apa saja yang tertangkap. Bila ada traffic legitimate yang ikut terblokir, sesuaikan kondisi rule yang bersangkutan sebelum Anda switch ke Block. Langkah ini mencegah Anda memblokir pengunjung nyata atau sistem internal yang tidak bersalah.
Sebagai catatan dari pengalaman lapangan: beberapa plugin WordPress yang menggunakan curl atau python-requests sebagai bagian dari proses sinkronisasi internal kadang ikut terkena Rule 1. Jadi mode Log itu bukan sekadar anjuran. Ini langkah yang memang perlu Anda lakukan.
HardaWebPro - Web Developer & Digital Marketing
Kami bergerak dalam bidang jasa pembuatan website perusahaan (company profile), foto produk, video produk, pembuatan video company profile. Yuk mulai diskusi project Anda 🙏.
Yang Paling Sering Kami Temui Saat Pertama Kali Mengaktifkan WAF Rule
Kami sering melihat pemilik usaha area Ciledug panik saat fitur utama website mereka secara tiba-tiba macet total. Sayangnya, konfigurasi firewall yang terlalu ketat sering kali menyasar layanan pengiriman otomatis pada toko online. Plugin WooCommerce gagal memproses data.
Masalahnya, sistem keamanan menganggap permintaan lewat library HTTP pihak ketiga sebagai sebuah ancaman siber yang serius. Bot kurir gagal memperbarui status kode pelacakan pengiriman.
Oleh karena itu, kami selalu menyarankan aktivasi mode Log paling awal sebelum menerapkan tindakan pemblokiran penuh. Kami memantau setiap aktivitas trafik yang masuk lewat menu Firewall Events pada dasbor Cloudflare secara teliti.
Teknik ini membawa hasil positif. Lalu, kami membuat pengecualian khusus untuk alamat IP agen jasa kurir yang sempat memicu peringatan sistem. Langkah ini memastikan pelanggan tetap bisa belanja dengan lancar tanpa gangguan aturan keamanan website.
Ringkasan: 5 Rules, 5 Layer Pertahanan
| # | Nama Rule | Action | Ancaman yang Ditutup |
|---|---|---|---|
| 1 | Block Bad Bots & Attack Tools | Block | Reconnaissance & automated scanning |
| 2 | Block Sensitive File Access | Block | Config disclosure & information gathering |
| 3 | Block Attack Payloads | Block | SQLi, XSS, LFI, Path Traversal, RCE |
| 4 | Block Dangerous HTTP Methods | Block | TRACE/XST, WebDAV exploitation |
| 5 | Block Webshell Execution | Block | Post-upload backdoor execution |
Lima rules ini bukan solusi keamanan yang sempurna. Tidak ada sistem yang sempurna. Namun bagi pengguna akun gratis Cloudflare, ini adalah titik awal yang jauh lebih kuat dari pengaturan default.
Penyerang oportunistik yang tidak punya target spesifik biasanya berpindah ke website lain yang lebih mudah setelah beberapa request gagal berturut-turut.
Bila Anda ingin meningkatkan proteksi lebih jauh, pertimbangkan juga mengaktifkan Bot Fight Mode yang tersedia gratis di semua akun Cloudflare melalui menu Security → Bots. Fitur ini bekerja paralel dengan Custom WAF Rules dan menambah satu lapisan pertahanan tanpa menggunakan slot rules Anda. Dokumentasi lengkapnya tersedia di Cloudflare Developers.