NGINX - 为什么我可以绕过密码验证?

时间:2016-06-01 11:03:24

标签: .htaccess nginx .htpasswd apache-utils

我有一台NGINX服务器,我使用Apache-utility来实现密码要求(.htpasswd)。它一切正常。以下这项工作很好:

example.com/admin
example.com/admin/
example.com/admin/index

...但 当我输入example.com/admin/index.php并且根本不输入任何密码并按" abort"服务器显示index.php(没有任何CSS或JS文件)。我认为我的PHP-FPM就是问题所在。请看一下:

location / {
    try_files $uri $uri.html $uri/ @extensionless-php;
    index index.html index.htm index.php;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

location /admin {
    auth_basic "Restricted";
    auth_basic_user_file /admin/.htpasswd;
}

location ~ \.php$ {
    fastcgi_pass            127.0.0.1:9000;
    include                 fastcgi_params;
    fastcgi_param           SCRIPT_FILENAME $document_root$
}

1 个答案:

答案 0 :(得分:1)

查看问题中的最后两个位置:

location ^~ /admin {
    auth_basic "Restricted";
    auth_basic_user_file /admin/.htpasswd;

    location ~ \.php$ {
        fastcgi_pass  127.0.0.1:9000;
        include       fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

location ~ \.php$ {
    fastcgi_pass  127.0.0.1:9000;
    include       fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

添加^~修饰符使location ^~ /admin块优先于其他正则表达块(特别是现有的location ~ \.php$块)。因此,身份验证规则统一应用于以/admin开头的任何URI。有关详细信息,请参阅this document

为了避免破坏PHP,location ~ \.php$块中的location ^~ /admin块会重复,以处理以/admin开头并以.php结尾的URI。