Nginx过滤hash ddos攻击的方法

发布时间:2020-06-13编辑:脚本学堂
Nginx过滤hash ddos攻击的方法

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版本了,否则一系列的版本升级,也够呛.

代码段:

复制代码 代码如下:
ngx.req.read_body()
 
local method   = ngx.var.request_method
local max_count= 300
 
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
    --else
    --    ngx.redirect('/post-error')
    end
end

问题:过滤脚步好像有问题,对POST的数据体,如果说用户提交的是文件等,里面可能会包含大量的&字符,该过滤方法不完善
回复:这位朋友指出的是,针对这种上传文件,且文件内包含众多&符号的情况,此过滤会影响到文件上传,此种情况应该是少见的。
    不过安全的限制程度总是会影响其他,若出现这种情况,可以将get_body()函数换成request_uri进行统计。

本文转自: http://www.mysqlops.com/2012/04/01/nginx%E8%BF%87%E6%BB%A4hash-dos.html