一.问题情况
由于程序代码漏洞造成网站被入侵被黑的问题不在少数,但是又由于php的eval函数无法禁止使用,因为程序代码中还有调用.就想到了能否禁止POST上传来限制部分入侵上传.如果网站前台有用到POST方法的话就不要限制了.会影响正常功能.
二.解决办法
服务器使用nginx做web服务提供,就写一个if判断用来限制指定IP可以POST HEAD等操作,其他IP都拒绝.
1 2 3 4 5 6 7 8 9 10 |
set $test 0; if ($request_method !~* GET) { set $test "${test}1"; } if ($remote_addr !~* "(192.168.0.2)") { set $test "${test}2"; } if ($test = "012") { return 403; } |
set $test 0;设置一个变量$test初始数值0
$request_method !~* GET判断请求类型不是GET则set $test "${test}1"给$test数值追加1
$remote_addr !~* "(192.168.0.2)"判断IP不为192.168.0.2则set $test "${test}2"给$test数值追加2
最后判断$test是否为012,如果是则返回403.这样就只有192.168.0.2这1个IP可以正常POST数据了.
如果想记录POST到nginx日志,首先去http段声明一下日志格式
1 2 3 |
log_format post '$remote_addr - $remote_user [$time_local] "$request" "$request_body" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; |
"$request_body"就是POST内容的变量了,但是这个变量只有在fastcgi_pass和proxy_pass下面才能生效,也可以安装lua模块直接调用,方法百度就不介绍了
由于"$request_body"无法直接使用,所以写的全局access_log只能输出fastcgi_pass的php执行或者是proxy代理的下面POST的数据,如果想对不经过fastcgi_pass和proxy_pass的也输出POST内容到日志的话,省事就装lua,或者直接对要输出的目录做一次proxy_pass代理.
结合上面我们设置了只允许的IP的POST,我们想输出不允许的IP的POST内容到日志方便进行检查,可以把if ($test = "012")写入php执行下面然后proxy_pass到一个return 403;的端口去.
1 2 3 4 5 6 |
server{ listen 8080; server_name _; return 403; access_log off; } |
1 2 3 4 5 6 7 8 9 10 11 |
location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fastcgi.conf; if ($test = "012") { proxy_pass http://127.0.0.1:8080; } access_log /home/wwwlogs/enable-php-post.log post; } |
这样所有请求php的日志都会记录到enable-php-post.log里去,POST的数据也会记录下来.还有就是post日志有中文的问题,会被转成\x的十六进制,可以log_format时指定escape=json或者escape=none解码
1 2 3 |
log_format post escape=json '$remote_addr - $remote_user [$time_local] "$request" "$request_body" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; |
nginx的1.11.8版本及以上可以用上面的方式,以下的版本直接在location部分里面log_escape_non_ascii off;
这种转码好像对UTF-8可以,GBK的字符转码后还是乱码,需要用iconv再次转一下中文编码.
参考:https://www.cnblogs.com/meteorx/p/3188647.html
参考:https://blog.csdn.net/qq_26010491/article/details/81068908