关于漏洞原理参见 nginx文件类型错误解析漏洞
,最开始是直接把php.ini中设置 cgi.fix_pathinfo = 0想一劳永逸解决。不过后来发现其导致PHP的超全局变量 $_SERVER['PHP_SELF']为空于是有些程序会出错(比如Discuz会拼接出错误图片头像路径)。于是考虑在保持 cgi.fix_pathinfo =1时如何避免漏洞。
网上搜索到的解决办法挺多比如 再提供一种解决Nginx文件类型错误解析漏洞的方法
,因为 ifisEvil
加上正则判断存在漏判问题,所以尝试使用其他方式解决。
经过试验找到一个终极解决办法,用try_files替代if判断文件
try_files $fastcgi_script_name =404;
debug日志中会有类似判断
*308 trying to use file: "/robots.txt/a.php" "/var/htdoc/mychery.net/robots.txt/a.php"
之前在网上搜索到一个办法,经过测试是无效的
try_files $request_filename =404; #无效的用法!
debug日志如下,判断路径重复拼接是错误的
*339 trying to use file: "/var/htdoc/mychery.net/robots.txt/a.php" "/var/htdoc/mychery.net/var/htdoc/mychery.net/robots.txt/a.php"
可以把正确的判断命令加入到fastcgi.conf中:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
try_files $fastcgi_script_name =404;
然后在location中引用它:
location ~ \.php$ {
fastcgi_pass unix:/tmp/phpfpm/php-fpm.sock;
include fastcgi.conf;
}
另外,nginx官方推荐使用try_files替代if相应功能。
分享到:
相关推荐
nginx-1.18.0-1.el7.ngx.x86_64 nginx离线安装包 免积分下载 centos亲测可用 免积分,不像博客中一部分人高积分下载下来没有用。
2022年5月30日 官方当前最新稳定版本nginx 二进制rpm包 适用于x86架构centos7 rhel7版本操作系统升级安装nginx 该包开启了ipv6支持,添加了nginx-rtmp模块支持
nginx-1.8.0-1.el6.ngx.x86_64.rpm libpcre.so.0()(64bit) 被 nginx-1.18.0-1.el6.ngx.x86_64 需要
nginx_1.7.11.3_Gryphon主要用于媒体直播服务器用,和FFmpeg+nginx+实例视频
linux下的nginx--rpm安装包
nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package for centos7 nginx rpm package ...
1.nginx.conf配置listen端口(默认和iis 80冲突) 2.php里php.ini要去掉分号 ;cgi.fix_pathinfo=1 3.修改start_nginx.bat路径 4.运行start_nginx.bat开启nginx服务 5.运行 stop_nginx.bat关闭nginx服务
nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm安装包(含有部署手册) nginx-1.18.0-2.el7.ngx.x86_64.rpm...
nginx-1.20.0-1.el7.ngx.x86_64
很难找的 centos7 nginx-1.6.2-1.el7.centos.ngx.x86_64.rpm 包
Centos7.6.1810离线安装Nginx-所需依赖包 1、patch命令:patch-2.7.1-12.el7_7.x86_64.rpm 2、zlib-1.2.12.tar.gz 3、zlib-devel-1.2.7-20.el7_9.x86_64.rpm 4、pcre-8.32-17.el7.x86_64.rpm 5、pcre-devel-8.32-17....
nginx下载
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...
在完全无互联网连接的情况下,离线安装nginx。 nginx版本号:nginx-1.20.1-2.el7.x86_64 食用方法: 1.解压 2.进入解压目录 3.rpm安装全部 4.安装完成
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。 安装方法(进入Nginx源码目录): #patch -p0 < /path/to/this/directory/jvm_route.patch # ./configure -...
nginx-1.16.1-1.el6.ngx.x86_64.rpm nginx 最新版 nginx-1.16.1-1.el6.ngx.x86_64.rpm nginx 最新版
nginx-1.10.0-1.el6.ngx.x86_64.rpm 适用于redhat el6
CentOS下nginx服务安装包,直接yum即可完成安装。Nginx (engine x) 是一个高性能的HTTP和web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рам...
nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm文件 nginx-1.22.1-1.sles12.ngx.x86_64.rpm...
nginx with rtmp module rpm 安装包,免依赖,一键安装, 支持centos7.x。