本文目錄一覽:
- 1、如何用PHP生成驗證碼
- 2、php 簡訊驗證碼資料庫如何設計
- 3、php圖片驗證碼實現
- 4、PHP圖形驗證碼識別
- 5、php 識別驗證碼
如何用PHP生成驗證碼
PHP生成驗證碼的原理:使用PHP的GD庫,生成一張帶驗證碼的圖片,並將驗證碼保存在Session中。PHP生成驗證碼的大致流程有:
1、產生一張png的圖片;
2、為圖片設置背景色;
3、設置字體顏色和樣式;
4、產生4位數的隨機的驗證碼;
5、把產生的每個字元調整旋轉角度和位置畫到png圖片上;
6、加入噪點和干擾線防止註冊機器分析原圖片來惡意破解驗證碼;
7、輸出圖片;
8、釋放圖片所佔內存。
session_start();
getCode(4,60,20);
function getCode($num,$w,$h) {
$code = “”;
for ($i = 0; $i $num; $i++) {
$code .= rand(0, 9);
}
//4位驗證碼也可以用rand(1000,9999)直接生成
//將生成的驗證碼寫入session,備驗證時用
$_SESSION[“helloweba_num”] = $code;
//創建圖片,定義顏色值
header(“Content-type: image/PNG”);
$im = imagecreate($w, $h);
$black = imagecolorallocate($im, 0, 0, 0);
$gray = imagecolorallocate($im, 200, 200, 200);
$bgcolor = imagecolorallocate($im, 255, 255, 255);
//填充背景
imagefill($im, 0, 0, $gray);
//畫邊框
imagerectangle($im, 0, 0, $w-1, $h-1, $black);
//隨機繪製兩條虛線,起干擾作用
$style = array ($black,$black,$black,$black,$black,
$gray,$gray,$gray,$gray,$gray
);
imagesetstyle($im, $style);
$y1 = rand(0, $h);
$y2 = rand(0, $h);
$y3 = rand(0, $h);
$y4 = rand(0, $h);
imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED);
imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED);
//在畫布上隨機生成大量黑點,起干擾作用;
for ($i = 0; $i 80; $i++) {
imagesetpixel($im, rand(0, $w), rand(0, $h), $black);
}
//將數字隨機顯示在畫布上,字元的水平間距和位置都按一定波動範圍隨機生成
$strx = rand(3, 8);
for ($i = 0; $i $num; $i++) {
$strpos = rand(1, 6);
imagestring($im, 5, $strx, $strpos, substr($code, $i, 1), $black);
$strx += rand(8, 12);
}
imagepng($im);//輸出圖片
imagedestroy($im);//釋放圖片所佔內存
}
php 簡訊驗證碼資料庫如何設計
php做簡訊驗證碼,需要將手機號,發送的驗證碼和時間這幾個存到資料庫,在添加到資料庫的時候,要判斷裡面有沒有要存的手機號,有的話,就更新驗證碼和時間,沒有就是添加,在使用驗證碼判定的時候,取出驗證碼和時間,判斷驗證碼是否正確,時間是否在自己設置的有效時間段內,整個過程就是這樣。
php圖片驗證碼實現
可以用php的GD庫做
//隨機生成驗證碼
class randomString
{
function createRandomStr($strLen)
{
list($usec, $sec) = explode(‘ ‘, microtime());
(float) $sec + ((float) $usec * 100000);
$number = ”;
$number_len = $strLen;
$stuff = ‘1234567890abcdefghijklmnopqrstuvwxyz’;//附加碼顯示範圍ABCDEFGHIJKLMNOPQRSTUVWXYZ
$stuff_len = strlen($stuff) – 1;
for ($i = 0; $i $number_len; $i++) {
$number .= substr($stuff, mt_rand(0, $stuff_len), 1);
}
return $number;
}
}
通過ZD庫將驗證碼變成圖片
$number = $createStr-createRandomStr(‘4’);//驗證碼的位數
$number_len = strlen($number);
$_SESSION[“VERIFY_CODE”] = $number;
// 生成驗證碼圖片
$img_width = 60;
$img_height = 20;
$img = imageCreate($img_width, $img_height);
ImageColorAllocate($img, 0x6C, 0x74, 0x70);
$white = ImageColorAllocate($img, 0xff, 0xff, 0xff);
$ix = 6;
$iy = 2;
for ($i = 0; $i $number_len; $i++) {
imageString($img, 5, $ix, $iy, $number[$i], $white);
$ix += 14;
}
for($i=0;$i200;$i++) //加入干擾象素
{
$randcolor = ImageColorallocate($img,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($img, rand()%100 , rand()%50 , $randcolor);
}
// 輸出圖片
header(“Content-type: ” . image_type_to_mime_type(IMAGETYPE_PNG));
imagepng($img);
imagedestroy($img);
PHP圖形驗證碼識別
1.驗證碼取出,轉到8位或者24位點陣圖
2.點陣圖處理,二值化,RGB設定閥值小於閥值時為1否則為0 1為黑神色,0為白色
3.點陣圖處理,去噪點干擾,利用二值化的點陣圖,八方向法,一個孤立的噪點周圍八個方向的點都是0白色。
4.干擾線,定義邊界均為白色的區域,若干像素,讓該區域在點陣圖移動,如果進入區域內的黑色點小於某值時認定為噪點或干擾線。
5.分割。簡單平均分布可以直接固定分割。複雜的有粘連的利用投影,求字元數+1個極小值或極大值。極小值之間最小距離極小值到前一個極小值距離極小值之間最大距離。最大距離和最小距離按照字元長度來目測,一點一點的對比得出適當的值。
雖然此法可以解決部分粘連驗證碼,但是對於一些變態變形的公共區域比較多的驗證碼是無效的。
如果想知道更多分割方法,請到百度文庫,搜索驗證碼分割。
6.識別。建立特徵庫,或者利用神經網路自動學習。
然後比對,位元組或者文本均可。相似度自己設定,一般在90%以上
這些理論知識都學習明白了,基本就可以去做識別驗證碼了。
驗證碼最最重要且最難的一點就是分割。
有些方法不需要分割也可以借鑒一下。
php 識別驗證碼
PHP識別驗證碼(適合大部分驗證碼)
?php
$ch= curl_init();
$img=’@D:\APMServ5.2.6\www\htdocs\ccb\ntef.png’;//注意@,表示文件上傳
$data=array(
‘type’=’recognize’,
‘softID’=’3’,
‘softKey’=’623527b90698a47ec626043dac04a0f1’,
‘userName’=’test’,
‘passWord’=’123456’,
‘imagePath’=$img,
‘codeType’=’1040’,//驗證碼類型,見下面圖片
‘timeout’=’60’,
‘remark’=”,
‘log’=’0’,
‘upload’=’開始識別’
);
// $ch =
curl_init();
//
curl_setopt($ch, CURLOPT_URL, $url);
//
curl_setopt($ch, CURLOPT_POST, 1);
//
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
//
curl_exec($ch);
//
curl_close($ch);
//
這段代碼提交出去的Content-Type到底是multipart/form-data還是application/x-www-form-urlencoded呢?我抓包研究了一下,發現Content-Type的類型取決於$data的數據類型。
//
如果$data是字元串,則Content-Type是application/x-www-form-urlencoded。
//
如果$data是k=v的數組,則Content-Type是multipart/form-data
$url=”;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$result=
curl_exec($ch);
echo$result;
curl_close($ch);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306160.html