記事一覧

PHPで投稿キー認証

画像に表示された文字列を入力しないと、投稿できない仕組みがあります。
ブログのコメント欄や掲示板でのスパム対策に使われますが、仕組みを理解するためにも簡易なものを自作してみた。

http://www.favorite-labo.org/practice/php/key/key.php

画像表示用の image.php と、認証ページ用の key.php で動作しています。セッションとGD必須。
もっと複雑な仕組みを想像していたけど、10分くらいでできた。

投稿キーは4桁の数値にしているけど、英数字を表示させたり変なフォントにしてみたりダミーの図形や線を表示するのは難しくありません。

コードの内容もさらしておきます。ツッコミ歓迎。でも「車輪の再発明は云々」というツッコミは不要。

image.php の内容は以下のとおり。GDで画像内に文字列を表示しつつ、その文字列をセッションに格納。

<?php

session_start();

header('Content-Type: image/png');

$image = imagecreate(60, 30);

$brack = imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);

$text = rand(1000, 9999);

$start_x = 30 - (strlen($text) * imagefontwidth(5) / 2);
$start_y = 15 - imagefontheight(5) / 2;

imagestring($image, 5, $start_x, $start_y, $text, $white);

imagepng($image);
imagedestroy($image);

$_SESSION['key'] = $text;

?>

key.php の内容は以下のとおり。投稿キーが入力されると、セッション内の文字列を比較して認証します。

<?php session_start() ?>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>テスト</title>
</head>

<body>
<?php

if (isset($_POST['key'])) {
  echo '認証処理を行いました。';

  if ($_POST['key'] == $_SESSION['key']) {
    echo '認証に成功しました。';
  } else {
    echo '認証に失敗しました。';
  }
}

?>
<p><img src="./image.php" alt="image" width="60" height="30" /></p>
<form action="./key.php" method="post">
  <dl>
    <dt>キー</dt>
      <dd><input type="text" name="key" size="10" value="" /></dd>
  </dl>
  <p><input type="submit" value="認証する" /></p>
</form>
</body>

</html>

トラックバック一覧

コメント一覧