2005年1月7日金曜日

wiki SPAM対策



なんだか、反応があるととってもうれしいですね。


唐揚げでやってみました。さて、、身内のwikiに導入する準備でもしようかな。


auth.inc.php内のhuman_check関数を




function check_human(){
global $system_salt;
global $humancheck_timespan;
$ip=$_SERVER{"REMOTE_ADDR"};
$uri=$_SERVER{"REQUEST_URI"};
$uri_hash=md5($system_salt.$uri);
$uri= urlencode($_SERVER{"REQUEST_URI"});


$location="Location: index.php?plugin=humancheck&humancheck_u=".$uri."&humancheck_uh=".
$uri_hash;
if(! isset($_COOKIE{"human"}))
header($location);

$tmp = preg_split('/:/',$_COOKIE{"human"});
$utime=$tmp[0];
$hash=$tmp[1];
if($utime + $humancheck_timespan < time() ||
$hash != md5($system_salt.$ip.$utime))
header($location);
//認証できたのでtime extended!
$utime=time();
$hash=md5($system_salt.$ip.$utime);
setcookie('human',$utime.':'.$hash,time()+$humancheck_timespan);
}

// 編集不可能なページを編集しようとしたとき
function check_editable($page,$auth_flag=TRUE,$exit_flag=TRUE)
{
global $script,$_title_cannotedit,$_msg_unfreeze;

if (edit_auth($page,$auth_flag,$exit_flag) and is_editable($page))
{

check_human();
return TRUE;
}
if (!$exit_flag)





てな感じにして。


human_check.phpをpukiwikiのプラグインとして書き直して。


plugin/humancheck.inc.phpとして書いて見ました



<?php

function plugin_humancheck_action()
{
global $system_salt;
global $vars;
global $humancheck_timespan;
$uri_head=$_SERVER{"PHP_SELF"};
$ip=$_SERVER{"REMOTE_ADDR"};
$uri=$vars{"humancheck_u"};
$hash_uri=$vars{"humancheck_uh"};

$check_data=array(
'「唐揚げ」をローマ字で書いてください', '
karaage',
'「萌え」をローマ字で書いてください' , 'm
oe',
'「萎え」をローマ字で書いてください' , 'n
ae');

$nof_question=count($check_data)/2;
//本当は時間ごと、IPごと等で出る質問内容をいくつかに制限しておいて
//そのqidが着ているかをここでチェック

$qid=$vars{"humancheck_qid"};
#人間チェックにパスして、URI改竄もない
if($qid >-1 && $qid < $nof_question && //質問IDが適切かチェック
$vars{"human"}==$check_data[$qid*2+1] && //正解かどうかチェック
strlen($uri_head)>0 && //以下URLいり攻撃チェック
substr($uri,0,strlen($uri_head)) == $uri_head &&
$hash_uri == md5($system_salt.$uri)){
$utime=time();
$hash=md5($system_salt.$ip.$utime);
setcookie('human',$utime.':'.$hash,time()+$humancheck_timespan);
header("Location: ".$uri);
}

$qid= time() % $nof_question;
$question=$check_data[$qid*2];

$out_uri=htmlentities($uri);
$content = <<<EOD
<h1>人間チェック</h1>
以下の質問に答えてください<br>
$question
<form action="./index.php" method="POST">
<input type="hidden" name="plugin" value="humancheck">
<input type="hidden" name="humancheck_qid" value="$qid">
<input type="hidden" name="humancheck_u" value="$out_uri">
<input type="hidden" name="humancheck_uh" value="$hash_uri">
<input type="text" name="human">
<input type="submit">
</form>
EOD;

return array(
'msg'=>'Human Check',
'body'=>$content
);
}
?>


さらにpukiwiki.ini.phpに



$system_salt="何か推測されない文字列"; //ハッシュをとるときのソルと
$humancheck_timespan= 3600; //human checkの頻度(一回の投稿はこの時間内におえなければいけない)



じつは高々こんなもののために2時間以上かかってしまった。。。orz


やっぱり俺へたれだ。まぁ、実験の計算完了待ちの間だからいいだけどねぇ。。


期間限定で下記URLにテスト実装のものをおいてみました。


http://nosi.dip.jp/test/pukiwiki/index.php


うまくいくようなら、本家に提案したいけど、pukiwikiのコミュニティわかりにくっorz





0 件のコメント:

コメントを投稿