( http.request.method ne "GET" and http.request.method ne "HEAD" ) or ( lower(http.request.uri.path) in { "/.env" "/.env.local" "/.env.dev" "/.env.prod" "/.env.production" "/.git/config" "/.git/HEAD" "/.git/index" "/.svn/entries" "/.hg/store" "/.ds_store" "/.htaccess" "/.htpasswd" "/composer.json" "/composer.lock" "/package.json" "/package-lock.json" "/yarn.lock" "/pnpm-lock.yaml" "/id_rsa" "/id_rsa.pub" "/phpinfo.php" "/server-status" "/wp-login.php" "/wp-config.php" "/xmlrpc.php" "/config.php" } ) or ( starts_with(lower(http.request.uri.path), "/wp-admin") or starts_with(lower(http.request.uri.path), "/wp-includes") or starts_with(lower(http.request.uri.path), "/phpmyadmin") or starts_with(lower(http.request.uri.path), "/pma") or starts_with(lower(http.request.uri.path), "/admin") or starts_with(lower(http.request.uri.path), "/cgi-bin") or starts_with(lower(http.request.uri.path), "/.git") or starts_with(lower(http.request.uri.path), "/.svn") or starts_with(lower(http.request.uri.path), "/.hg") ) or ( lower(http.request.uri.path) contains "../" or lower(http.request.uri.path) contains "..%2f" or lower(http.request.uri.path) contains "%2e%2e%2f" or lower(http.request.uri.path) contains "%2f..%2f" or lower(http.request.uri.path) contains "%5c..%5c" ) or ( lower(http.user_agent) contains "sqlmap" or lower(http.user_agent) contains "acunetix" or lower(http.user_agent) contains "nikto" or lower(http.user_agent) contains "masscan" or lower(http.user_agent) contains "nmap" or lower(http.user_agent) contains "zgrab" or lower(http.user_agent) contains "gobuster" or lower(http.user_agent) contains "dirbuster" or lower(http.user_agent) contains "feroxbuster" or lower(http.user_agent) contains "wpscan" ) or ( http.user_agent eq "" or len(http.user_agent) lt 8 )
( (not starts_with(lower(http.request.uri.path), "/api/")) and (not starts_with(lower(http.request.uri.path), "/admin")) and (http.request.method ne "GET" and http.request.method ne "HEAD") ) or ( starts_with(lower(http.request.uri.path), "/api/") and not (http.request.method in { "GET" "POST" "PUT" "PATCH" "DELETE" "OPTIONS" }) ) or ( starts_with(lower(http.request.uri.path), "/api/") and (http.request.method in { "POST" "PUT" "PATCH" }) and not (lower(http.request.headers["content-type"][0]) contains "application/json") ) or ( starts_with(lower(http.request.uri.path), "/admin") and not cf.client.bot ) or ( lower(http.request.uri.path) in { "/.env" "/.env.local" "/.env.dev" "/.env.prod" "/.env.production" "/.git/config" "/.git/HEAD" "/.git/index" "/.svn/entries" "/.hg/store" "/.ds_store" "/.htaccess" "/.htpasswd" "/composer.json" "/composer.lock" "/package.json" "/package-lock.json" "/yarn.lock" "/pnpm-lock.yaml" "/id_rsa" "/id_rsa.pub" "/phpinfo.php" "/server-status" "/wp-login.php" "/wp-config.php" "/xmlrpc.php" "/config.php" } ) or ( starts_with(lower(http.request.uri.path), "/wp-admin") or starts_with(lower(http.request.uri.path), "/phpmyadmin") or starts_with(lower(http.request.uri.path), "/pma") or starts_with(lower(http.request.uri.path), "/cgi-bin") or starts_with(lower(http.request.uri.path), "/.git") or starts_with(lower(http.request.uri.path), "/.svn") or starts_with(lower(http.request.uri.path), "/.hg") ) or ( lower(http.request.uri.path) contains "../" or lower(http.request.uri.path) contains "..%2f" or lower(http.request.uri.path) contains "%2e%2e%2f" or lower(http.request.uri.path) contains "%2f..%2f" or lower(http.request.uri.path) contains "%5c..%5c" ) or ( lower(http.user_agent) contains "sqlmap" or lower(http.user_agent) contains "acunetix" or lower(http.user_agent) contains "nikto" or lower(http.user_agent) contains "masscan" or lower(http.user_agent) contains "nmap" or lower(http.user_agent) contains "zgrab" or lower(http.user_agent) contains "gobuster" or lower(http.user_agent) contains "dirbuster" or lower(http.user_agent) contains "feroxbuster" or lower(http.user_agent) contains "wpscan" ) or ( http.user_agent eq "" or len(http.user_agent) lt 8 ) or ( cf.threat_score gt 20 )
说明
静态区方法锁(第一块)
只对“非 /api 且非 /admin”的页面区生效:静态页面只允许 GET/HEAD。
价值:既保护静态区不被乱 POST,又不会误伤 API/后台这种本来就需要 POST 的区域。
拦截方向:阻断静态区写入探测、框架路由探测、上传尝试。
API 方法白名单(第二块)
只允许常规 REST 方法,阻断 TRACE/CONNECT/PROPFIND 等非常规方法探测。
拦截方向:阻断网关/代理差异探测与奇技淫巧的探测请求。
API 写操作强制 JSON(第三块)
你的 API 写入若规范化为 JSON,这块可以过滤掉大量垃圾表单提交、multipart 上传探测。
拦截方向:阻断“非预期内容类型”的低成本攻击脚本。
后台区挑战(第四块)
not cf.client.bot 的作用是让已识别的“好 Bot”不被挑战;其余访问后台触发挑战/拦截。