首页 > 软件服务 > WEB软件 > 使用NGINX限制指定IP允许POST访问方法以及POST内容记录NGINX日志方法

使用NGINX限制指定IP允许POST访问方法以及POST内容记录NGINX日志方法

WEB软件

一.问题情况

由于程序代码漏洞造成网站被入侵被黑的问题不在少数,但是又由于php的eval函数无法禁止使用,因为程序代码中还有调用.就想到了能否禁止POST上传来限制部分入侵上传.如果网站前台有用到POST方法的话就不要限制了.会影响正常功能.

二.解决办法

服务器使用nginx做web服务提供,就写一个if判断用来限制指定IP可以POST HEAD等操作,其他IP都拒绝.

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段声明一下日志格式

"$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;的端口去.

 

这样所有请求php的日志都会记录到enable-php-post.log里去,POST的数据也会记录下来.还有就是post日志有中文的问题,会被转成\x的十六进制,可以log_format时指定escape=json或者escape=none解码

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