因此,为了防止对我的 phpmyadmin 安装进行暴力攻击,我将 nginx 配置为需要 HTTP Basic Auth(额外的用户名和密码),然后请求需要来自白名单 IP 地址。但是,如果我运行https://example.com/phpmyadmin/但是,如果不添加额外的 .php 块,我可以加载https://example.com/phpmyadmin/index.php无需将我的 IP 列入白名单。此问题不会影响 HTTP Basic Auth。发生这种情况有什么原因吗?有没有办法避免添加额外的 .php 块?phpmyadmin 配置区域的副本如下。
# Setup and secure phpMyAdmin
location /phpmyadmin/ {
allow 1.2.3.4;
deny all;
auth_basic "phpMyAdmin - HTTP Basic Login";
auth_basic_user_file /etc/nginx/pma_pass;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
allow 1.2.3.4;
deny all;
}
}
答案1
在大多数 PHP 配置中,有一个location ~ \.php$
块会处理以 结尾的任何 URI .php
,因此对其他块添加限制location
只会影响所涉及的静态文件。请参阅这个文件了解更多信息。
最干净的解决方案是使用带有^~
修饰符的前缀位置,这可确保所有以 开头的 URI/phpmyadmin/
都由该块处理,并且locations
顶级的其他 URI 不会绕过您的安全性。请参阅这个文件了解更多信息。
正如您所发现的,您需要location
在该块内添加嵌套来处理 PHP,但身份验证语句都应该被继承,并且不需要在内部块中重复。
例如:
location ^~ /phpmyadmin/ {
allow 1.2.3.4;
deny all;
auth_basic "phpMyAdmin - HTTP Basic Login";
auth_basic_user_file /etc/nginx/pma_pass;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}