PHPユーザー登録?ログインシステム用認(rèn)証コード作成
認(rèn)証コードの解析
ログインおよび登録ページに認(rèn)証コードを設(shè)定することは、主にブルートフォースクラッキング、悪意のある登録などを防ぐために行われており、現(xiàn)在ではWebサイトの標(biāo)準(zhǔn)コンテンツとして開発されています。認(rèn)証コードを直接ユーザーの攜帯電話または電子メールに送信します。このセクションでは、最も単純な畫像認(rèn)証コードのみを検証します。このセクションを使用して、認(rèn)証コード認(rèn)証の原理を理解することができます
A。検証コードを生成するための簡単なフローチャート
具體的な実裝については以下の內(nèi)容を參照してください
検証コードの背景畫像を生成します
1. phpのGD拡張機(jī)能を有効にする
2.リソースデータの一種であるキャンバス
を作成します。操作可能な畫像リソース。
新しいキャンバスの作成(New)
mageCreatefromjpeg(畫像アドレス);
$width=60; $height=15;
$img=imageCreateTrueColor($width,$height);
$img を表示するには、var_dump() を使用してみてください。出力 リソースタイプに似ていますか? 3. キャンバスを操作します
色の割り當(dāng)て: キャンバス上で特定の色を使用する必要がある場合は、最初にその色をキャンバスに割り當(dāng)てる必要があります。
使用関數(shù):
色の識別 = imageColorAllocate(canvas, R, G, B);
$white = imageColorAllocate($img,0xff,0xff,0xff);
キャンバスを塗りつぶす: 塗りつぶし點、連続する點を同じ色で塗りつぶす(置換する)関數(shù)を使用します:
imageFill(canvas, 塗りつぶし位置 x, 塗りつぶし位置 Y, 色の識別) を完了します
位置は座標(biāo)を使用して管理されます:
原點: 0, 0、キャンバスの左上隅。
右に行くほど X 軸が増加し、下に行くほど Y 軸が増加します。
//キャンバスに色を塗りつぶす
imageFill($img,0,0,$white);
4. キャンバスを出力する
キャンバスが出てきます。
通常:
畫像ファイルに出力します。
ダイレクト出力。
使用関數(shù):
imagePNG(canvas[, file address])://指定されたアドレスにファイルを生成します
imageJPEG();//Webページに直接出力します。検証コードはこのメソッドを使用します
imageGIF();//前と同じ
2 番目のパラメータがない場合は、直接出力を意味します。
ブラウザに直接出力するには、応答データのタイプが PNG 形式の畫像であることをブラウザに通知する必要があります:
Content-type
//直接出力
header(' Content-Type:image /jpeg;');
imageJPEG($img);
注: キャンバスは、さまざまな形式で複數(shù)回出力できます。
5. キャンバスリソースを破棄します
関數(shù)を使用します: imageDestroy();
imageDestroy($img);
1. まず、使用可能なすべての文字を定義し、すべての文字の合計長と生成する検証コードの長さを取得する必要があります。コードは次のとおりです: //検証コードの値を生成します
$chars = '1234567890' ;//出現(xiàn)する可能性のある文字$chars_len=strlen($chars);
$code_len=4;//確認(rèn)コードの長さ$code='';//検証コード文字列
2 4回、毎回すべての可能な文字から數(shù)字を取り出し、最後に4つの數(shù)字を結(jié)合して検証コードの値を生成します
for($i=1) ;$i<=$code_len ;++$i){ $rand=mt_rand(0,$chars_len-1);//0 ~ 9 から任意の數(shù)字をランダムに選択します $code.=$rand;//番號を Together に送信します
}
3. セッションを開き、検証のためにセッションに検証コード値を保存します
//検証のためにセッションに保存します------ - ---------------session_start();$_SESSION[' ver_code']=$code;
認(rèn)証コードの値を認(rèn)証コードの背景畫像に入れます
1. 検証コード値にランダムな色を割り當(dāng)てます
//文字列の色をランダムに割り當(dāng)てます$str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand( 0,255)) ;
2. 認(rèn)証コードの値を中央に配置し、背景畫像に書き込みます
//文字列のセンタリングを計算します
//文字列サイズ
$font=5;
//キャンバスサイズ
$img_w=imageSX($img);
$img_h=imageSY($img);
//フォント
$font_w=imagefontwidth($font);
$font_h=imagefontheight($font);
//文字列のサイズ
$code_w=$font_w*$code_len;
$code_h=$font_h;
$x = ($img_w-$code_w)/2;
$y=($img_h-$code_h)/2;
//検証コードをキャンバスに出力します--------------- - ------------
imageString($img,$font,$x,$y,$code,$str_color);
3. 認(rèn)証コードを出力します
/ /直接出力
imageJPEG($img);
imageDestroy($img);
完全なコードは次のとおりです
<?php //生成驗證碼背景圖--------------------------------- header('Content-Type:image/jpeg;'); //背景圖尺寸 $width=60; $height=15; //創(chuàng)建畫布 $img=imageCreateTrueColor($width,$height); //分配顏色 $white = imageColorAllocate($img,0xff,0xff,0xff); //填充顏色到畫布 imageFill($img,0,0,$white); //生成驗證碼的值---------------------------------- $chars = '1234567890';//所以可能出現(xiàn)的字符 $chars_len=strlen($chars); $code_len=4;//驗證碼的長度 $code='';//初始化驗證碼字符串 for($i=1;$i<=$code_len;++$i){ $rand=mt_rand(0,$chars_len-1);//隨機(jī)取0-9中的任意一個數(shù)字 $code.=$rand;//將取出來的數(shù)字連接在一起 } //存入session中,用于驗證------------------------- session_start(); $_SESSION['ver_code']=$code; //隨機(jī)分配字符串顏色------------------------------ $str_color=imageColorAllocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)); //計算字符串的居中 //字符串大小 $font=5; //畫布尺寸 $img_w=imageSX($img); $img_h=imageSY($img); //字體的尺寸 $font_w=imagefontwidth($font); $font_h=imagefontheight($font); //字符串的尺寸 $code_w=$font_w*$code_len; $code_h=$font_h; $x=($img_w-$code_w)/2; $y=($img_h-$code_h)/2; //把驗證碼輸出到畫布上---------------------------- imageString($img,$font,$x,$y,$code,$str_color); //直接輸出 imageJPEG($img); imageDestroy($img); ?>