PHP 動態生成驗證碼

……機器人會在網站中搜尋容許他們插入廣告的輸入表單,在虛擬世界沒有什麼能阻擋它們胡做非爲。這些機器人效率極高,徹底不關心所攻擊的表單的原本用途。它們惟一的目標就是用它們的垃圾廣告覆蓋你的內容,殘忍地爲它們的主人謀取廣告收入。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"/>函數

相關文章
相關標籤/搜索