php驗(yàn)證碼

理論分析

image.png

image.png

1、實(shí)現(xiàn)驗(yàn)證碼底圖

image.png
$image = imagecreatetruecolor(100,300);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestory($image);   // 銷毀資源
// output 瀏覽器輸出白色的圖片

2滔岳、實(shí)現(xiàn)數(shù)字驗(yàn)證碼

image.png
$image = imagecreatetruecolor(100,300);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);
for($i=0;$i<4;$i++){
    $fontsize=6; // 數(shù)字大小
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 數(shù)字顏色
    $fontcontent = rand(0,9);

    $x = ($i*100/4) + rand(5,10); // 第i個(gè)數(shù)字的x坐標(biāo)
    $y = rand(5,10); // 第i個(gè)數(shù)字的y坐標(biāo)

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestory($image);   // 銷毀資源

輸出


image.png

3杠娱、增加干擾元素

image.png
(1)、追加干擾點(diǎn)
$image = imagecreatetruecolor(100,300);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);
// 加入四個(gè)數(shù)字
for($i=0;$i<4;$i++){
    $fontsize=6; // 數(shù)字大小
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 數(shù)字顏色
    $fontcontent = rand(0,9);

    $x = ($i*100/4) + rand(5,10); // 第i個(gè)數(shù)字的x坐標(biāo)
    $y = rand(5,10); // 第i個(gè)數(shù)字的y坐標(biāo)

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 追加干擾點(diǎn)
for ($i=0;$i<200;$i++){
    $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200)); // 干擾點(diǎn)顏色
    imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestory($image);   // 銷毀資源

輸出


image.png
(2)谱煤、追加干擾線
$image = imagecreatetruecolor(100,300);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);
// 加入四個(gè)數(shù)字
for($i=0;$i<4;$i++){
    $fontsize=6; // 數(shù)字大小
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 數(shù)字顏色
    $fontcontent = rand(0,9);

    $x = ($i*100/4) + rand(5,10); // 第i個(gè)數(shù)字的x坐標(biāo)
    $y = rand(5,10); // 第i個(gè)數(shù)字的y坐標(biāo)

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 追加干擾點(diǎn)
for ($i=0;$i<200;$i++){
    $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200)); // 干擾點(diǎn)顏色
    imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
// 追加干擾線
for ($i=0;$i<3;$i++){
    $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220)); // 干擾線顏色
    imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestory($image);   // 銷毀資源

輸出


image.png

4摊求、實(shí)現(xiàn)字母數(shù)字混合驗(yàn)證碼

image.png
<?php
/**
 * Created by PhpStorm.
 * User: zhengjiayuan
 * Date: 2018/7/15
 * Time: 22:19
 */
$image = imagecreatetruecolor(100,300);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);
// 加入4個(gè)字母數(shù)字混合
for($i=0;$i<4;$i++){
    $fontsize=6; // 數(shù)字大小
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 數(shù)字顏色
    $data= 'abcdefghijkmnpqrstuvwxy3456789';
    $fontcontent = substr($data,rand(0,strlen($data)),1);

    $x = ($i*100/4) + rand(5,10); // 第i個(gè)字符的x坐標(biāo)
    $y = rand(5,10); // 第i個(gè)字符的y坐標(biāo)

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 追加干擾點(diǎn)
for ($i=0;$i<200;$i++){
    $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200)); // 干擾點(diǎn)顏色
    imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
// 追加干擾線
for ($i=0;$i<3;$i++){
    $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220)); // 干擾線顏色
    imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestory($image);   // 銷毀資源

輸出


image.png

5、通過(guò)session存儲(chǔ)驗(yàn)證信息

image.png

captcha.php

<?php
/**
 * Created by PhpStorm.
 * User: zhengjiayuan
 * Date: 2018/7/15
 * Time: 22:19
 */

session_start(); // 使用session

$image = imagecreatetruecolor(100,30);
// 為一副圖像分配顏色
$bgcolor = imagecolorallocate($image,255,255,255);
// 為區(qū)域填充顏色
imagefill($image,0,0,$bgcolor);

