一、HTTP洪水攻击概述
HTTP洪水攻击(HTTP Flood)是一种分布式拒绝服务攻击(DDoS),攻击者通过大量伪造的HTTP请求(如GET/POST)淹没目标服务器,耗尽服务器资源(如连接数、CPU、内存),导致正常用户无法访问服务。与CC攻击不同,HTTP洪水攻击更侧重于高频次、低复杂度的请求冲击,攻击流量通常模拟正常用户行为,难以直接过滤。
二、HTTP洪水攻击防护策略
防护的核心目标是区分正常流量与恶意流量,并动态拦截攻击源。常用策略包括:
-
请求频率限制
基于IP或会话(Session)统计单位时间内的请求次数,超出阈值则触发防护动作。 -
浏览器指纹验证
通过JavaScript收集客户端浏览器特征(如User-Agent、Canvas指纹),验证是否为真实浏览器。 -
Cookie挑战
强制客户端执行Cookie验证流程,自动化攻击工具通常无法正确处理动态Cookie。 -
IP信誉库联动
结合实时IP黑名单或第三方威胁情报库,拦截已知恶意IP。
三、HTTP洪水防护的LUA代码实现
以下是一个基于Cookie挑战的防护方案示例,通过动态生成随机Cookie验证客户端合法性。
1. 变量定义与初始化
local uri = ngx.var.uri -- 当前请求路径
local ip_addr = ngx.var.remote_addr -- 客户端IP
local cookie_val = ngx.var.cookie_waf_challenge or "" -- 获取客户端Cookie
local threshold = 100 -- 单位时间(如60秒)内允许的最大请求数
local challenge_expire = 300 -- Cookie有效期(秒)
2. 请求频率统计与拦截逻辑
-- 初始化共享内存(记录IP请求次数) local http_flood = ngx.shared.http_flood -- 统计IP请求频率 local key = "req_count:" .. ip_addr local current_count, err = http_flood:incr(key, 1) if current_count == nil then http_flood:set(key, 1, 60) -- 首次计数,设置60秒过期 elseif current_count >= threshold then -- 触发防护:生成Cookie挑战 local challenge_key = "challenge:" .. ip_addr local challenge_code = http_flood:get(challenge_key) if challenge_code == nil then -- 生成随机Cookie值 local random_str = string.gsub(ngx.md5(ngx.now() .. ip_addr), "%d", "") challenge_code = string.sub(random_str, 1, 12) http_flood:set(challenge_key, challenge_code, challenge_expire) end -- 验证客户端是否携带正确Cookie if cookie_val ~= challenge_code then -- 返回挑战页面 return ngx.exit(ngx.HTTP_FORBIDDEN) else -- 验证通过,重置计数 http_flood:delete(key) http_flood:delete(challenge_key) end end -- 初始化共享内存(记录IP请求次数)
3. 挑战页面(HTML/JS)
当请求频率超限时,返回包含JavaScript的页面,强制客户端完成Cookie验证:
if ngx.status == ngx.HTTP_FORBIDDEN then
ngx.header.content_type = "text/html"
ngx.print([[
<!DOCTYPE html>
<html>
<head>
<title>安全验证</title>
<script>
// 动态设置Cookie并重试
function setChallengeCookie() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/waf/challenge', true);
xhr.onload = function() {
if (xhr.status == 200) {
document.cookie = "waf_challenge=" + xhr.responseText + "; path=/";
location.reload(); // 重载页面以携带Cookie
}
};
xhr.send();
}
window.onload = setChallengeCookie;
</script>
</head>
<body>
<h1>正在执行安全验证,请稍候...</h1>
</body>
</html>
]])
ngx.exit(ngx.HTTP_OK)
end
4. 挑战接口(后端生成Cookie)
添加一个内部接口用于生成动态Cookie值:
location /waf/challenge {
internal;
content_by_lua_block {
local ip_addr = ngx.var.remote_addr
local challenge_key = "challenge:" .. ip_addr
local challenge_code = ngx.shared.http_flood:get(challenge_key)
ngx.print(challenge_code)
}
}
四、防护逻辑说明
-
请求计数
每个IP在60秒内超过100次请求时触发挑战。 -
动态Cookie生成
使用MD5哈希和时间戳生成唯一Cookie值,确保不可预测性。 -
客户端验证
通过JavaScript强制客户端请求挑战接口并设置Cookie,自动化工具通常无法执行此流程。 -
自动重置
验证成功后清除计数和挑战状态,避免误拦截正常用户。
五、优化方向
-
精细化统计
结合URI路径、User-Agent等维度统计请求频率,提升准确性。 -
浏览器指纹增强
集成JavaScript计算Canvas指纹,拦截无头浏览器(Headless Browser)。 -
IP信誉库
对接威胁情报API,实时拦截高风险IP。 -
滑动窗口算法
使用更灵活的滑动窗口替代固定时间窗口,避免阈值突破瞬间的漏判。
六、总结
通过动态Cookie挑战和请求频率限制,该方案可有效缓解HTTP洪水攻击,迫使攻击者付出更高成本(需执行JavaScript并维持Cookie状态)。实际部署时需结合业务特点调整阈值,并通过日志监控持续优化防护策略。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)