ホームページ  >  記事  >  バックエンド開発  >  PHP 検証コードの実装原理の詳細な紹介

PHP 検証コードの実装原理の詳細な紹介

黄舟
黄舟オリジナル
2017-03-11 10:38:131518ブラウズ

拡張

gd 拡張を有効にする必要があります。次のコードを使用して、gd 拡張が有効かどうかを確認できます。

<?phpecho "Hello World!!!!";echo phpinfo();?>

次に、ブラウザで gd オプションを検索Ctrl+Fして、この拡張機能がインストールされているかどうかを確認します。インストールされていない場合は、自分で拡張機能をインストールする必要があります。

背景画像

imagecreatetruecolor

はデフォルトで黒の背景を生成します

<?php
// 使用gd的
imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,30);// 在显示这张图片的时候一定要先声明头信息
header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

imagecolorallocate

塗りつぶしの色を作成し、imagefill(image, x, y, color) メソッドを使用してアタッチします。

<?php
// 使用gd的
imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,30);// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上
imagefill($image,0,0,$bgcolor);// 在显示这张图片的时候一定要先声明头信息
header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

imagepng

このメソッドを使用する前に、必ず最初にヘッダー情報を設定してください。そうしないと、画像が正常に表示されません

imagedestory(image)

リソースをタイムリーに解放すると、サーバーリクエストの負荷が軽減されます。

シンプルなデジタル検証コード

imagecolorallocate

後の処理を容易にするために色情報を生成します。

$fontcolor=imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));

imagestring

画像の対応する位置にコンテンツ情報を書き込みます。

imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);

認識干渉を増やす

ポイントを追加

// 生成一些干扰的点,这里是200个
for($i=0;$i<200;$i++){    
$pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
}

線を追加

// 生成一些干扰线 这里是5个
for($i=0;$i<5;$i++){    // 设置为浅色的线,防止喧宾夺主
    $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);

}

数字とアルファベットを混ぜた確認コード

<?php
// 使用gd的imagecreatetruecolor();创建一张背景图
$image = imagecreatetruecolor(100,40);// 生成填充色
$bgcolor = imagecolorallocate($image,255,255,255);// 将填充色填充到背景图上
imagefill($image,0,0,$bgcolor);//////// 生成随机4位字母以及数字混合的验证码
for($i=0;$i<4;$i++){    
$fontsize = rand(6,8);    
$fontcolor = imagecolorallocate($image,rand(0,255),rand(0,255),rand(0,255));    
// 为了避免用户难于辨认,去掉了某些有歧义的字母和数字
    $rawstr = &#39;abcdefghjkmnopqrstuvwxyz23456789ABCDEFGHJKLMNOPQRSTUVWXYZ&#39;;    
    $fontcontent = substr($rawstr,rand(0,strlen($rawstr)),1);    
    // 避免生成的图片重叠
    $x += 20;    $y = rand(10,20);
    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);   
}// 生成一些干扰的点,这里是200个for($i=0;$i<200;$i++){    
$pointcolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imagesetpixel($image,rand(0,100),rand(0,30),$pointcolor);
}
// 生成一些干扰线 这里是4个for($i=0;$i<4;$i++){    
// 设置为浅色的线,防止喧宾夺主
    $linecolor = imagecolorallocate($image,rand(50,255),rand(50,255),rand(50,255));
    imageline($image,rand(0,99),rand(0,29),rand(0,99),rand(0,29),$linecolor);

}


header(&#39;content-type:image/png&#39;);

imagepng($image);// 释放资源,销毁执行对象imagedestroy($image);

確認コードを使用する

セッションを開く時間

注: セッションは最初に開く必要があります

検証の原則

検証プロセスは、クライアントが入力した検証コードとセッションドメインに存在する検証コードを比較することです。つまり:

if(isset($_REQUEST[&#39;checkcode&#39;])){
        session_start();        
        if($_REQUEST[&#39;checkcode&#39;]==$_SESSION[&#39;checkcode&#39;]){            
        echo "<font color=&#39;green&#39;>Success!</font>"; 
        }else{            
        echo "<font color=&#39;red&#39;>Failed!</font>";    
        }        
        exit();
    }

検証の最適化

しかし、このように単に検証することには欠点があります。それは、文字の大文字化がエラーになりやすいということです。したがって、ユーザーが入力したすべての値を小文字に変更する変換を行う必要があります。

if(strtolower($_REQUEST[&#39;checkcode&#39;])==$_SESSION[&#39;checkcode&#39;]){···}

小規模なケース

確認コードの生成

フォーム認証

<?php
header("Content-Type:text/html;charset=utf8");        
if(isset($_REQUEST[&#39;checkcode&#39;])){
            session_start();            
            if(strtolower($_REQUEST[&#39;checkcode&#39;])==$_SESSION[&#39;checkcode&#39;]){                
            echo "<font color=&#39;green&#39;>Success!</font>"; 
            }else{                
            echo "<font color=&#39;red&#39;>Failed!</font>";    
            }            
            exit();
        }?>
        <!DOCTYPE html><html><head>
    <meta charset="utf-8" />
    <title>验证验证码信息</title>
    <script>
        function change(){
            document.getElementById("image_checkcode").src=&#39;./store.php?r=&#39;+Math.random();  
        }    </script></head><body><form action="./form.php" method="post"><p>验证码图片:</p>
        <img id="image_checkcode" src="./store.php?r=<?php echo rand();?>"   />
        <a href="javascript:void(0)" onclick="change()">看不清楚</a>
        <br/>请输入验证码<input type="text" name="checkcode" /><br /><p>
        <input type="submit" value="提交" /></p></form>
        </body></html>

まとめ

最後にまとめをしておきます。

  • PHP を使用して検証コードを作成するには、gd 拡張機能のサポートが必要です。

  • imagecreatetruecolor メソッドを使用して背景色を生成し、imagefill を使用して imagecolorallocate によって生成された色で背景を塗りつぶします。

  • imagestringを使用して検証コードと背景画像を結合します

  • imagesetpixelを使用して干渉点を追加します

  • imagelineを使用して干渉線を追加します

  • セッションを使用する前に、session_start()メソッドを有効にする必要があります最初に

  • JavaScript を使用して検証コードの src を動的に変更し、ユーザーの「変更」のニーズに応えます。

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

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