nginx过滤hash ddos攻击的方法,用的着的可以参考。
上段时间的各语言hash绝对印象深刻吧,做网站的几乎都在此类,不论你是用的是php,python还是ruby都不同程度受到影响, PHP尤其明显,因为PHP用的人也多嘛,攻击方式简直简单到不行,有兴趣的可以找我索取此测试脚本,一个终端随便搞挂一台有次漏洞的PHP站点.
我们http请求都是通过nginx反向代理,所以优势是可以在nginx这一层对请求做很多逻辑,此次防hash dos就是这个架构.
原理是过滤post请求中超过指定参数数量的请求, 我的是300,可自己调整,应该没有http开发者在使用post方法的时候有超过这个参数值的了,所以不会影响正常请求.
之前有哥们自己写ngx的C模块,使用的也是这个原理,不过NGX模块开发复杂度是有的,因为自己C也看不熟练,还是自己用lua写,方便快捷,简洁明了.
#配置依赖ngx-lua模块
好,废话不多说,贴上nginx的配置:
>>cat post-limit.lua
ngx.req.read_body()
local method = ngx.var.request_method
local max_count= 300 –post最大参数
if method == ‘POST’ then
local data = ngx.req.get_body_data()
if data then
local count = 0
local i = 0
while true do
if count > max_count then
–ngx.redirect(‘/post-error’)
ngx.exit(ngx.HTTP_BAD_REQUEST)
end
i = string.find(data, ‘&’, i+1)
if i == nil then break end
count = count + 1
end
end
end
>> cat nginx.conf
…..
server {
client_body_buffer_size 20m;
client_max_body_size 20m;
access_by_lua_file /opt/conf/nginx/lua/post_limit.lua;
}
…..
nginx其他配置已隐去.
nginx 1.0.XX结合后端PHP应用测试通过,配置也适用其他开发语言的http应用.
有时间可以慢慢升级你的后端应用PHP版本了,否则一系列的版本升级,也够呛.
代码段:
问题:过滤脚步好像有问题,对POST的数据体,如果说用户提交的是文件等,里面可能会包含大量的&字符,该过滤方法不完善
回复:这位朋友指出的是,针对这种上传文件,且文件内包含众多&符号的情况,此过滤会影响到文件上传,此种情况应该是少见的。
不过安全的限制程度总是会影响其他,若出现这种情况,可以将get_body()函数换成request_uri进行统计。
本文转自: http://www.mysqlops.com/2012/04/01/nginx%E8%BF%87%E6%BB%A4hash-dos.html