.htaccessで国内からのPOSTのみを許可する設定(国内ホスト一覧の自動更新スクリプト付き)
今まではmod_rewriteを使ったPOST制限を行っていたのですが、mod_rewriteはCIDRによる記述が出来ないため、ホストによる制限部分がどうしても正確性に欠けてしまうため、国内からのPOSTでも拒否されてしまうことがたまにありました。
そこで.htaccessでmod_rewriteを使わずに以下の条件を満たす方法を模索しました。
・制限するスクリプトを限定する
・制限するのはPOSTのみ
・国内ホストからのみ許可する
・REQUEST_URIが指定した文字列にマッチする場合は国内外問わず許可する
・国内ホストの一覧は自動更新する
で、たどり着いた.htaccessの記述が以下のとおりです。
●<FilesMatch “bbs.*\.cgi$”></FilesMatch>
制限の対象となるスクリプトファイル名を記述します。
「.*」は0文字以上の任意の文字列にマッチした場合という意味です。
「$」は最後から検索してという意味になります。
したがって上記はスクリプトファイル名の文字列を最後から検索してbbs***.cgiにマッチした場合は真という条件になります。
複数のスクリプトファイルを対象とする場合は
<FilesMatch “(hoge|hogehoge|hogehogehoge)\.(cgi|php)$”></FilesMatch>
というように指定することもできます。
●<Limit POST></Limit>
POSTのみを制限する指定です。
<Limit GET POST></Limit>
とすればGETとPOSTを制限することができます。
●SetEnvIf Request_URI “/hogehoge$” Accept
レンタル掲示板はPOST時に環境変数PATH_INFOを付与しているのですが、SetEnvIfは環境変数PATH_INFOを参照できないのでREQUEST_URLで代用しています。
したがって上記はREQUEST_URLの文字列を最後から検索して「/hogehoge」にマッチした場合という意味になります。
●Order Deny,Allow
これは拒否をしてから許可するという定義になります。
●Deny from all
一度すべてを拒否するという意味です。
●Allow from env=Accept
これは「SetEnvIf Request_URI “/hogehoge$” Accept」の条件にマッチした場合は許可するという意味です。
●Allow from 192.168.10.0/24
これは単純にLAN内(私用)からのPOSTは許可するという意味です。
●#ALLOW_CIDR_LIST_____#・・・・・#_____ALLOW_CIDR_LIST#
これはこの後解説する国内ホスト一覧の自動取得スクリプト(getApnicCidr2HTA.pl)が国内ホスト一覧(CIDR方式)を記述する場所をスクリプトに示すための記述です。
■上記.htaccessを制限したいディレクトリ配下に設置します。
■次に国内ホスト一覧の自動取得を行うスクリプトを用意します。
> wget http://cmf.ohtanz.com/download/getApnicCidr2HTA.txt
> mv getApnicCidr2HTA.txt getApnicCidr2HTA.pl
> chmod 755 getApnicCidr2HTA.pl
※ちなみにPostfixのcidr_tableを自動更新、FTPに対する不正なアクセスを遮断に次ぐgetApnicCidrシリーズ第3段です。
■ダウンロードしたgetApnicCidr2HTA.plの下記の部分を編集します。
5行目の@HTACCESS_LISTは対象となる.htaccessまでのパスを記述します。
※このスクリプトは.htaccess内の#ALLOW_CIDR_LIST_____#・・・・・#_____ALLOW_CIDR_LIST#の間のみを更新するので、それ以外の個所は自由にカスタマイズしても問題ありません。
■編集が終わったらgetApnicCidr2HTA.plを1度手動で実行します。
> perl getApnicCidr2HTA.pl
※.htaccessを開いて#ALLOW_CIDR_LIST_____#・・・・・#_____ALLOW_CIDR_LIST#間にホスト一覧が記述されていることを確認して下さい。
後はgetApnicCidr2HTA.plをcronに追加して終了です。
Subscribe to the RSS feed and have all new posts delivered straight to you.
