13

我有一个需要身份验证的 apache 服务器,但是有些调用需要允许所有人使用。

关闭这些调用基于查询字符串,例如:

/foo/api.php?Token=123&Task=DoStuff&Result=json

我用 LocationMatch 教过这会起作用,所以我制定了这个配置:

<LocationMatch ^/foo/api.php\?.*(Task=DoStuff).*>
    Order Allow,Deny
    Allow from All
</LocationMatch>

但这并不能让我通过身份验证(这意味着我得到了 401)。如果我只是过滤^/foo/api.php,我会通过身份验证,但这还不够严格。

任何人都知道如何配置它以检查查询字符串中的 Task 参数?

对于身份验证,我们使用的是 kerberos,这是在整个站点上强制执行的 这是我们用于遏制的 conf

LoadModule auth_kerb_module modules/mod_auth_kerb.so

<Directory /var/www/html>
  Options FollowSymLinks
  AllowOverride All
  AuthType Kerberos
  Require valid-user
  AuthName "Kerberos Login"
  KrbMethodNegotiate on
  KrbMethodK5Passwd on
  KrbAuthRealms FOO.LOCAL
  KrbServiceName HTTP/server.foo.local@foo.LOCAL
  Krb5KeyTab /etc/httpd/conf/http.keytab
  Satisfy Any
  Order deny,allow
  Deny from all
  Allow from 192.168.72.90
  Allow from 192.168.72.91
  Allow from 192.168.72.94
  Allow from 192.168.72.95
  Allow from 127.0.0.1
</Directory>
4

3 回答 3

10

你可以在这里阅读:

<Location>、<LocationMatch>、<Directory> 和 <DirectoryMatch> Apache 指令允许我们将身份验证/授权应用到具有高度特异性的特定资源模式,但不让我们控制查询字符串水平

因此,您必须使用mod_rewrite来实现您的目标。
例如:

RewriteEngine on
RewriteCond %{QUERY_STRING} Task=DoStuff
RewriteRule ^/foo/api.php - [E=no_auth_required:1]

<LocationMatch ^/foo/api.php>
      Order allow,deny
      Allow from env=no_auth_required
      AuthType Basic
      AuthName "Login Required"
      AuthUserFile /var/www/foo/.htpasswd
      require valid-user
      Satisfy Any
</LocationMatch>

更新

你已经说过:

如果我只是过滤 ^/foo/api.php 我通过了身份验证,但这还不够严格。

然后,尝试将以下行添加到您的配置中:

RewriteEngine on
RewriteCond %{QUERY_STRING} Task=DoStuff
RewriteRule ^/foo/api.php - [E=no_auth_required:1]

<LocationMatch ^/foo/api.php>
      Order allow,deny
      Allow from env=no_auth_required
</LocationMatch>
于 2013-02-04T21:55:54.723 回答
6

在 Apache 2.4中,有一种更简单的方法可以做到这一点,而无需重写。

您可以使用LocationMatch来匹配QUERY_STRING,然后使用If块来匹配QUERY_STRING. 即,像这样:

<LocationMatch "^/foo/api.php">
  <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" >
       Require all granted
  </If>
</LocationMatch>
于 2016-10-26T23:11:48.327 回答
-2

我们不能使用<If %{QUERY_STRING} /a=b/>,< apache 2.4 不支持

RewriteEngine On

RewriteCond %{QUERY_STRING} test=ok

RewriteRule ^/ - [E=checkParamTest:1]

<LocationMatch "^/"> Order allow,deny Allow from env=checkParamTest Satisfy any </LocationMatch>

<Location /> AuthType openid-connect Require valid-user ... </Location>

于 2019-01-17T13:08:50.840 回答