包括的な PHP セッション検証コードと個人識別防止
検証コードの開発過程における
3 誤解:
1. ? 背景の干渉: 基本的に干渉線、干渉点、干渉画像はなく、プログラムは高輝度調整によって簡単に除去できます。
2. ? キャラクターの回転: 学習して数回回転させた後、クラッキングロボットは を取得できます。 90% 上記の正認識率は、通常のフォントを使用した場合、 に近い値が得られます。 100% の認識。
3. ? ランダムな間隔: 高輝度を抽出した後、画像の切り取り方法を使用することで、ランダムな間隔を簡単に削除できます。
?
クラックを防ぐ:
1. ? 背景の干渉線は文字と干渉し、文字と同じ色を使用する必要があり、高輝度コントラスト色抽出法による文字の学習を破壊する可能性があります。 QQ はい。
2. ? ベクトル変換: 欲しい Google 、 さん 、 ヤフー はすべて、文字をねじったり変形させたりするこの倒錯的な方法を採用しています。対応する固定された形状がないため、基本的に機械の認識率はゼロです。 ユーザーは損失を認識していない可能性もあります。検証コードの画像は大きくする必要があります。
3. ? 文字の接着により、文字切り取り方法で分離された文字が破壊される可能性があります。 Google これも便利です、 QQ も使用されます。
4. ? 中国の検証コード。中国の検証コードの認識は比較的困難ですが、現在では徐々に学習され、解読されています。 (香港と台湾では繁体字中国語が使用されます)
5、? 文字の回転: 文字と一緒に動作させるには、検証コードを機械でクラックする可能性がほとんどありません。 ランダムな背景画像、ランダムなフォントを追加し、文字や数字をわずかに回転させます。位置は固定されておらず、わずかに歪んでいます。
?
注:
$mode=7 の font.ttf のフォントは中国語をサポートしている必要があります。サポートしていないと文字化けが発生します。
サーバー側で検証を行う場合、セッションに保存されている検証文字とユーザーが送信した文字を比較し、同じであれば検証は成功します。
<?php /* * @Date 2011-2-24 * @Author hudeyong926 */ function getCode($length = 32, $mode = 0) { switch ($mode) { case '1' : $str = '123456789'; break; case '2' : $str = 'abcdefghijklmnopqrstuvwxyz'; break; case '3' : $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; break; case '4' : $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break; case '5' : $str = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789'; break; case '6' : $str = 'abcdefghijklmnopqrstuvwxyz1234567890'; break; case '7' ://中文验证码 break; default : $str = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789'; break; } $result = ''; for($i = 0; $i < $length; $i ++) { if ($mode == 7) { $str [$i] = chr ( mt_rand ( 176, 215 ) ) . chr ( mt_rand ( 161, 249 ) ); $str [$i] = iconv ( "GB2312", "UTF-8", $str [$i] ); //imagettftext是utf-8的,所以先转换下 $result .= $str [$i]; } else { $l = strlen ( $str ) - 1; $num = mt_rand ( 0, $l ); $result .= $str [$num]; } } return $result; } //建立验证图片 function createAuthNumImg($randStr, $fontName, $imgW = 100, $imgH = 40) { header ( "content-type: image/png" ); $image = imagecreate ( $imgW, $imgH ); $fontSize = 20;//字号 //$green = imagecolorallocate($image,0x6b,0xc1,0x46); $gray = imagecolorallocate ( $image, 228, 228, 228 ); //灰色 $red = imagecolorallocate ( $image, 255, 102, 204 );//粉色 $blue = imagecolorallocate($image,0x53,0x68,0xbd); $colors = array($red, $gray, $blue); $color_b = imagecolorallocate ( $image, 0, 0, 0 ); //黑色 for($i = 0; $i < 1000; $i ++) { //绘背景干扰点 imagesetpixel ( $image, mt_rand ( 0, $imgW ), mt_rand ( 0, $imgH ), $colors[rand(0,count($colors)-1)]); } imagerectangle ( $image, 0, 0, $imgW - 1, $imgH - 1, $color_b );//绘制边框 imagettftext ( $image, $fontSize, 5, 3, 25, $color_b, $fontName, $randStr);///将验证字符绘入图片 字符旋转 for($i=0; $i<2; $i++){ //绘背景干扰线 imageline($image, mt_rand(0,5), mt_rand(6,18), mt_rand(65,$imgW), mt_rand(6,$imgH), $color_b);//一条干扰线 } imagepng ( $image ); imagedestroy ( $image ); } session_start (); $verifyCode = GetCode ( 5 ); $_SESSION ['VERIFY_CODE'] = $verifyCode ; createAuthNumImg ( $verifyCode, "font.ttf", 75, 30); //字体存放路径,如果你没有文件就去C:\WINDOWS\Fonts文件中找一个吧。 /** 问答模式 $a=GetCode(2,1); $b=GetCode(1,1); $passPort = $a."+".$b."=?"; $verifyCode = $a+$b; $_SESSION ['VERIFY_CODE'] = $verifyCode ; createAuthNumImg ( $passPort, "font.ttf", 75, 30); */ ?>
中国語の文字の長さは 2 文字であり、1 つの中国語の位置は 2 つの非中国語文字に相当します。
<?php echo strlen('中'); echo strlen('ad');?>
ロボットによるクラッキングを避けるために、検証コードの視覚効果はますます悪化しており、その結果、多くの Web サイトでは「よく見えませんか? もちろん更新してください」などの機能が追加されています。これは単純なページ更新ではなく、検証コード部分のみが更新されるため、ユーザーは新しい検証コードを取得します。インターネット上で他の人が書いたいくつかの方法を読みました。ここでは 2 種類の方法を紹介します。
最初の方法は、onclick を使用して検証コードの画像を直接クリックするだけです。ただし、この機能については検証コードの後に説明するのが最善です。
<img src="validimg.jsp" alt="看不清?请刷新" width="50" height="20" onclick="this.src=this.src+'?'+Math.random()" />
2 番目の方法は、JavaScript を使用することです:
<img src="validimg.jsp" width="50" height="20" > <a href="JavaScript:reloadImage("validimg.jsp" );">刷新</a> <script language="JavaScript"> function reloadImage(url){ document.formName.img1.src = url+Math.random(); } </script>
?
?