基于查询字符串的Apache权限

Fre*_*iek 11 apache configuration kerberos

我有一个需要身份验证的apache服务器,但是有些调用需要被允许.

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

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

我教过一个使用LocationMatch,这可以工作,所以我计算出这个配置:

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

但这不允许我通过身份验证(意思是我得到401).如果我只是过滤^/foo/api.php我通过身份验证,但这不够严格.

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

对于身份验证,我们使用kerberos,这是强制在整个网站这是我们的路边遏制

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>
Run Code Online (Sandbox Code Playgroud)

小智 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>
Run Code Online (Sandbox Code Playgroud)

UPDATE

你说过:

如果我只是过滤^/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>
Run Code Online (Sandbox Code Playgroud)


小智 6

在 Apache 2.4 中,有一种更简单的方法无需重写即可完成此操作。

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

<LocationMatch "^/foo/api.php">
  <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" >
       Require all granted
  </If>
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)