0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MVCフレームワークでRequest_URLとRequire envでアクセス制御するときの注意点

Posted at
apache

apacheconfまたは.htaccessでRequest_URIに基づいてSetEnvIfで環境変数でフラグを立てて、Requireでホワイトリスト判定しているのに拒否される。

通常

SetEnvIf Request_URI {ロケーション} Requireでロケーションで判定するシンプルな例

apacheconf
# http://host/path/to/location でリクエスト

# ロケーションにマッチして環境変数をフラグする
SetEnvIf Request_URI /path/to/location allowed_location

# Requireでフラグを判定して許可
Require env allowed_location

MVCフレームワーク下におけるリダイレクト影響

Webフレームワーク+apache環境ではだいたいmod_rewriteを使った次のコードスニペットが公開されている。

apacheconf
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
# => http://host/index.php?_url=/path/to/location にインターナルリダイレクトする

原因

上記インターナルリダイレクトでconfの再評価が入るとロケーションが一致しなくなる。

# http://host/index.php?_url=/path/to/location でリクエスト

# ロケーションにマッチしないので環境変数をフラグしない
SetEnvIf Request_URI /path/to/location allowed_location

# Requireでフラグを判定して拒否
Require env allowed_location

対策

リダイレクト後のロケーションもフラグメントするのではさすがに不毛だわ

SetEnvIf Request_URI /path/to/location allowed_location
# リダイレクト後のロケーションもフラグメント
SetEnvIf Request_URI /index.php?_url=/path/to/location allowed_location

# Requireでフラグを判定して拒否
Require env allowed_location

結論

mod_rewriteによるリダイレクトでは、前回評価で定義した環境変数がREDIRECT_プレフィックス付きでREDIRECT_{環境変数}のように引き継がれるので、
RequireREDIRECT_{環境変数}を追加して、本来のユーザリクエストに基づく評価結果をもって通過させる。

# リダイレクト再入ではマッチしない
SetEnvIf Request_URI /path/to/location allowed_location

# が、RequireでREDIRECT_allowed_locationを評価して許可
Require env allowed_location REDIRECT_allowed_location
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?