PHP 動態生成驗證碼


……機器人會在網站中搜尋允許他們插入廣告的輸入表單,在虛擬世界沒有什么能阻擋它們胡作非為。這些機器人效率極高,完全不關心所攻擊的表單的本來用途。它們唯一的目標就是用它們的垃圾廣告覆蓋你的內容,殘忍地為它們的主人謀取廣告收入。

要檢驗一個表單所面對的是一個真正的人,這種測試稱為CAPTCHA(完全自動化公共圖靈測試)。目前最有效的方法是生成一個要求用戶輸入的隨機通行短語,為了防止支持OCR(光學字符識別)的機器人破解系統,通行短語字母必須變形,或者用隨機的直線和點進行部分模糊處理。

/* 生成驗證碼序列 */
define("CAPTCHA_NUMCHARS", 6);  //驗證碼長度
$pass_phrase = "";              //驗證碼內容
for ($i = 0; $i < CAPTCHA_NUMCHARS; $i++) {
    //隨機生成字母添加至驗證碼
    $pass_phrase .= chr(rand(97, 122));
}

/* 生成驗證碼圖像 */
define("CAPTCHA_WIDTH", 300);    //驗證碼寬度
define("CAPTCHA_HEIGHT", 100);    //驗證碼高度
//創建空白畫布
$img = imagecreatetruecolor(CAPTCHA_WIDTH, CAPTCHA_HEIGHT);
//設置主題顏色
$bg_color = imagecolorallocate($img, 225, 225, 225);       //白色背景
$text_color = imagecolorallocate($img, 0, 0, 0);           //黑色字體
$graphic_color = imagecolorallocate($img, 64, 64, 64);     //灰色圖像
//填充背景
imagefilledrectangle($img, 0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $bg_color);
//繪制隨機直線
for ($i = 0; $i < 10; $i++) {
    imageline($img, 0, rand() % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color);
}
//繪制隨機點
for ($i = 0; $i < 20; $i++) {
    imagefilledellipse($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, 10, 10, $graphic_color);
}
//繪制驗證碼
imagettftext($img, 60, 0, 20, CAPTCHA_HEIGHT - 20, $text_color, "C:/Windows/Fonts/SketchFlow Print.ttf", $pass_phrase);
//作為PNG圖像輸出
header("Content-type: image/png");
imagepng($img);
//從內存從撤銷圖像
imagedestroy($img);

使用PHP動態生成的圖像並不存儲在一個文件中,實際上,imagepng() 函數會在服務器的內存中生成一個二進制PNG圖像,然后把它直接通過一個首部傳送到瀏覽器。

正因如此可以直接把PHP腳本放置在 <img> 標記的 src 屬性中:<img src = "CAPTCHA.php"/>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM