トップ «前の日記(2005-02-17) 最新 次の日記(2005-02-19)» 編集

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|

2005-02-18 [長年日記]

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

さっき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;}

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

Tags: SPAM PHP