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

トラックバックスパム対策 / 2011-06-01 (水)

迷惑コメントとともに最近被害が多いのがトラックバックを使用したスパムです。
rNoteにはトラックバック受信機能があるため何も対策をしていないと迷惑な
トラックバックが国内外を問わず投稿され不快な思いをさせられる事になります。

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

☆トラックバックの受付制御を行う方法

 かろかろ氏のrNoteまとめWikiにも同様の対策がありますが、もう少し判定を
 追加して出来る限り迷惑なトラックバックを許さないようにしています。

 以下はrNoteにトラックバック受付制御を実装した場合の例です。
 コードの追加位置は迷惑コメント対策で記述したng_commentの下です。

rnote_config.php

//------------------------------------------
// 対スパムトラックバック用禁止URL
$ng_url[]='spam-host\.com';
$ng_url[]='blog-site\.jp';
$ng_url[]='spammer\.com';

// $ng_url[]='ホスト名';の追加で禁止ホストを増やすことが出来る

//------------------------------------------
// 対スパムトラックバック用禁止UA
$ng_agent[]="^.{0,3}$";
$ng_agent[]="^USERAGENT$";
$ng_agent[]="^NP_Trackback/";
$ng_agent[]="^Trackback/";
$ng_agent[]="^TrackBack$";
$ng_agent[]="^Mozilla/";
$ng_agent[]="^Opera/";
$ng_agent[]="^tb_send/";
$ng_agent[]="^libghttp/";
$ng_agent[]="^PHP/";
$ng_agent[]="^PEAR HTTP_Request class";
$ng_agent[]="^Jakarta Commons-HttpClient/";
$ng_agent[]="WinHttp\.WinHttpRequest";
$ng_agent[]="^Movable Type$";
$ng_agent[]="^MovableType/[1-2]\.";
$ng_agent[]="^MovableType/3\.[0-2]";
$ng_agent[]="^WordPress/2\.7$";
$ng_agent[]="^WordPress/1\.";
$ng_agent[]="^WordPress/2\.0\.[0-9]$";
$ng_agent[]="^WordPress/2\.1\.[0-2]$";

// $ng_agent[]='エージェント名';の追加で投稿禁止UAを増やすことが出来る
// 上記に記載した物はすべて偽装UAのため正式なリリースがされているものは
// 問題なくトラックバック送信が可能である。

//------------------------------------------
// Trackback制御
if(($_POST['url']) || ($_GET['url'])){
    // トラックバック送信に使用されているエージェント名が
    // 投稿禁止エージェント名に含まれるか確認
    foreach($ng_agent as $n){
        if(ereg($n, $_SERVER['HTTP_USER_AGENT'])){
            TrackbackError('The TrackBack cannot be transmitted from this agent.');
        }
    }
    // トラックバックで投稿されるURLに
    // 投稿禁止ホストが含まれるか確認
    foreach($ng_url as $n){
        if(ereg($n, $_POST['url'])){
            TrackbackError('The trackback from this host cannot be done.');
        }
    }
    // ブログ名がないものは禁止
    if(!$_POST['blog_name']){
        TrackbackError('No name.');
    }
    // ブログの概要がないものは禁止
    if(!$_POST['excerpt']){
        TrackbackError('No excerpt.');
    }
    // タイトルがないものは禁止
    if(!$_POST['title']){
        TrackbackError('No title.');
    }
    // タイトルの文字コードがUTF-8以外は禁止
    if(!mb_check_encoding($_POST['title'], "UTF-8")){
        TrackbackError('Bad request.');
    }
    // ブログ名の文字コードがUTF-8以外は禁止
    if(!mb_check_encoding($_POST['blog_name'], "UTF-8")){
        TrackbackError('Bad request.');
    }
    // ブログ概要の文字コードがUTF-8以外は禁止
    if(!mb_check_encoding($_POST['excerpt'], "UTF-8")){
        TrackbackError('Bad request.');
    }
    // ブログ概要が英字のみのトラックバックを禁止する
    if(!preg_match("/[\x80-\xff]/",$_POST['excerpt'])){
        TrackbackError('Bad request.');
    }
    // タイトルに禁止ワードが含まれているか確認
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['title'])){
            TrackbackError('This title is including forbidden words.');
        }
    }
    // ブログ名に禁止ワードが含まれているかを確認
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['blog_name'])){
            TrackbackError('This blog name is including forbidden words.');
        }
    }
    // ブログの概要に禁止ワードが含まれているかを確認
    foreach($ng_comment as $n){
        if(ereg($n, $_POST['excerpt'])){
            TrackbackError('This excerpt is including forbidden words.');
        }
    }
    // 参照先のURLに自サイトの言及がないトラックバックを禁止する
    if(!checkRefURL($_POST['url'])){
        TrackbackError('This entry is not accept your trackback.');
    }
}

// 参照先サイトチェック
function checkRefURL($ref_url){
    // TrackBack送信元の記事を走査するように変更
    $tfile = fopen($ref_url, "r");

    // TrackBack元エントリのオープン失敗
    if(!$tfile){
        return FALSE;
    }

    // 検索文字列を初期化
    $tdata = "";

    // ファイルの終端まで読み込んで検索文字列に連結する
    while(!feof($tfile)){
        $line = fgets($tfile, 1024);
        $tdata = $tdata.$line;
    }

    fclose($tfile);

    // 検索文字列に自サイトのURLまたはタイトルが存在するとき
    if((strpos($tdata, SITE_URL) > 0) || (strpos($tdata, SITE_TITLE) > 0)){
        return TRUE;
    }
    else{
        return FALSE;
    }
}

☆トラックバックのスパムログを採取する

 迷惑投稿ログ採取で記載したログ採取関数を使用してトラックバックスパムを
 採取する事が出来ます。

rnote_config.php

//------------------------------------------
// Trackback制御
if(($_POST['url']) || ($_GET['url'])){
    // 全件ログを採取する(全件採取しない場合はここに記述しない)
    comLogWrite();

    // ブログ概要が英字のみのトラックバックを禁止する
    if(!preg_match("/[\x80-\xff]/",$_POST['excerpt'])){
        // 規則違反のトラックバック投稿ログを採取する
        comLogWrite();
        TrackbackError('Bad request.');
    }

    (略)

}

 なおrNotePadをプラグインで追加している場合、不具合が出ますのでrNote Padとトラックバック制御を利用する時のエラー回避
 読んでからコードの実装を行ってください。