nginx401授权后,如何解决php源码泄漏的问题?
发布于 作者:苏南大叔 来源:程序如此灵动~
本文中,苏南大叔来说一下nginx的401授权调试的过程。当然,本调试过程不一定适合你的问题,但是苏南大叔相信,可能还是会给你一定的启迪的。

本文测试环境:宝塔面板@7.5.2,nginx@1.18.0,php@7.3。主要目标是保护某个目录下面的文件,不被非法访问。本文代码基于部分基于宝塔面板,但是基本原理都是一样的。大家请辩证的看待本文的内容,根据实际情况修改你的代码。
目录保护
首先,第一步是得到一个加密字符串证书文件。命令行范例如下:
printf "yourname:$(openssl passwd -crypt yourrealpassword)\n" >>/yourpath/yourpassword.pass其次,是配置nginx站点配置,添加auth相关配置。这里以保护admin目录为例:
location ~ /admin {
auth_basic "who are you";
auth_basic_user_file /yourpath/yourpassword.pass;
}这部分详细的设置过程,请参考下面的链接:
上述内容是本文的背景资料,接下来就是本文的正文。
调试问题一:任何密码都可以进入
在提示的使用过程中,偶尔苏南大叔发现:输入了错误的密码,居然也可以过。这个问题,简直是巨大的问题。
后来经过调试,发现是记录密码的证书文件的路径配置错了,就是说auth_basic_user_file配置错了,修改之后再重启nginx即可。

调试问题二:登录框和html同时出现
显示401登陆框的同时,页面没带css的html也显示了。(正常应该显示空白)。效果就是丢失了样式表的页面。这种情况的话,就是:对于地址栏里面的url没有拦截到,而把所有的静态资源请求都拦截到了。所以,页面整体加载了,但是对样式表等的请求失败,所以,多次跳出401登录框(页面上加载了多个静态资源)。

解决方案嘛,就是调整拦截规则了。
调试问题三:匹配到目录有问题
苏南大叔做了两个匹配,分别是:
location ~* \/admin\/{
}
location = /admin/login.php {
}正则表达式写的不好,所以,这里的规则实际上写的是有待改进的,大家有好的写法可以留言给我。
前者~* \/admin\/可以匹配到所有的静态资源,比如css文件等,却匹配不到.php文件。接下来想想看的话,在nginx配置文件里面,确实有对.php文件进行单独处理。
所以,对于后台目录保护来说,又单独配置了第二个匹配项目/admin/login.php。后台的其他页面,在没有登陆的情况下,会自动跳转到login.php,而login.php又在这里做了单独的配置,所以,理论上是没有问题风险的。
调试问题四:php文件无法执行,源码泄漏
php文件无法被执行,大问题大事故,login.php源码被下载到本地。所以,对于第二条匹配规则,需要做了新的修改。类对于.php文件的location设置,还需要在验证成功后,转到php进行处理。
location = /admin/login.php {
auth_basic "who are you";
auth_basic_user_file /yourpath/yourpassword.pass;
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-73.sock;
fastcgi_index index.php;
include fastcgi.conf;
include pathinfo.conf;
}这里的对.php的配置处理,是从宝塔面板的enable-php-73.conf文件里面复制出来的。上面的配置文件,还需要您根据实际情况进行处理。千万不要随便复制上面的代码,请分析一下,根据您的实际情况进行修改。特别注意:
unix:/tmp/php-cgi-73.sock中的73字样!!!!很有可能变成74或81等等字样!!!配置错误的话,效果就是:所有页面都正常显示,但是特殊的页面(比如上边的登陆页面)显示502错误。
主要的目的就是:匹配到特定目标php文件后,先发出状态码401,然后验证成功后,再转发到php进行处理。
相关链接
- https://newsn.net/say/nginx-401.html
- https://newsn.net/say/mac-nginx-apache-2.html
- https://newsn.net/say/nginx-403-selinux.html
总结
在本文的内容中,虽然成功了实现了目标。但是,解决方式却不是太优美。这里,如果大家有更好的方案的话,欢迎给苏南大叔留言。更多博客文章,请参考下面的链接: