ホームページ  >  記事  >  バックエンド開発  >  PHP 検証コードの生成方法と一般的な問題の解決策

PHP 検証コードの生成方法と一般的な問題の解決策

WBOY
WBOYオリジナル
2023-06-09 10:17:181835ブラウズ

インターネットの継続的な発展に伴い、人々のデータ保護への関心はますます高まっており、悪意のあるマシンによる攻撃や登録を防ぐために、Web サイトへのログインや登録などの操作は検証コードによって検証される必要があります。今回は、PHP 検証コードの生成方法とよくある問題の解決策を紹介します。

1. 検証コード生成方法

  1. PHP GD ライブラリを使用して画像検証コードを生成する

GD ライブラリは、PHP のグラフィック処理ライブラリであり、グラフィック操作機能が豊富。 GD ライブラリを使用すると、画像検証コードを迅速に生成できます。

手順は次のとおりです。

① キャンバスを初期化します。imagecreatetruecolor() 関数は、指定されたパラメーターに従って True Color キャンバスを作成できます。たとえば、imagecreatetruecolor(120, 40) は 120x40 ピクセルのトゥルーカラー キャンバスを作成します。

② 干渉背景の描画: imagerectangle() 関数を使用してループ内に干渉線を描画し、検証コードがマシンによって認識されにくくします。

③ ランダムな文字列の生成: ランダム関数 (rand() および mt_rand()) を使用して、検証コード イメージ内の文字としてランダムな文字列の文字列を生成します。

④ 検証コード文字をキャンバスに描画する: imagechar() 関数を使用して、ランダムな文字列をキャンバスに描画します。

⑤ 検証コード画像をブラウザに出力します。 header() 関数を使用して Content-Type を image/png または image/jpeg に設定し、imagepng() または imagejpeg() 関数を使用して出力します。キャンバスをブラウザに転送して表示します。

次は、単純な PHP GD ライブラリ検証コード生成コードです:

<?php
session_start();
// 创建画布
$img = imagecreatetruecolor(120, 40);
//生成干扰线
for ($i = 0; $i < 5; $i++) {
    $color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($img, rand(0, 120), rand(0, 40), rand(0, 120), rand(0, 40), $color);
}
//生成随机验证码
$code = '';
for ($i = 0; $i < 4; $i++) {
    $code .= rand(0, 9);
}
//绘制验证码
$font = 'arial.ttf';
$text_color = imagecolorallocate($img, rand(0, 255), rand(0, 255), rand(0, 255));
imagettftext($img, 18, rand(-10, 10), 10, 24, $text_color, $font, $code);
//输出验证码图片到浏览器
header('Content-Type: image/png');
imagepng($img);
imagedestroy($img);
//将生成的验证码存储到Session中
$_SESSION['code'] = $code;
?>

2. PHP GD ライブラリを使用して数値検証コードを生成します

数値検証コードは次のとおりです。英数字 CAPTCHA と混合した方がシンプルで理解しやすいため、多くの Web サイトで数字 CAPTCHA が使用されています。以下は、PHP GD ライブラリを使用してデジタル検証コードを生成するコード例です:

<?php
session_start();
// 创建画布
$image = imagecreatetruecolor(120, 40);
// 生成干扰背景
$gray = imagecolorallocate($image, 200, 200, 200);
imagefill($image, 0, 0, $gray);
for ($i = 0; $i < 50; $i++) {
    $black = imagecolorallocate($image, 0, 0, 0);
    imagesetpixel($image, rand(0, 120), rand(0, 40), $black);
}
// 生成随机数字
$code = '';
for ($i = 0; $i < 4; $i++) {
    $code .= rand(0, 9);
}
// 将验证码写入画布中
$font = 'arial.ttf';
$white = imagecolorallocate($image, 255, 255, 255);
imagettftext($image, 20, 0, 15, 30, $white, $font, $code);
// 将验证码输出到浏览器
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
// 存储验证码到Session中
$_SESSION['code'] = $code;
?>

3. サードパーティ ライブラリを使用して検証コードを生成します

PHP GD ライブラリですが先ほど述べた方法は強力ですが、生成される検証コード イメージが単純すぎてロボットによって簡単に解読されるなど、いくつかの欠点もあります。したがって、いくつかのサードパーティ ライブラリを使用して、より複雑な検証コードを生成できます。

たとえば、Gregwar/Captcha は、さまざまなスタイルの検証コード イメージを生成できる、人気のあるサードパーティ検証コード ライブラリです。利用方法も非常に簡単で、ライブラリをダウンロードしてcaptcha.phpファイルをインポートし、create()関数を呼び出して検証コードを生成するだけです。

次は、Gregwar/Captcha ライブラリを使用して検証コードを生成するコード例です:

<?php
session_start();
require_once 'Captcha/autoload.php';
$captcha = new GregwarCaptchaCaptchaBuilder;
//配置验证码参数
$captcha->build(
    120,
    40,
    null, //font color
    true //background image
);

header('Content-Type: image/jpeg');
$captcha->output();
$code = $captcha->getPhrase();

$_SESSION['code'] = $code;
?>

2. 一般的な問題の解決策

  1. 検証コードパターン

上で述べたように、生成される検証コードパターンが単純すぎると、ロボットによって簡単に解読されてしまいます。この問題を解決するために、干渉線、円弧、背景パターンなどのさまざまなノイズ ポイントを追加できます。この方法で生成された検証コードはより複雑になり、セキュリティが向上します。

  1. 複数の検証コードを同時に生成する

一部のロボットは、検証コードを解読するために 1 秒間に複数の検証コードを生成しようとします。この攻撃を防ぐために、TimeDelay を追加できます。つまり、ロボットが検証コードを頻繁に送信する場合、再送信する前に一定期間待機させることができます。これにより、ボット攻撃を効果的に防止できます。

  1. 検証コードの有効期限は不明です

実際のプロジェクトでは、時間が経つと検証コードのセキュリティが低下するため、検証コードがあまり長く存在しないようにしてください。 code セックスは減ります。認証コード生成後に認証コードの有効期限(例えば30秒)を設定し、認証コード送信時に認証を行う必要があり、有効期限を超えた場合は認証コードを再生成する必要があります。

最後に、実際のアプリケーションでは、検証コード保護の設定に加えて、SQL インジェクション、XSS 攻撃、その他のソリューションなど、他の形式のセキュリティ保護対策も必要であることに注意する必要があります。ウェブサイトのセキュリティを保護します。

以上がPHP 検証コードの生成方法と一般的な問題の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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