頑張らない!でも諦めない!必死にならずにええかげん

LimitによるGET,POST制限を特定ディレクトリのみ制限解除

      2015/01/24

Google or AdMax Promotion(it)

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から利用できます。

 

基本記述例

詳細は以下でご紹介しています。

 

基本的な記述は以下のようになります。

 

ですが、ここで困ったことになります。

.htaccessファイルはディレクトリごとに配置することができ、
ディレクトリ独自に設定を変えたい場合には、
そのディレクトリ内にも.htaccessファイルを配置し、新たな設定を記述します。

そう、ディレクトリが存在していれば・・・。

 

ディレクトリが存在しないから表示されるコンテンツ

WordPressなどCMSを利用した場合にはディレクトリが存在しないことも多いはずです。
※WordPressで言えば逆に存在しないことがコンテンツ表示の必須条件です。

WordPressが設定する.htaccessには以下のようになっていることと思います。

 

これは書いてある通りで、リクエストのあったディレクトリ、ファイルが存在しない場合に、
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)をセットするといった感じで設定します。

 

次に、このセットした環境変数をどのように使うかというと、
以下のように<Limit>ディレクティブの内部で利用します。

env=postok(環境変数「postok」がセットされている場合) allow from (許可する)

 

どうでしょうか。

ディレクトリの要求によって、POSTの制限を解除することができます。

 

さいごに

このようにして、特定IPなどでは拒否するといった用途が多いPOST制限ですが、
サイト全体を拒否設定にしておき、必要な場合だけに限って、許可する方がより安全かと思います。

.htaccessが設置できない仮想的なディレクトリに対して、
制限したり、許可したりといった制御が、環境変数を介することで可能になります。

 


*本ページ内に記載されされた各社ブランド、サービス名、商標、登録商標については、
各社ブランドのロゴや商標等に関する帰属についてをご確認ください


最後までお読みいただきありがとうございました。
アルゴリズン


役に立ったと思っていただけたら、以下からシェア頂けたら幸いです^^

QRコードからもこのURLを開けます。

Pitta Promotion

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。
ロゴの使用等に関する苦情・ご意見等がございましたら管理者までご連絡ください。

AdMax Promotion

カテゴリ
すべて展開 | すべて省略

Rakuten Promotion

プロモーション(btm)

Google or AdMax Promotion (it)

 - Apache

  関連記事