« フレーベル館カナダみやげのワイン »

Comment keyによるTrackback SPAM撃退ver2

2006/08/10

  13:42:31 by , Categories: b2evolution

Link: http://blogs.da-cha.jp/momokuri.php/2006/07#comment_key_________trackback_spam______

先日、実装したコメントキーによる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 );
?>

Trackback address for this post

Trackback URL (right click and copy shortcut/link location)

Feedback awaiting moderation

This post has 3 feedbacks awaiting moderation...


Form is loading...