BBQなどRBLでのSPAM弾きスクリプトをプラグインじゃなくて、直接Nucleusを書き換えているので、NucleusがUpdateするたびに、その部分を修正追記する必要がある。プラグインを作ってもいいのだけど、プラグインの作り方とかを調べて作るのも面倒だしmod_access_rblが使えたらなぁと思っていたが、まったく別の方法を思いつきました。phpだけではなく、静的なHTMLファイルもアクセス制限できる。条件はphpスクリプトが動作することと、.htaccessが利用できることです。
まずはRBLによる判定とRBLでヒットしたときの事後処理部分。(checkrbl.php)
<?php
/**
* POST METHOD のみ有効にする場合。
* if ($_SERVER['REQUEST_METHOD'] != 'POST') return;
**/
$rbls = array('niku.2ch.net');
$dqaddr = ereg_replace('([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)','\4.\3.\2.\1.',$_SERVER['REMOTE_ADDR']);
foreach ($rbls as $rbl) {
$resadr = gethostbyname($dqaddr . $rbl);
if ($resadr != $dqaddr . $rbl) {
header('HTTP/1.0 403 Forbidden');
echo <<< __HTML__
<html>
<head>
<title>403 Access Forbidden </title>
</hrad>
<body>
<p>
Proxy access to this page is forbidden.
</p>
</body>
</html>
__HTML__;
exit;
}
}
?>
$rblsを配列にしてforeachで回しているのは、rblを一つだけ(今回はBBQ)じゃなくて、他のRBLも利用するときに配列に加えていくだけで済む為。
後は、php機能のauto_prepend_fileを.htaccessで設定して、事前に実行させるようになってます。以下は拡張子が.htmlなファイルに対してRBLのチェックを行う場合です。オープンプロクシなどからのアクセスから表示も拒否する場合に利用できる。(/path/to/の部分は環境に合わせて要変更)
<FilesMatch "\.html$">
ForceType application/x-httpd-php
php_value auto_prepend_file "/path/to/checkrbl.php"
</FilesMatch>
.htmlな静的ファイルをphpスクリプトに見立てて、auto_prepend_fileで先のスクリプトを読み込んで処理します。全てのhtmlファイルにこの処理が入りますので、サーバの負荷が上がってしまうかも。本体がphpファイルの場合、autp_prepend_fileだけでよく、ForceTypeの設定やFilesMatchすら不要です。当然、他の言語(prel等)では使用できませんが、cgiならcheckrbl.phpから起動する形に改造すれば使えないこともない。が、ヘッダ処理が面倒かな、出力されたものからヘッダ部分を取り除く処理が必要。まぁ大概は最初の改行2連発まで除去するだけで済むのだろうけど。
やっぱり基本はphpファイルのPOST処理にこの処理を食わせるだけが理想かな。リクエストメソッドの判定をphpスクリプトじゃなくて、.htaccess側で<Limit POST>ディレクティブを利用すればと試してみたんですが、こちらはうまく動作しなかった。これが有効に使えたらPOST処理のみcheckrbl.phpを通すということになり、サーバの負荷増が多少低減されるのに...
その他弊害として、上記の方法ではhtmlファイルの場合でもphpスクリプトとして処理されますので、レスポンスヘッダに"Last-Modefied"や"Etag"が含まれません。リクエストURIから表示したいhtmlファイルを探し出して、それらのヘッダを出力し、$_SERVER["HTTP_IF_MODIFIED_SINCE"] や $_SERVER["HTTP_IF_NONE_MATCH"] で判定しないと、常に HTTP/1.1 200 OK で毎回全て出力してしまいます。やっぱりPOSTメソッドのみ向けだなぁ。
- Newer: 利き腕
- Older: 魚と名前と言葉と差別
Trackback:0
- TrackBack URL for this entry
- Listed below are links to weblogs that reference
- RBLによる制限をコンテンツ全体に適用する方法 from Submariners Blog