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で認証に合格しますが、これは十分に厳密ではありません。

クエリ文字列のタスクパラメータをチェックするようにこれを構成する方法を知っている人はいますか?

ケルベロスを使用している認証の場合、これはサイト全体に強制されますこれは縁石の設定です

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使用して の内容を一致させることができます。つまり、次のようなものです。IfQUERY_STRING

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