[PHP] 好用的留言板 驗證碼 功能
Oct 28th, 2008 by appleboy 參觀者:15,475Views 機器人:2,486Views
這算是大家都知道的技術了吧,因為說實在的,留言板惡意灌水實在是太容易了,就算是檔檔 referer 也是沒用,因為表頭可以自己偽造,那最好的方法就是用 PHP 驗證碼的機制,這個機制利用 GD 縮圖的部份,然後再把驗證數字存放在 SESSION 裡面,不過 PHPBB 的作法是存在 database 資料庫裡面進行比對,然後在 delete 該比資料,畢竟每個連線都有自己的 ssid 的值,所以這樣進行比對,我想是不錯的方法,也可以用在很多地方,那底下是我去 Jax 的工作紀錄 看到的一篇:PHP 驗證碼,拿過來筆記一下。
首先先去 Windows 底下的 Fonts 資料夾,選一個字型吧,因為裡面會用到喔,不然底下這一段 code 會用到
/*
imagettftext (int im, int size, int angle,
int x, int y, int col,
string fontfile, string text)
im 圖片物件
size 文字大小
angle 0度將會由左到右讀取文字,而更高的值表示逆時鐘旋轉
x y 文字起始座標
col 顏色物件
fontfile 字形路徑,為主機實體目錄的絕對路徑,
可自行設定想要的字型
text 寫入的文字字串
*/
其他的就是底下這段程式碼,把他存成 image.php
header("Content-type:image/png");
header("Content-Disposition:filename=image_code.png");
//定義 header 的文件格式為 png,第二個定義其實沒什麼用
// 開啟 session
if (!isset($_SESSION)) { session_start(); }
// 設定亂數種子
mt_srand((double)microtime()*1000000);
// 驗證碼變數
$verification__session = '';
// 定義顯示在圖片上的文字,可以再加上大寫字母
$str = 'abcdefghijkmnpqrstuvwxyz1234567890';
$l = strlen($str); //取得字串長度
//隨機取出 6 個字
for($i=0; $i<6; $i++){
$num=rand(0,$l-1);
$verification__session.= $str[$num];
}
// 將驗證碼記錄在 session 中
$_SESSION["verification__session"] = $verification__session;
// 圖片的寬度與高度
$imageWidth = 160; $imageHeight = 50;
// 建立圖片物件
$im = @imagecreatetruecolor($imageWidth, $imageHeight)
or die("無法建立圖片!");
//主要色彩設定
// 圖片底色
$bgColor = imagecolorallocate($im, 255,239,239);
// 文字顏色
$Color = imagecolorallocate($im, 255,0,0);
// 干擾線條顏色
$gray1 = imagecolorallocate($im, 200,200,200);
// 干擾像素顏色
$gray2 = imagecolorallocate($im, 200,200,200);
//設定圖片底色
imagefill($im,0,0,$bgColor);
//底色干擾線條
for($i=0; $i<10; $i++){
imageline($im,rand(0,$imageWidth),rand(0,$imageHeight),
rand($imageHeight,$imageWidth),rand(0,$imageHeight),$gray1);
}
//利用true type字型來產生圖片
imagettftext($im, 20, 0, 25, 35, $Color,"arial.ttf",$verification__session);
/*
imagettftext (int im, int size, int angle,
int x, int y, int col,
string fontfile, string text)
im 圖片物件
size 文字大小
angle 0度將會由左到右讀取文字,而更高的值表示逆時鐘旋轉
x y 文字起始座標
col 顏色物件
fontfile 字形路徑,為主機實體目錄的絕對路徑,
可自行設定想要的字型
text 寫入的文字字串
*/
// 干擾像素
for($i=0;$i<90;$i++){
imagesetpixel($im, rand()%$imageWidth ,
rand()%$imageHeight , $gray2);
}
imagepng($im);
imagedestroy($im);
?>
然後再利用
顯示出來就可以了喔,然後傳到 POST 頁面做判斷:
這樣就完成,記得要 unset 喔,避免重新整理造成多次留言
Parse error: syntax error, unexpected '<' in /usr/local/www/apache22/data/Blog/wp-content/plugins/runPHP/runPHP.php(410) : eval()'d code on line 1

