Comment keyによるTrackback SPAM撃退ver2
先日、実装したコメントキーによるTrackback SPAM撃退法のVer.2を実装。これでほぼ完璧になった。
前回の実装では、コメントキーは、素直に日付 yymmdd
になっていた。これはメインストリームに入れた場合には、SPAMMERは容易にkeyを推測可能であり、サイトを参照することなしに、Trackback SPAMの送出が可能になる。
そこで、各サイトごとに管理者の設定するsalt値を使うことと、記事ごとに異なるcomment keyを付与することで、外部からはcomment keyの推測が不可能になるよう改良した。この値は12時間ごとに切り替わる6文字とした。
時間の切り替わりで投稿した場合、エラーに判定される場合がありえるので、3時間まえのキーでもOKとする仕様としてある。日本の場合は、午前9時と午後9時に切り替えがくる。投稿の3時間前のキーでもOKと言う意味は、午後9時1分に見たトラックバックURLを翌日の正午までにトラックバックすればOKということである。
つまりは、トラックバックを送りたい人は、記事をみてトラックバックURLを取得してから、半日以内に記事を書きトラックバックを送出しないとエラーになるということである。十分緩い仕様だとおもう。
その一方で、半日前以上まえに検索エンジンのクローラーが取得したトラックバックURLは無効にできるということで、ボットによるトラックバックSPAMを撃退できると期待している。
具体的な変更方法は次の通りである。
/**
* Template function: displays url to use to trackback this item
*
* {@internal Item::trackback_url(-) }}
*/
function trackback_url()
{
global $htsrv_url, $Settings;
// -- add date key
$salt = $Settings->get( 'trackback_aspm_salt' );
$trackback_datekey = substr(md5($salt.gmdate("dmyA").strval($this->ID)), 0, 6);
if( $Settings->get('links_extrapath') )
{
echo "$htsrv_url/trackback.php/$trackback_datekey$this->ID";
}
else
{
echo "$htsrv_url/trackback.php?tb_id=$this->ID&tb_key=$trackback_datekey";
}
}
つづいて、htsrv/trackback.php
を修正。
param( 'tb_id', 'integer' );
param( 'url', 'string' );
param( 'title', 'string' );
param( 'excerpt', 'html' );
param( 'blog_name', 'string' );
param( 'tb_key', 'integer' );
if(empty($tb_id))
{ // No parameter for ID, get if from URL:
$path_elements = explode( '/', $ReqPath, 30 );
$tb_id = intval(substr( $path_elements[count($path_elements)-1] ,6) );
}
if (empty($tb_key))
{
// No parameter for ID, get if from URL:
$path_elements = explode( '/', $ReqPath, 30 );
$tb_key = substr( $path_elements[count($path_elements)-1] ,0, 6);
}
if ((strlen(''.$tb_id)) && (empty($HTTP_GET_VARS['__mode'])) && (strlen(''.$url)) && (strlen(''.$tb_key)))
{
@header('Content-Type: text/xml');
$comment_post_ID = $tb_id;
$postdata = get_postdata($comment_post_ID);
$blog = $postdata['Blog'];
$blogparams = get_blogparams_by_ID( $blog );
if( !get_bloginfo('allowtrackbacks', $blogparams) )
{
trackback_response(1, 'Sorry, this weblog does not allow you to trackback its posts.');
}
$trackback_key = substr(md5($Settings->get('trackback_aspm_salt').gmdate("dmyA").strval($tb_id)), 0, 6);
$trackback_key_before = substr(md5($Settings->get('trackback_aspm_salt').gmdate("dmyA", strtotime("-3 hour")).strval($tb_id)), 0, 6);
if( $tb_key != $trackback_key && $tb_key != $trackback_key_before )
{
debug_log('tb_key is differed');
trackback_response(1, 'Sorry, this weblog does not allow you to trackback its posts.');
}
そして、admin/b2options.php
を修正して、次を追加。
// this is for the trackback key extention hack
param( 'trackback_aspm_salt', 'string', true );
$Settings->set( 'trackback_aspm_salt', $trackback_aspm_salt );
if( $Settings->updateDB() )
{
$status_update[] = T_('General settings updated.');
}
最後に、admin/_set_general.form.php
を開き,
入力フォームを一つ追加する。
<?php
form_text( 'user_minpwdlen', (int)$Settings->get('user_minpwdlen'), 1, T_('Minimum password length'), T_('for users.'), 2 );
// this is for the trackback comment key extension hack
form_text( 'trackback_aspm_salt', $Settings->get( 'trackback_aspm_salt' ), 2, T_('Trackback key salt'), '
'.T_('Mandatory field, this is used for randumize trackback URL(2 latin chars)'), 2 );
?>
この記事へのトラックバック アドレス
トラックバック URL (右をクリックし、ショートカット/リンクをコピーして下さい)
モデレーション待ちのフィードバック
この投稿にはモデレーション待ちのフィードバックが 14 件あります....