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


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


通常



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


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

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

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

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



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


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

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

Share:

0 Comments:

コメントを投稿