Nucleus

NP_PostLog

2007年1月31日

 『NP_ProtectByMD5でスパムを軽くあしらう』で書いたように、index.php の冒頭でスパムかどうかのチェックを行っているのであるが、一日に3-4個のPOSTアクセスがこのチェックルーチンをすり抜けている。最終的にはスパムコメントは書き込まれていないため、NP_ProtectByMD5でブロックしているようであるが、ログを取っていないためにどのような値がPOSTされたか不明である。

 そこで、そのようなケースにおいてPOSTされた値のログをとるプラグインを作成した。

 このプラグインは、インストールするだけで有効になる。メンバー以外のPOSTアクセスについてログを取るようになっている。『var $maxlen=32;』を変更すれば、保存するデータの長さを調整可能。

 このプラグインはPostAuthenticationイベントを使用している。他のプラグインで同じイベント中に処理を中止するものがある(NP_ProtectByMD5など)ので、そういった場合は、プラグインリストの順位を調整することで、処理を中止した場合にログをとるかとらないかの調整ができる。

<?php 
class NP_PostLog extends NucleusPlugin { 
    function getName() { return 'NP_PostLog'; }
    function getMinNucleusVersion() { return 220; }
    function getAuthor()  { return 'Katsumi'; }
    function getVersion() { return '0.1.1'; }
    function getURL() {return 'http://hp.vector.co.jp/authors/VA016157/';}
    function getDescription() { return $this->getName().' plugin'; } 
    function supportsFeature($what) { return (int)($what=='SqlTablePrefix'); }
    function getEventList() { return array('PostAuthentication'); }
    function event_PostAuthentication() {
        global $member;
        if ($member->isLoggedIn()) return;
        if (strtoupper($_SERVER['REQUEST_METHOD'])!='POST') return;
        $message='NP_PostLog:'.$_SERVER['REMOTE_ADDR']."//\n";
        $message.='URI:['.$_SERVER['REQUEST_URI']."]//\n";
        foreach($_POST as $key=>$value){
            if (!is_array($value)) $message.="$key=".substr($value,0,$this->maxlen)."//\n";
            else foreach($_POST as $key2=>$value) $message.="$key\[$key2]=".substr($value,0,$this->maxlen)."//\n";
        }
        ACTIONLOG::add(WARNING, $message);
    }
    var $maxlen=32;
}
?>

コメント

Katsumi as guest (2007年1月31日 19:01:50)

NP_PostLog用、テスト書き込み。

Katsumi (2007年2月9日 11:55:18)

 NP_ProtectByMD5をすり抜けていたPOSTアクセスは、コマンドインジェクション脆弱性を狙った、クラッキングのトライでした…。スパムコメントではなかった。
 いやはや、どんなブログツールのどんなセキュリティーホールを狙ってるんだか…。気をつけないといけなせんね。

コメント送信