基于Cookie实现CloudFlare HMAC验证 绕过WAF对管理员的误拦截
实现方案
核心问题解决:读取单个Cookie值
Cloudflare 防火墙语言原生支持直接提取指定Cookie的取值,无需手动解析完整Cookie字符串,语法为 http.cookie["你的Cookie名称"],可直接在校验函数中调用。
完整实现步骤
1. 服务端签发认证Cookie
首先在你的应用管理面板完成ACL认证后,按你设计的逻辑签发HMAC令牌Cookie,参考PHP实现代码:
// 配置项 $hmacSecret = '你自定义的高强度随机密钥,需和Cloudflare端配置完全一致'; $tokenValidSec = 86400; // 令牌有效期,单位秒,此处设为24小时 $expireTimestamp = time() + $tokenValidSec; // 取真实用户IP,若服务器前置Cloudflare,建议使用 $_SERVER['HTTP_CF_CONNECTING_IP'] 取IP $userRealIp = $_SERVER['REMOTE_ADDR']; // 生成符合规则的令牌 $rawHash = hash_hmac('sha256', $userRealIp . $expireTimestamp, $hmacSecret, true); $token = $expireTimestamp . '-' . base64_encode($rawHash); // 写入Cookie,建议做权限限制避免泄露 setcookie( 'admin_auth_token', $token, $expireTimestamp, '/admin/', // 仅管理面板路径携带Cookie,缩小泄露范围 'your-domain.com', // 替换为你的实际域名 true, // 仅HTTPS传输 true // 禁止JS读取,防范XSS窃权 );
2. 配置Cloudflare放行规则
在Cloudflare防火墙规则中新增一条优先级最高的规则,动作选择「跳过WAF检测」,规则表达式参考如下:
# 先匹配管理面板的域名、路径范围,避免误放行其他业务 http.host eq "admin.your-domain.com" and http.request.uri.path starts with "/" # 确认Cookie存在 and http.cookie exists "admin_auth_token" # HMAC校验,参数顺序依次为:密钥、令牌字符串、校验消息、有效期、哈希算法、时间戳长度、分隔符 and is_timed_hmac_valid_v0( "和PHP端完全一致的HMAC密钥", http.cookie["admin_auth_token"], ip.src, 86400, "sha256", 10, "-" )
参数说明:10为Unix时间戳的长度(2030年前均为10位),最后一个参数
-为你令牌中时间戳和哈希的分隔符,与你生成逻辑对应即可。
3. 规则优先级设置
将该放行规则调整至所有WAF拦截规则的最顶端,确保校验通过的请求直接跳过后续所有WAF检测逻辑,不会触发误拦截。
额外优化建议
- 令牌有效期建议最长不超过7天,用户重新登录时自动刷新令牌,降低泄露风险
- 可额外加URI路径匹配条件,仅放行管理面板相关路径的请求,进一步缩小规则作用范围
- HMAC密钥需定期更换,且不要泄露到代码仓库等公开位置
内容的提问来源于stack exchange,提问作者Tyler V.
相关产品推荐
相关产品推荐

