我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文中,苏南大叔来说一下nginx401授权调试的过程。当然,本调试过程不一定适合你的问题,但是苏南大叔相信,可能还是会给你一定的启迪的。

苏南大叔:nginx401授权后,如何解决php源码泄漏的问题? - nginx-401-php
nginx401授权后,如何解决php源码泄漏的问题?(图3-1)

本文测试环境:宝塔面板@7.5.2nginx@1.18.0php@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即可。

苏南大叔:nginx401授权后,如何解决php源码泄漏的问题? - nginx-401-code
nginx401授权后,如何解决php源码泄漏的问题?(图3-2)

调试问题二:登录框和html同时出现

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

苏南大叔:nginx401授权后,如何解决php源码泄漏的问题? - nginx-401
nginx401授权后,如何解决php源码泄漏的问题?(图3-3)

解决方案嘛,就是调整拦截规则了。

调试问题三:匹配到目录有问题

苏南大叔做了两个匹配,分别是:

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字样!!!!很有可能变成7481等等字样!!!配置错误的话,效果就是:所有页面都正常显示,但是特殊的页面(比如上边的登陆页面)显示502错误。

主要的目的就是:匹配到特定目标php文件后,先发出状态码401,然后验证成功后,再转发到php进行处理。

相关链接

总结

在本文的内容中,虽然成功了实现了目标。但是,解决方式却不是太优美。这里,如果大家有更好的方案的话,欢迎给苏南大叔留言。更多博客文章,请参考下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   nginx