$captch_code = ''; // 保存驗(yàn)證碼信息
// 加入4個(gè)字母數(shù)字混合
for($i=0;$i<4;$i++){
    $fontsize=6; // 數(shù)字大小
    $fontcolor = imagecolorallocate($image,rand(0,120),rand(0,120),rand(0,120)); // 數(shù)字顏色
    $data= 'abcdefhjkmnopqrstuvwxy345678';
    $fontcontent = substr($data,rand(0,strlen($data)),1);
    $captch_code .= $fontcontent;
    $x = ($i*100/4) + rand(5,10); // 第i個(gè)字符的x坐標(biāo)
    $y = rand(5,10); // 第i個(gè)字符的y坐標(biāo)

    imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
}
// 追加干擾點(diǎn)
for ($i=0;$i<200;$i++){
    $pointcolor = imagecolorallocate($image,rand(50,200),rand(50,200),rand(50,200)); // 干擾點(diǎn)顏色
    imagesetpixel($image,rand(1,99),rand(1,29),$pointcolor);
}
// 追加干擾線
for ($i=0;$i<3;$i++){
    $linecolor = imagecolorallocate($image,rand(80,220),rand(80,220),rand(80,220)); // 干擾線顏色
    imageline($image,rand(1,99),rand(1,29),rand(1,99),rand(1,29),$linecolor);
}
$_SESSION['authcode'] = $captch_code; // 保存驗(yàn)證碼信息到session  必須放在顯示圖片前 不然這句代碼不執(zhí)行
header('Content-type: image/png'); // 提前輸出圖片header信息
imagepng($image);   // 瀏覽器輸出圖片
imagedestroy($image);  // 銷毀資源



form.php

<?php
/**
 * Created by PhpStorm.
 * User: zhengjiayuan
 * Date: 2018/7/15
 * Time: 23:11
 */
    if (isset($_REQUEST['authcode'])){
        session_start();
        if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
            echo '<font color="#0000CC">輸入正確</font>';
        }else{
            echo '<font color="#0000CC">輸入錯(cuò)誤</font>';
        }
        exit();
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>確認(rèn)驗(yàn)證碼</title>
    </head>
    <body>
        <form method="post" action="./form.php">
            <p>驗(yàn)證碼圖片:<img src="./captcha.php?r=<?php echo rand()?>" border="1" width="100"></p>

            <p>請(qǐng)輸入圖片中的內(nèi)容: <input type="text" name="authcode" value="" /></p>
            <p><input type="submit" value="提交" style="padding: 6px 20px;"/></p>
        </form>
    </body>

</html>
image.png

image.png

6刘离、用JS實(shí)現(xiàn)動(dòng)態(tài)校驗(yàn)驗(yàn)證碼

image.png
<?php
/**
 * Created by PhpStorm.
 * User: zhengjiayuan
 * Date: 2018/7/15
 * Time: 23:11
 */
    if (isset($_REQUEST['authcode'])){
        session_start();
        if (strtolower($_REQUEST['authcode']) == $_SESSION['authcode']){
            echo '<font color="#0000CC">輸入正確</font>';
        }else{
            echo '<font color="#0000CC">輸入錯(cuò)誤</font>';
        }
        exit();
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>確認(rèn)驗(yàn)證碼</title>
    </head>
    <body>
        <form method="post" action="./form.php">
            <p>驗(yàn)證碼圖片:
                <img id="captcha_img" src="./captcha.php?r=<?php echo rand()?>" border="1" width="100">
                <!-- 實(shí)現(xiàn)動(dòng)態(tài)校驗(yàn)驗(yàn)證碼 -->
                <a href="javasript:void(0)" onclick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">換一個(gè)室叉?</a>
            </p>

            <p>請(qǐng)輸入圖片中的內(nèi)容: <input type="text" name="authcode" value="" /></p>
            <p><input type="submit" value="提交" style="padding: 6px 20px;"/></p>
        </form>
    </body>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硫惕,隨后出現(xiàn)的幾起案子茧痕,更是在濱河造成了極大的恐慌,老刑警劉巖恼除,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踪旷,死亡現(xiàn)場(chǎng)離奇詭異曼氛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)令野,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門舀患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人气破,你說(shuō)我怎么就攤上這事聊浅。” “怎么了现使?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵低匙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我朴下,道長(zhǎng)努咐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任殴胧,我火速辦了婚禮,結(jié)果婚禮上佩迟,老公的妹妹穿的比我還像新娘团滥。我一直安慰自己,他們只是感情好报强,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布灸姊。 她就那樣靜靜地躺著,像睡著了一般秉溉。 火紅的嫁衣襯著肌膚如雪力惯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天召嘶,我揣著相機(jī)與錄音父晶,去河邊找鬼。 笑死弄跌,一個(gè)胖子當(dāng)著我的面吹牛甲喝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铛只,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼埠胖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了淳玩?” 一聲冷哼從身側(cè)響起直撤,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜕着,沒(méi)想到半個(gè)月后谋竖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年圈盔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豹芯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驱敲,死狀恐怖铁蹈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情众眨,我是刑警寧澤握牧,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站娩梨,受9級(jí)特大地震影響沿腰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狈定,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一颂龙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纽什,春花似錦措嵌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至让蕾,卻和暖如春浪规,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背探孝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工笋婿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人再姑。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓萌抵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親元镀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍填,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容