日記
submitに認証コードを含ませるコメントSPAM対策 (16:18)Edit

さっきMMの方で思いついたけど、書ききれなかったコメントSPAM対策。

submitボタン自体に認証処理を付加してみる方法。単にhiddenで認証コードを渡してもいいけど、ボタン自体に認証コードを含ませておくと、「どのボタンを押すか」という人間が頭を使って選択する余地ができるんで、応用範囲が広がりそう。

時間制限も付けているけど、これはあまり意味がないかな?(フォーム自体をGETされたら、時間切れ前にPOSTされちゃうだろうし) でもまあ時間切れだった場合は再投稿フォームを新しいsubmitボタン付きで生成して、「フォームの有効期限切れです。もう一度投稿を行ってください」とかするだけだから、ユーザーの手間はそれほどかけないでしょう。

define('SEED', 'SOME_SEED_VALUE');  //適当な文字列
define('TERM_OF_VARIDITY', 60 * 10);  //10分間有効
header('content-type: text/html; charset=euc-jp');
main();
function main() {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (check_submit()) {
echo 'SUCCESS';
} else {
echo 'NOT VALID';
}
}
echo '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
show_submit_button();
echo '<input type="submit" name="submit_'.time().'_'.md5(time()+1).'" value="こっちはだめ">';
echo '</form>';
}
function show_submit_button() {
$now = time();
$check = md5($now . SEED);
echo '<input type="submit" name="submit_'.$now.'_'.$check.'" value="投稿する">';
}
function check_submit() {
foreach (array_keys($_POST) as $key) {
if (preg_match('|^submit_([0-9]+)_([0-9a-f]+)$|', $key, $matches)) {
$time = $matches[1];
$check = $matches[2];
if ($time < time() - TERM_OF_VARIDITY) {continue;}
if (md5($time . SEED) == $check) {return TRUE;}
}
}
return FALSE;
}

一応実働サンプルも置いておこう。

全部のsubmitを投稿されちゃうといやだし

if (md5($time . SEED) != $check) {return FALSE;}

もした方がいいのかな。でもそうなると、チェックする順番も意味が出てきちゃうな。ってまあ思いつきネタだから厳密に考えなくてもいいか。

Published At2005-02-18 00:00Updated At2005-02-18 00:00