$gray = ImageColorAllocate($im, 200,200,200);
imagefill($im,68,30,$gray);
//將四位整數驗證碼繪入圖片
imagestring($im, 5, 10, 8, $auth_num, $black);
for($i=0;$i<50;$i++) //加入干擾象素
{
imagesetpixel($im, rand()%70 , rand()%30 , $black);
}
ImagePNG($im);
ImageDestroy($im);
當然,在具體采用該方法生成驗證碼時,還可以在代碼中通過圖形變形等手段讓圖形變得更難以被自動工具識別。
另外,注意在上面的代碼中,我們將隨機生成的用于生成驗證碼圖片的實際數據保存到了Session中,這一步對于驗證碼的實現非常關鍵,網上廣泛流傳的一篇用PHP實現驗證碼的文章將驗證碼對應的實際數據存放在頁面的hidden Field中,從安全性的角度來說,這種方式將導致驗證碼對應的實際數據在客戶端可見,只需要通過簡單的頁面分析即可獲得,這就完全失去了驗證碼抵抗惡意攻擊的作用。
1.3 驗證碼是否正確的驗證過程
產生驗證碼圖片只是驗證碼技術實現的一個步驟,驗證碼圖片在頁面上正確顯示后,用戶需要識別驗證碼并提交了相應的內容,驗證碼技術應該能夠判斷用戶的輸入與驗證碼對應的實際數據是否一致。
在具體的實現中,一般是將驗證碼對應的實際數據存放在服務端的Session中,在驗證用戶輸入的代碼中通過比較用戶的輸入和驗證碼對應的實際數據是否一致來判斷用戶輸入的驗證碼是否正確。
仍然以用PHP實現驗證碼為例,驗證用戶輸入是否正確的代碼如下:
session_start();
$num=trim($num);
if($auth_num==$num && $num<>"")
{
echo "驗證成功";
}
else
{
echo "驗證失敗";
}
<!--[if !supportLists]-->4 自動測試中
圖4 驗證碼實現的大致原理圖 |
原文轉自:http://www.anti-gravitydesign.com