日記
おまけ: はてなダイアリー風のTrackBack受信確認を行うEdit

最近TrackBack SPAMが増えてきているので、TrackBack SPAM対策としてはてなダイアリー風のTrackBack SPAM対策を実装してみる。

はてなダイアリー風のTrackBack SPAM対策とは、TrackBackが送られてきたら、TrackBack PingのURLパラメータで表される送信元URLのHTMLドキュメントを取得し、そのHTML中にTrackBack送信先(自サイトの)URLが含まれているかどうかを確認。送信先URLがHTML中に含まれない場合は、(記事中に言及されていない=SPAMの疑いが強い、として)TrackBackの受信を拒否する、という仕組みだ。

ただし今回は、HTMLドキュメントに送信先URLが含まれなかった場合も、TrackBackの受信を拒否するのではなく、非表示指定(削除フラグON)にしたTrackBackを受信することにする。そうしておくことで、もしも送信先URLが含まれていないが正当なTrackBackであったり、あるいは実際には送信先URLが含まれているのに解析に失敗した場合などに、削除フラグを無効にするだけで表示させることができる。

また、せっかくだから検索エンジン対策として導入されつつあるrel="nofollow"属性にも対応しておこう。HTMLドキュメント中のリンクタグ(<a href="~">)にrel="nofollow"属性を付与しておくと、そのリンクは主要な検索エンジンではPageRank的な評価(たくさんのサイトにリンクされているサイトほど、検索エンジンで検索した際に上位に出てきやすい)の対象に含めないようになり、TrackBack SPAMの効果を減らすことができるとされている。

/lib/trackbacklib.php

<?php
(省略)

function
add_trackback_data($trackback_data) {
    (
省略)

    
$now = time();  //投稿日時
    
$deleted = is_trackbacked_url_linked($filename, $trackback_data['url']) ? 0 : 1;   //削除フラグ

    
(省略)
}

// trackback送信元HTMLに、受信先URLが含まれるかを確認
function is_trackbacked_url_linked($filename, $trackbacked_url)
{
    
$my_url = BLOG_ROOT_URL.'entry.php/'.$filename;
    
$trackbacked_html = file_get_contents($trackbacked_url);
    if (
preg_match('/'.preg_quote($my_url, '/').'/', $trackbacked_html)) {
        return
TRUE;
    }
    return
FALSE;
}

(
省略)
?>

この部分が、TrackBack SPAM対策のコアの部分となる。trackbacklib.phpに1個関数を追加し、さらにtrackback保存処理にちょっと手を加えている。

TrackBackを保存する関数(add_trackback_data)から、送信元HTMLに受信先URLが含まれるかを確認する関数(is_trackbacked_url_linked)を呼び、その結果に応じてTrackBackデータを保存する際のデフォルトの削除フラグを設定している。is_trackbacked_url_linkedでは、単純にfile_get_contentsで送信元URLのHTMLを取得し、それの内容に対して正規表現で送信先URL文字列の検索を行っている。

/tmpl/trackback_list.tmpl

(省略)
    『<a href="<?=h($item['url']) ?>" rel="nofollow"><?=h($item['title'] != '' ? $item['title'] : $item['url']) ?></a>』
(省略)
</dt>

/tmpl/comment_list.tmpl

(省略)
    <a href="<?=h(preg_match('|^https?://|i', $item['url']) ? '' : 'mailto:') ?><?=h($item['url']) ?>" rel="nofollow"><?=h($item['name']) ?></a>
(省略)

rel="nofollow"対策を行うには、上記二つのテンプレートを書き換えればいい。trackback_list.tmplがTrackBack一覧の表示用、comment_list.tmplがコメント一覧の表示用となっている。

『自分で作るblogツール(PHP編)』サポートエントリーに戻る

Published At2005-04-01 17:29Updated At2005-04-01 17:29