ホームページ  >  記事  >  バックエンド開発  >  PHPで検証コードを実装する方法

PHPで検証コードを実装する方法

WBOY
WBOYオリジナル
2023-05-20 11:31:515967ブラウズ

インターネットの継続的な発展に伴い、セキュリティを確保するために検証コードを使用する必要がある Web サイトがますます増えています。認証コードは、人間の能力に依存し、コンピュータでは解読できない認証技術であり、Webサイトの登録、ログイン、パスワード検索などに広く使用されています。 PHPを使用して認証コード機能を実装する方法を紹介します。

1. 検証コード画像の生成

検証コード画像の生成は検証コード機能の中核であり、ランダムな文字を生成し、それを画像としてレンダリングしてユーザーに表示する必要があります。ユーザー。 PHP では、GD ライブラリを使用してイメージを生成できます。

GD ライブラリは、イメージを動的に作成するための PHP 拡張機能であり、イメージの作成、イメージの変更、イメージの保存などの操作に使用できるさまざまな関数を提供します。検証コード イメージは、GD ライブラリを通じて簡単に作成できます。

検証コードを生成する手順は次のとおりです。

  1. 画像サイズ、色、その他の属性を設定します
  2. ランダムな文字列を生成します
  3. 文字列をレンダリングします
  4. 干渉線、干渉点などを画像に追加します

以下は具体的なコードの実装です:

<?php
//设置图片大小,这里是120x40
$image_width = 120;
$image_height = 40;

//创建画布
$image = imagecreatetruecolor($image_width, $image_height);

//设置背景色为白色
$bg_color = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg_color);

//生成随机字符串
$code = "";
$charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$charset_length = strlen($charset);

for ($i = 0; $i < 4; $i++) {
    $rand_index = rand(0, $charset_length - 1);
    $rand_char = substr($charset, $rand_index, 1);
    $code .= $rand_char;
}

//将字符串渲染到图像中
$font_size = 20;
$font_color = imagecolorallocate($image, 0, 0, 0);

$x = 10;
$y = ($image_height - $font_size) / 2;
for ($i = 0; $i < 4; $i++) {
    $char = substr($code, $i, 1);
    imagettftext($image, $font_size, rand(-10, 10), $x, $y, $font_color, "arial.ttf", $char);
    $x += $font_size + rand(-5, 5);
}

//添加干扰线、干扰点等
for ($i = 0; $i < 6; $i++) {
    $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($image, rand(0, $image_width), rand(0, $image_height), rand(0, $image_width), rand(0, $image_height), $line_color);
}

for ($i = 0; $i < 50; $i++) {
    $point_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($image, rand(0, $image_width), rand(0, $image_height), $point_color);
}

//输出图像
header("Content-type:image/png");
imagepng($image);

//销毁图像
imagedestroy($image);
?>

上記のコードランダムな検証コード画像が生成され、ブラウザに表示されます。このうち、Arial フォント、黒文字、白背景、干渉線 6 点、干渉点 50 点が使用されます。必要に応じてカスタマイズできます。

2. 検証コードの検証

検証コード画像を生成した後、ユーザーが入力した検証コードと生成された検証コードを比較して、ユーザーが正しい情報を入力したかどうかを確認する必要があります。検証コード。 。 PHP では、生成された検証コード文字列を後続の検証のためにセッションに保存できます。

具体的な手順は次のとおりです。

  1. 生成された検証コード文字列をセッションに保存します
  2. ユーザー入力検証コード
  3. ユーザー入力を検証します検証コードはセッションに保存されている検証コードと同じですか?

コードの実装は次のとおりです:

<?php
//生成验证码
session_start();
$code = "";
$charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$charset_length = strlen($charset);

for ($i = 0; $i < 4; $i++) {
    $rand_index = rand(0, $charset_length - 1);
    $rand_char = substr($charset, $rand_index, 1);
    $code .= $rand_char;
}

$_SESSION["captcha"] = $code;

//展示验证码图片
$image_width = 120;
$image_height = 40;
$image = imagecreatetruecolor($image_width, $image_height);
$bg_color = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg_color);

$font_size = 20;
$font_color = imagecolorallocate($image, 0, 0, 0);

$x = 10;
$y = ($image_height - $font_size) / 2;
for ($i = 0; $i < 4; $i++) {
    $char = substr($code, $i, 1);
    imagettftext($image, $font_size, rand(-10, 10), $x, $y, $font_color, "arial.ttf", $char);
    $x += $font_size + rand(-5, 5);
}

header("Content-type:image/png");
imagepng($image);
imagedestroy($image);

//校验验证码
session_start();
if (isset($_POST["captcha"])) {
    $user_input = $_POST["captcha"];
    if (strcasecmp($user_input, $_SESSION["captcha"]) != 0) {
        echo "验证码错误";
    } else {
        echo "验证码正确";
    }
}
?>

上記のコードでは、セッションはセッションに保存するために使用されます。生成された検証コード文字列と、入力された検証コードをセッションに保存されている検証コードと比較します。このうち strcasecmp 関数は、2 つの文字列を大文字と小文字を区別せずに比較し、同じ場合は 0 を返し、異なる場合は 0 以外の値を返す関数です。

概要

PHP を介して認証コード機能を実装すると、Web サイトのセキュリティを効果的に確保できます。検証コード画像を生成する際、GDライブラリを利用することで、さまざまな色やフォントの検証コード画像を簡単に作成したり、干渉線や干渉点などを追加してセキュリティを高めることができます。検証コードを検証する場合、生成された検証コード文字列は、後の比較のためにセッションに保存する必要があります。

以上がPHPで検証コードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。