ツイートする このエントリーを含むはてなブックマーク [rNote Tips]

迷惑コメント対策 / 2010-09-17 (金)

最近ランダムで表示される投稿キーを認証キーとして使用するrNoteや掲示板が
増えてきましたが、これを無視するかのように迷惑なスパムコメントを
投稿するツールが現れたため、投稿キーが意味をなさなくなってきました。

この問題を解決するための方法を以下に記載いたします。

☆入力禁止ワードを設定する

 古典的ですが、もっとも簡単にコメントスパムを投稿出来なくする方法です。
 禁止ワードにスパムに良く使われる単語(例えば偽物、出会い系、無料など)を
 追加してコメント投稿や掲示板投稿時に単語チェックをかけて当てはまれば
 投稿が出来ないエラーを表示するという内容を追加すればOKです。

 特に最近の物は必ずコメント内に迷惑サイトのURLが付くため、URLに関する
 キーワード(tp:、tps:、hrefなど)を追加すれば効果的です。

 以下はrNoteにコメント制御を実装した場合の例です。

rnote_config.php

//------------------------------------------
// コメント制御

// 対コメントスパム用禁止ワード
$ng_comment[]='tp:';
$ng_comment[]='tps:';
$ng_comment[]='mailto:';
$ng_comment[]='href';
$ng_comment[]='link';
$ng_comment[]='url';

// 対コメントスパム用禁止ワード2
$ng_comment[]='出会い';
$ng_comment[]='無料';
$ng_comment[]='偽物';
$ng_comment[]='コピー';
$ng_comment[]='ソフト';

// $ng_comment[]='キーワード';を追加することで禁止ワードを増やせる

// BBS
if($_POST['mode']=='bbs_write'){
    // 後述のプロクシ、逆引きホスト制御はこのコメントの下に記載する
    // 名前なし投稿を禁止する
    if(strlen($_POST['tag_AuthorName'])<2){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('名前がありません。');
        }
        else{
            error('No name.');
        }
    }
    // NGワードを含んだ名前の投稿を禁止する
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['tag_AuthorName'])){
            if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                error('名前に投稿禁止ワードが含まれています。');
            }
            else{
                error('This name is including forbidden words.');
            }
        }
    }
    // 名前とURLが一致する投稿を禁止する
    if(ereg($_POST['tag_AuthorName'], $_POST['tag_AuthorUrl'])){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('不正なURLまたはメールアドレスです。');
        }
        else{
            error('Bad URL or Mail Address.');
        }
    }
    // コメントなしの投稿を禁止する
    if(strlen($_POST['tag_Text'])<2){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('コメントが入力されていません。');
        }
        else{
            error('No Comments.');
        }
    }
    // 英字のみの投稿を禁止する
    if(!preg_match("/[\x80-\xff]/",$_POST['tag_Text'])){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('英字のみの投稿はできません。');
        }
        else{
            error('It is not possible to write it in the alphabet.');
        }
    }
    // NGワードを含んだコメントの投稿を禁止する
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['tag_Text'])){
            if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                error('コメントに投稿禁止ワードが含まれています。');
            }
            else{
                error('This comment is including forbidden words.');
            }
        }
    }
}

// コメント
if($_POST['mode']=='wb_write'){
    // 後述のプロクシ、逆引きホスト制御はこのコメントの下に記載する
    // 名前なし投稿を禁止する
    if(strlen($_POST['AuthorName'])<2){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('名前がありません。');
        }
        else{
            error('No name.');
        }
    }
    // NGワードを含んだ名前の投稿を禁止する
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['AuthorName'])){
            if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                error('名前に投稿禁止ワードが含まれています。');
            }
            else{
                error('This name is including forbidden words.');
            }
        }
    }
    // 名前とURLが一致する投稿を禁止する
    if(ereg($_POST['AuthorName'], $_POST['AuthorUrl'])){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('不正なURLまたはメールアドレスです。');
        }
        else{
            error('Bad URL or Mail Address.');
        }
    }
    // コメントなしの投稿を禁止する
    if(strlen($_POST['Text'])<2){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('コメントが入力されていません。');
        }
        else{
            error('No Comments.');
        }
    }
    // 英字のみの投稿を禁止する
    if(!preg_match("/[\x80-\xff]/",$_POST['Text'])){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('英字のみの投稿はできません。');
        }
        else{
            error('It is not possible to write it in the alphabet.');
        }
    }
    // NGワードを含んだコメントの投稿を禁止する
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['Text'])){
            if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                error('コメントに投稿禁止ワードが含まれています。');
            }
            else{
                error('This comment is including forbidden words.');
            }
        }
    }
}

☆プロクシを通しての投稿を禁止する

 これも掲示板などではおなじみの機能ですが、rNoteには実装されていません。
 以下に記載するサブルーチンを使用すれば簡単にプロクシからの投稿を
 ブロック可能になります。

rnote_config.php

//------------------------------------------
// プロクシ投稿チェック
function checkProxy(){
    if(null != ($proxy = getenv("HTTP_VIA")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_FROM")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_SP_HOST")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_CLIENT_IP")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_FORWARDED")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_X_LOCKING")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_XONNECTION")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_CACHE_INFO")))
        return $proxy;
    if("no-cache" != ($proxy = getenv("HTTP_CACHE_CONTROL")) && $proxy != null)
        return $proxy;
    if(null != ($proxy = getenv("HTTP_X_FORWARDED_FOR")))
        return $proxy;
    if(null != ($proxy = getenv("HTTP_PROXY_CONNECTION")))
        return $proxy;
    return FALSE;
}

☆逆引き参照できないホストからの投稿を禁止する

 海外からのスパム投稿をはじく最良の方法ですが、これもrNoteには実装されていません。
 以下に記載するサブルーチンを上記プロクシ制御と使用すればほぼ迷惑なスパム投稿を
 ブロック可能になります。

rnote_config.php

// 逆引き参照チェック
function checkReverseHost(){
    // 投稿IPとホスト名の取得
    $host = $_SERVER['REMOTE_HOST'];
    $ipaddr = $_SERVER['REMOTE_ADDR'];

    // ホスト名が取得できなかった、またはホスト名がIPアドレスと同じとき
    if($host == null || $host == $ipaddr){
        return FALSE;
    }

    return TRUE;
}

☆プロクシ投稿と逆引き参照不可のホスト制限の設定例

 このチェックを前項で記載したスクリプトに組み込めばプロクシ、逆引き参照ができない
 ホストからの投稿(スパム)やいたずら、誹謗中傷投稿をブロック可能になります。

rnote_config.php

// コメント
if($_POST['mode']=='wb_write'){
    // 後述のプロクシ、逆引きホスト制御はこのコメントの下に記載する
    // 逆引き参照が出来ないホストからの投稿を禁止する
    if(checkReverseHost() != TRUE){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('逆引き参照が出来ないホストからの投稿は禁止しています。');
        }
        else{
            error('The contribution no host name is prohibited.');
        }
    }

    // BBS、コメント投稿チェックの先頭にこのコードを追加
    if(checkProxy() != FALSE){
        if(ereg('ja', $_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            error('プロクシを通しての投稿は禁止しています。');
        }
        else{
            error('The contribution through proxy is prohibited.');
        }
    }
    
    (省略)
    
}

 なお、ここには記載しませんがコメントが投稿された際に投稿内容やIPアドレスを
 指定したメールアドレスに送信やログとして記録するという事も組み込めますので
 コメントが投稿されたことを知りたい、またはエラー時のみにメール送信やログ記録を
 行い、迷惑な投稿を行うIPホスト制限や禁止ワード追加の手掛かりにするという事も出来ます。