現在、検証コードは Web サイトにおける非常に基本的な知識ポイントとなっています。検証コードの存在により、悪意のあるパスワードのクラッキング、チケット詐欺、およびその他の行為を防ぐことができます。特定のユーザーに対するブルートフォースクラッキングを効果的に防止できます。
それでは、当時 PHP で使用されていた検証コードについて学びましょう。
まず、4桁の認証コードを例に挙げます(同じ原理が複数桁の認証コードにも当てはまります)。
現在、ほとんどの Web サイトでは依然として静的画像検証コードが使用されています。これは実装が簡単で便利であり、もちろん、これが基礎でもあります。 原理は、PHPの描画機能を使用してテキストを画像に描画し、ページに返すことです。したがって、問題を解決するには 3 つのステップしかありません:
もちろん、PHP はデフォルトでは描画機能を有効にしていないため、まず php.ini 設定ファイルで描画機能を有効にします: ;extension=php_gd2.dll を検索し、その前のセミコロン を削除します。 (忘れずに保存してください!)
最初のポイントに基づいて、誰もがまずデジタル認証コードについて考えるべきです。それは簡単で、いくつかの数字をランダムに生成して、Jiang Zi のようにそれらを組み合わせるだけです。
1 $validateCode = ''; 2 for ($i = 0; $i $i ++) { 3 $validateCode .= rand(0, 9); 4} 5 エコー $validateCode; コードを表示では、よく考えてみてください。現在の Web サイトの認証コードには文字が含まれていますが、このものには文字がありません。何が問題なのでしょうか?そこで、上記を 16 進数に変換すればいいのではないかと考えました。
1 $validateCode = ''; 2 for ($i = 0; $i $i ++) { 3 $validateCode .= dechex(rand(0, 16)); 4} 5 エコー $validateCode; コードを表示 ちょっと賢すぎるように思えますが、考えてみてください。文字はいくつかありますが、a、b、c、d、e、f しかないので、すべての文字が必要な場合はどうなるでしょうか。はは、それについて考えたときに、文字列内のすべての文字と数字をリストし、ランダムな添え字を使用して
対応する値をランダムに取得することを思いつき、次のようになりました。
はは、最終的には認証コードの乱数のように見えますが、以下のメソッドを見ると、いつも混乱してしまいます:
リーリーstr_shuffle メソッドは文字列の内容をスクランブルし、substr($str, 0, 4) は最初の 4 つの数値を取得します。これは全く問題ありません!ただし、よく見ると、そのような確認コードの内容が繰り返されることはないことがわかります。
上記の検証コードが生成され、その後PHPで検証コードが描画されます。
1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4); 2 3 // 幅110px、高さ25pxの画像を作成します 4 $img = imagecreatetruecolor(110, 25); 5 // 画像の背景色を黒に設定し、色の値はRGBに対応します 6 $bgcolor = imagecolorallocate($img, 0, 0, 0); 7 8 // ホワイトを作成する 9 $white = imagecolorallocate($img, 255, 255, 255); 10 11 // 2 番目のパラメータはテキストのサイズで、1 ~ 5 の範囲のみを指定できます。3 番目のパラメータは x 座標、4 番目のパラメータは y 座標です。 5 番目のパラメータはテキストの内容、6 番目のパラメータはテキストの色です 12 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); 13 14 // 2 番目のパラメータはテキストのサイズで、1 ~ 5 の範囲のみを指定できます。3 番目のパラメータは x 座標、4 番目のパラメータは y 座標です。 5 番目のパラメータはテキストの内容、6 番目のパラメータはテキストの色です 15 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); コードを表示
もちろん、この場合、確認コードは黒い背景に白い文字だけなので、認識しやすくなりますが、さらに難易度を高めるために、確認コードに重ねて数行追加します。
1 $validateCode = substr(str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'), 0, 4); 2 3 // 幅110px、高さ25pxの画像を作成します 4 $img = imagecreatetruecolor(110, 25); 5 // 画像の背景色を黒に設定し、色の値はRGBに対応します 6 $bgcolor = imagecolorallocate($img, 0, 0, 0); 7 // imagefill($img, 10, 10, $bgcolor); 8 9 // 白を作成します 10 $white = imagecolorallocate($img, 255, 255, 255); 11 12 for ($i = 0; $i $i ++) { 13 // 画像上に線を描きます。2 番目のパラメータは線の x 開始座標を表し、3 番目のパラメータは線の y 開始座標を表し、4 番目のパラメータは線の終了座標を表します。 x、5番目のパラメータはyの終了座標を表し、6番目のパラメータはここでランダムな色を生成します。 14 imageline($img, rand(0, 110), rand(0, 50), rand(0, 110), rand(0, 50), imagecolorallocate($ img, rand(0, 255), rand(0, 255), rand(0, 255))); 15} 16 17 // 2 番目のパラメータはテキストのサイズで、1 ~ 5 の範囲のみを指定できます。3 番目のパラメータは x 座標、4 番目のパラメータは y 座標です。 5 番目のパラメータはテキストの内容、6 番目のパラメータはテキストの色です 18 imagestring($img, rand(3, 5), rand(0, 80), rand(2, 10), $validateCode, $white); 19 20 // 画像に戻る 21 header('Content-type: image/png'); 22imagepng($img); コードを表示結果はこのようになります。もちろん、検証コードを実装したい場合は、サーバーのセッション $_SESSION['validate'] に検証コードによって生成された乱数を保存する必要があります。 = $validateCode; そして、クライアントが入力した検証コードと比較するだけです。これは PHP の検証コードの実装方法です。もちろん、これは最も基本的なコードであり、アイデアに基づいて算術検証コードやその他の検証コードを実装することができます。退屈を減らし、より安全にするために。
他に素晴らしい確認コードを持っている人はいますか?
それは、php.ini で register_global = off になっているためです。
これを on に変更するだけですが、php5 以降はデフォルトで off に設定されています。
値を直接取得するのは安全ではないため、ユーザーがあなたの値を知っている場合は考えてください。セッションの名前
get メソッドまたは post メソッドを通じてセッションを変更できますか?
値を取得するために必要なのは名前だけだからです!
php5 は一般的にスーパーグローバル変数を使用します!
$_GET
$_POST
$_COOKIE
$_SESSION
元の投稿者の本は少し古いようで、session_register は推奨されなくなりました。 php5 に、 $_SESSION['yzm'] = 100; を直接割り当てることができるようになりました。
注: php6 がリリースされたと聞きました!
原因が判明しました: $rand 変数が初期化されておらず、直接出力すると警告が表示されます。解決策は、for ステートメントの前に $rand=''; を追加することです。問題はありません。
session_start();
$rand='';
for($i=0;$i $rand.=dechex(rand(0,15));
}
$_SISSION[ 'rand']=$rand;
$bg=imagecreatetruecolor(100,30);
$im=imagecolorallocate($bg,0,0,0);
$color=imagecolorallocate($bg,255,255,255);
imagestring ($bg,5,0,0,$rand,$color);
header("Content-type: image/jpeg");
imagejpeg($bg);