基于查询字符串的Apache权限

时间:2013-02-01 14:06:55

标签: 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>

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

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

对于身份验证我们使用的是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>

3 个答案:

答案 0 :(得分:10)

您可以阅读here

  

&lt; Location&gt;,&lt; LocationMatch&gt;,&lt; Directory&gt;和&lt; DirectoryMatch&gt;   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>

答案 1 :(得分:2)

没有重写,有一种更简单的方法可以做到这一点。

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

<LocationMatch "^/foo/api.php">
  <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" >
       Order Allow,Deny
       Allow from All
  </If>
</LocationMatch>

答案 2 :(得分:-2)

我们不能使用words = ["Daniel","Nashyl","Orla", "Simone","Zakaria"] for word in words: print word[:1] ,但不支持

<If %{QUERY_STRING} /a=b/>

RewriteEngine On

RewriteCond %{QUERY_STRING} test=ok

RewriteRule ^/ - [E=checkParamTest:1]

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