[...] 我在 網站製作學習誌 發現一篇 [Web] 連結分享 裡面有一篇:用php做出類似Google的字詞驗證圖片,這一篇寫的不錯,跟我之前寫的一篇:[PHP] 好用的留言板 驗證碼 功能,驗證碼的強度還要更好,畢竟這樣比較不會被破解,然而這篇加上許多干擾的驗證,也選用了比較複雜的字型來提供給網站驗證部份,在 google 的登入系統部份,剛開始都是給使用者方便,不會跑出驗證碼的部份,可是只要輸入幾次錯誤的帳號密碼之後,google 的驗證碼就會跑出來了,而這個很類似 google 的驗證碼提供給大家使用,當然也感謝原作者,因為在Google字詞驗證與 CAPTCHA 都已經相繼被破解,這消息我不知道從哪裡來的,在 這裡 有提到,詳細情祥可能要網路查查了 [...]
大大 在網路上找好久找到了您這篇認證碼的教學 但是小弟我剛在學習
—>是不是該在這裡有使用者輸入認證碼的地方?
顯示出來就可以了喔,然後傳到 POST 頁面做判斷:
—>是不是在這在與使用者輸入的認證碼做檢查比對?
if($_SESSION["verification__session"] != $_REQUEST["image"])
exit(”嚴禁惡意的攻擊行為”);
else
unset($_SESSION["verification__session"]);
對不起擔誤您的時間 煩請大大為小弟解答一下吧^^||
exit(”嚴禁惡意的攻擊行為”);
else
unset($_SESSION["verification__session"]);
上面這一段,是在使用者輸入資料傳送到後端PHP做認證的時候使用喔
如果比對不成功顯示錯誤,如果成功就 unset $_SESSION["verification__session"]
避免使用者重新 refresh
前端輸出圖形,後端比對輸入資料,就是這樣而已喔
大大感謝您這麼快速的回應
底下這個部份我把他放在輸入留言的頁面
那同個頁面是不是應該要增加使用者輸入認證碼的欄位
如
然後在送出到比對頁面
我這個順序對嗎?
然後我那個這行裡的name是不是該設為image ?與底下大大的這個image是同一個?
if($_SESSION["verification__session"] != $_REQUEST["image"])
sorry 小弟剛開始學習實在不太懂XD 請大大指導一下^^||
大大感謝您這麼快速的回應
底下這個部份我把他放在輸入留言的頁面
ig src=”wp-content/PHP/image.php”
那同個頁面是不是應該要增加使用者輸入認證碼的欄位
如input type=………..
然後在送出到比對頁面
我這個順序對嗎?
然後我那個input type….這行裡的name是不是該設為image ?與底下大大的這個image是同一個?
if($_SESSION["verification__session"] != $_REQUEST["image"])
sorry 小弟剛開始學習實在不太懂XD 請大大指導一下^^||
抱歉剛有這個的都出不來 所以重填一下
首先你要先確定環境有支援 GD Library,確定之後就可以如下面步驟:
1. 顯示認證碼
這是用來顯示認證圖片
2. 新增 input 欄位
我想妳先學好基本的 form 傳遞資料,這比較重要喔
大大謝謝您的指導嚕 這樣我就比較確定我想的順序可以執了唷
剛入手 會加油的^^
[...] google 網頁認證碼,[PHP] 好用的留言板 驗證碼 功能,這篇是要寫如何實做把第一篇教學整合到 CodeIgniter [...]
真够专业的!谢谢分享。
再
不是
在
有錯字
哈哈
不過你這篇寫的好~~
要include嗎???
然後在利用
顯示出來就可以了喔,然後傳到 POST 頁面做判斷
感謝 佳佳:
我修正了
大大想請教一下,為何我的驗證碼的圖片都看不到?