【问题标题】:.htaccess basic auth combined with ip restriction.htaccess 基本身份验证与 ip 限制相结合
【发布时间】:2016-10-05 18:30:09
【问题描述】:

我想使用 .htaccess 配置阻止来自我的站点的路径。这个想法是,在使用基本身份验证进行身份验证后,只有一组特定的 IP 可以从 URL 访问该特定路径。

注意:这是一个路径,而不是页面或目录。我们正在尝试屏蔽 Web 服务,因此只有对 URL 的 post 调用。

我希望阻止 URL example.com/rest 以及基于 IP 的 URL 后面的所有内容。所以example.com/rest/fooexample.com/rest/foo/bar应该被屏蔽。

来自应用程序的所有其他路径应保持正常运行且无需基本身份验证。

IP 屏蔽部分在我之前问过的question 中已经解决了。

基本配置(阻塞部分,.htaccess 中有更多内容但与本题无关。)您可以在下面找到。

SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
# Check on what subdomain we are.
SetEnvIf Host ^local\. None_Prod_Env

# Static
SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host
# Range
SetEnvIf AH_CLIENT_IP ^123\.123\.123\. Allow_Host

Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=Allow_Host
Allow from env=None_Prod_Env

所以上面的配置阻止了对 /rest/* 的所有访问,但不阻止对非 rest 路径的访问,它允许来自 IP X 的用户(Allow_Host 变量)并且在这种情况下我们不允许本地生产环境。

我尝试使用基本身份验证来扩展此功能,如下所示:

SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
SetEnvIfNoCase Request_URI "/rest(/.*)?$" require_auth=true

# ... Allow Host stuff and none prod stuff ...

Order deny,allow
Deny from all
Allow from env=!rest_uri
Allow from env=Allow_Host
Allow from env=None_Prod_Env

AuthName "Password Protected"
AuthType Basic
AuthBasicProvider file
AuthUserFile /var/www/html/.htpasswd
Require valid-user

但是,这会导致所有页面都进行基本身份验证,而不仅仅是 /rest/* url。我玩了很多,但无法弄清楚。将 SetEnvIfNoCase 更改为 SetEnvIf 也没有帮助。

注意:我们的服务器运行的是 apache 2.2.22。

【问题讨论】:

    标签: php apache .htaccess mod-rewrite drupal-7


    【解决方案1】:

    您可以使用几个 Apache 指令的组合来解决这个复杂的问题,例如 mod_dirmod_setenvmod_auth_basic

    SetEnvIf Request_URI ^/rest(/.*)?$ rest_uri
    # Check on what subdomain we are.
    SetEnvIf Host ^local None_Prod_Env
    
    # Static
    SetEnvIf AH_CLIENT_IP ^123\.123\.123\.123$ Allow_Host
    # Range
    SetEnvIf AH_CLIENT_IP ^192\.168\. Allow_Host
    
    RewriteEngine On
    
    # block if request is /rest/* and IP is not whitelisted and not localhost
    RewriteCond %{ENV:rest_uri} =1
    RewriteCond %{ENV:None_Prod_Env} !=1
    RewriteCond %{ENV:Allow_Host} !=1
    RewriteRule ^ - [F]
    
    # ask auth for /rest/* && NOT localhost && whitelist IP
    AuthType Basic
    AuthName "Password Protected"
    AuthUserFile /var/www/html/.htpasswd
    Require valid-user
    
    Order deny,allow
    Deny from all
    Allow from env=!rest_uri
    Allow from env=!Allow_Host
    Allow from env=None_Prod_Env
    Satisfy any
    

    【讨论】:

      【解决方案2】:

      尝试将satisfy any 添加到您的代码中。试试这个方法。

      SetEnvIf Request_URI "/rest(/.*)?$" rest_uri
      SetEnvIf Referer "^http://local\.example\.com/" None_Prod_Env
      
      AuthName "Password Protected"
      AuthType Basic
      AuthBasicProvider file
      AuthUserFile /var/www/html/.htpasswd
      Require valid-user
      
      Order deny,allow
      Deny from all
      Allow from env=!rest_uri
      Allow from env=Allow_Host
      Allow from env=None_Prod_Env
      Satisfy any
      

      【讨论】:

      • 这将使它部分工作,它会在不在白名单 IP 上时显示身份验证屏幕,但如果您在白名单 IP 上,它不会显示身份验证,它应该这样做。
      • 所以你想要认证和有效的IP?你可以试试Satisfy all
      • 用户应该在白名单 IP 上并成功通过身份验证,或者当他在 local.example.com/rest 上时,他可以绕过身份验证和 IP 限制。第一部分目前更为重要。
      • 我更新了答案。看看这是否有效。您可能需要检查推荐人是否需要。
      猜你喜欢
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多