日志中出现 /?_=1676277219011 的请求,后面13位数是时间戳,大量的请求导致后端php资源池耗尽从而报502错误。
现通过nginx拦截这些恶意请求。
开始用location拦截,过滤参数,发现这样是错误的。
原因是 location 不能拦截参数,因为location是根据uri处理的,uri不包含参数部分。
先看下 $request_uri 和 $args 两个内置变量的值
location / { return 200 $request_uri; }
访问结果:/test.html?id=1&time=1676277219011
location / { return 200 $args; }
访问结果:id=1&time=1676277219050
2种拦截思路:
# 这个是拦截请求参数中以13位数字结尾的
if ($args ~ "[0-9]{13}$") { return 403; }
# 这个是拦截请求路径为 /?_=带13位数字结尾的
if ($request_uri ~* "^/\?_=[0-9]{13}$") { return 403; }
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/5155.html