LimitによるGET,POST制限を特定ディレクトリのみ制限解除
2015/01/24
CMSなどのシステムを利用しているとシステム内部で認識されるURLで、
コンテンツが提供されます。当サイトのWordPressでも同じです。
CMSなどでアクセス制御を行う際に.htaccessを利用する場合、
ルートディレクトリに対してアクセス制限などを記述することでしょう。
その為、実在しないディレクトリ(CMSにのみ認識される)へは.htaccessは配置できません。
こうした環境で困るのが<Limit>ディレクティブによる、
特定メソッドを制限したいような場合です。
ここでご紹介する内容は、
システム全体はGETやPOSTを制限し、特定のURLのみPOSTを可能にする手順です。
Limitを利用した特定の HTTP メソッド制限
Limitディレクティブを利用したアクセス制限で、
GETやPOSTに関しての制限を記述できることはご存知でしょう。
<Limit> ディレクティブ|core – Apache HTTP サーバ (抜粋引用)
<Limit> ディレクティブ
説明: 囲いの中にあるアクセス制御の適用を特定の HTTP メソッドのみに 制限する 構文: <Limit method [method] … > … </Limit> コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: All ステータス: Core モジュール: core
このディレクティブは.htaccessに記述することが認められていますので、
サーバーで利用が許可されている場合には、.htaccessから利用できます。
基本記述例
詳細は以下でご紹介しています。
基本的な記述は以下のようになります。
1 2 3 4 5 |
<Limit POST> order deny,allow deny from all allow from 119.107.192.0/18 </Limit> |
ですが、ここで困ったことになります。
.htaccessファイルはディレクトリごとに配置することができ、
ディレクトリ独自に設定を変えたい場合には、
そのディレクトリ内にも.htaccessファイルを配置し、新たな設定を記述します。
そう、ディレクトリが存在していれば・・・。
ディレクトリが存在しないから表示されるコンテンツ
WordPressなどCMSを利用した場合にはディレクトリが存在しないことも多いはずです。
※WordPressで言えば逆に存在しないことがコンテンツ表示の必須条件です。
WordPressが設定する.htaccessには以下のようになっていることと思います。
1 2 3 4 5 6 7 8 9 10 |
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blg/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blg/index.php [L] </IfModule> # END WordPress |
これは書いてある通りで、リクエストのあったディレクトリ、ファイルが存在しない場合に、
WordPressのトップページindex.phpへ要求を投げるということです。
トップページのindex.phpは要求のあったURLから、
必要な投稿や固定ページなどを返して、コンテンツを表示しています。
この方式である以上、WordPressの特定の記事、ページなどを指定して、
アクセス権を変更したりすることができません。
ディレクトリを作成して、.htaccessを配置した時点で、
WordPressに処理がされなくなってしまうからです。
存在しないディレクトリへのLimit制限解除
さて、では本題です。
こうした実在しないディレクトリを対象としてLimitによる制限を
解除したい場合にはどのように記述しますか。
<Directory> ディレクティブで特定ディレクトリに・・・できません。
<Directory> ディレクティブは.htaccessには記述できませんから。。。
<Directory> ディレクティブ|core – Apache HTTP サーバ
<Directory>ディレクティブ
説明: 指定のファイルシステムのディレクトリとサブディレクトリとのみに 適用されるディレクティブを囲む 構文: <Directory directory-path> … </Directory> コンテキスト: サーバ設定ファイル, バーチャルホスト ステータス: Core モジュール: core
ではどうするか。
私のアプローチとしては環境変数を利用しています。
SetEnvIf ディレクティブ |core – Apache HTTP サーバ
SetEnvIfディレクティブ
説明: リクエストの属性に基づいて環境変数を設定する 構文: SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] … コンテキスト: サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess 上書き: FileInfo ステータス: Base モジュール: mod_setenvif
SetEnvIf ディレクティブでは、事前に条件判定などを行って、
条件に一致した場合に環境変数に任意の値をセットし、覚えておくというイメージです。
一般的に言えば、コメントなどを基本的には受け付けない(POST拒否)ように設定しているが、
問合せフォーム(固定ページか何かで作成)ではPOSTを受け付けたい。
そんな感じです。
当サイトで言えば、以下のようなページを示しています。
※固定ページにショートコードを利用してフォームを表示し、ボタンでsubmitしています。
当サイトはサイト全体としてはPOST制限ですが、
この投稿では入力値を受け取る兼ね合いでPOSTを可能にしています。
特定のディレクトリ(例: blg/ipv4/cidr2extip/)への要求があったら、
環境変数(postok)をセットするといった感じで設定します。
1 2 |
SetEnvIf Request_URI "/cidr2extip/$" postok SetEnvIf Request_URI "/twoip2extip/$" postok |
次に、このセットした環境変数をどのように使うかというと、
以下のように<Limit>ディレクティブの内部で利用します。
env=postok(環境変数「postok」がセットされている場合) allow from (許可する)
1 2 3 4 5 |
<Limit POST> order deny,allow deny from all allow from env=postok </Limit> |
どうでしょうか。
ディレクトリの要求によって、POSTの制限を解除することができます。
さいごに
このようにして、特定IPなどでは拒否するといった用途が多いPOST制限ですが、
サイト全体を拒否設定にしておき、必要な場合だけに限って、許可する方がより安全かと思います。
.htaccessが設置できない仮想的なディレクトリに対して、
制限したり、許可したりといった制御が、環境変数を介することで可能になります。
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
関連記事
-
(mod_fastcgi on 2.0.x)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
【一発理解】mod_rewriteのURL転送が動かず迷ったらこれを確認(パスのスラッシュ)
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
Apacheのmod_rewriteで日本語にマッチさせたい(引用)
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(apache 2.2.25)ローカル環境(windows)へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
Apache2.0.xのhttpd.confを手動で作成する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(lounge mod_fcgid on 2.4.6)windowsでCGIをFastCGIで実行するように設定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
PHP.iniに設定する設定をhttpd.confや.htaccessに対して行うメリット
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
PHPをmod_fcgidやmod_fastcgiでFastCGI実行する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
(apache 2.0.65)ローカル環境(windows)へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
ローカル環境へのApache設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …