- 論壇徽章:
- 0
|
近日看到關于驗證碼的討論頗多,發(fā)舊文一篇。頗認為本文作者對圖靈測試的描述淺顯易懂。并且Text_CAPTCHA確實能省不少事~~推薦使用~~
http://mikespook.cnblogs.com/archive/2005/03/02/111758.html
------------------------------
使用 PEAR的Text_CAPTCHA保護Web表單
作者 Marcus Whitney
翻譯 mikespook
來源 http://phpsec.org
當你在網(wǎng)絡上有公開的表單的時候,你總是需要去提防那些使用你的程序來滿足自己的意圖的那些人。在論壇、開放圖書館、留言簿和BLOG上被自動提交機(原文是“robots”)找到并提交表單都是很常見的。一般這種行為是為了做廣告:自動提交機嘗試加入你站點的連接以提高在搜索引擎上的rankings。
一種已經(jīng)被很多網(wǎng)站與網(wǎng)絡應用如Yahoo!廣泛使用的預防技術是CAPTCHA。CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart,這是卡內基·梅隆大學計算機科學的一個項目。這個技術用以嘗試區(qū)分計算機和人類,在人機差別非常小的網(wǎng)絡上是非常有用的。
提示
參照Wikipedia,圖靈測試是“通過模擬人類對話測試計算機能力的方案!备嘈畔⒖稍L問: http://en.wikipedia.org/wiki/Turing_test。
你可能已經(jīng)看到過CAPTCHA項目在你的網(wǎng)絡單元中發(fā)揮作用。生成一個隨機的圖片顯示給用戶。這個圖片含有一個不容易被計算機識別的字符串,同時這個字符串在頁面的代碼及其他計算機可以獲取的地方被使用。如果表單提交的時候并不含有正確的字符串,你就能夠確信輸入的人錄入錯誤或者那根本不是一個真正的人在進行錄入。
感謝Christian Wenz,PEAR含有專門用于Web程序做這種測試用于安全防范的模塊。Text_CAPTCHA包使用PHP的GD函數(shù)組動態(tài)生成含有隨機字符串的圖象,并提供面向對象的接口調用方式。在你使用Text_CAPTCHA之前,你必須已經(jīng)安裝了支持JPEG、PNG以及True Type字體的GD庫。了解關于這個功能的更多信息,可以訪問PHP站點上的文檔:http://www.php.net/image
Text_CAPTCHA由兩部分組成:Image_Text和Text_Password。Text_Password用來生成隨機的字符串,而Image_Text用來將這個隨機字符串生成圖象。在命令行輸入下面的命令來安裝Text_CAPTCHA:
pear install Text_Password
pear install Image_Text
pear install Text_CAPTCHA
這種方法最常見的例子就是在BLOG的評論功能中。在下面的表單中,任何想對你的發(fā)言進行評論的人都可以可以填寫姓名、電子郵件地址和評論:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Name: <input type="text" name="name" /><br />
Email: <input type="text" name="email" /><br />
Comment: <textarea name="comment"></textarea>
<input type="submit" />
</form>
當在你的表單中添加了CAPTCHA技術,你就需要在表單中添加一個圖片并且要求使用者輸入上面的字符串。比如:
請輸入下面圖片中的字符串:
<input type="text" name="captcha_phrase" /><br />
<img src="captcha.jpg" />
這就是Text_CAPTCHA應用的地方。在完成你的表單之前,你需要先使用Text_CAPTCHA:
<?php
require_once 'Text/CAPTCHA.php';
$captcha = Text_CAPTCHA::factory('Image');
$captcha->init(150, 150);
?>
第一行將Text_CAPTCHA所需要的文件包含進來。第二行使用Text_CAPTCHA的factory方法返回一個Text_CAPTCHA的對象。Text_CAPTCHA的設計允許不同的驅動類型。要注意,CAPTCHA可以是任何能夠區(qū)分計算機和人的技術,而不只是使用圖象。Image作為factory方法的參數(shù)可以讓 Text_CAPTCHA生成一個圖象驅動的對象。
第三行,$captcha->init(150, 150),初始化Text_CAPTCHA對象。Init方法需要兩個參數(shù):width和height。用來確定生成的圖片的大。ㄔ诒疚闹袌D象大小為150x150像素)。這些參數(shù)是可選的,而默認值分別為200像素和80像素。還有其他兩個可選參數(shù)-phrase(第三個參數(shù))和options(第四個參數(shù))。phrase是在生成的圖象中顯示的字符串,而options允許你控制Image_Text的外觀。
想要控制Image_Text的外觀的話需要建立一個數(shù)組,比如叫$options,并且作為init的第四個參數(shù)傳遞進去:
<?php
$options = array('font_size'=>'20',
'font_path'='/path/to/fonts/',
'font_file'=>'ARIAL.TTF');
$captcha->init(150, 150, NULL, $options);
?>
當init方法創(chuàng)建了含有字符串的圖片的時候,剩下的處理就非常簡單了:你需要創(chuàng)建一個可以在瀏覽器中顯示的圖象。使用getCAPTCHAAsJPEG()(用來生成JPEG格式圖象)或者getCAPTCHAAsPNG()(用來生成PNG格式圖象)方法可以完成這個功能。這些方法返回圖象數(shù)據(jù)到緩沖中,你可以將這些數(shù)據(jù)簡單的寫入文件。
<?php
$image = $captcha->getCAPTCHAAsJPEG();
$handle = fopen('captcha.jpg', 'w');
fwrite($handle, $image);
fclose($handle);
?>
PHP 5的file_put_contents()函數(shù)使得這一切變得更加簡單:
<?php
$image = $captcha->getCAPTCHAAsJPEG();
file_put_contents('captcha.jpg', $image);
?>
下一步是從當前對象中獲得字符串并保存在session變量中。使用Text_CAPTCHA的getPhrase()方法獲得字符串并保存在session變量中,以便之后調用:
<?php
$_SESSION['captcha_phrase'] = $captcha->getPhrase();
?>
為了判斷用戶是否是一個真正的人,只要簡單的判斷用戶發(fā)送的字符串是否和你保存在$_SESSION['captcha_phrase']中的相等。如果不相等你可以丟棄那些數(shù)據(jù)并且做任何你需要的處理。下面的例子對上面的描述做了示范:
<?php
session_start();
if (isset($_POST['captcha_phrase']) &&
$_POST['captcha_phrase'] == $_SESSION['captcha_phrase'])
{
/* Human */
}
else
{
/* Computer */
}
?>
CAPTCHA是一種非常有效的減少你的程序收到不正常的HTTP POST請求的途徑。Text_CAPTCHA提供的對象幫助你快捷而簡單的實現(xiàn)這一技術。Text_CAPTCHA現(xiàn)在還是Alpha版,但是它的起點之高以及為PEAR帶來安全方面的思想還是值得借鑒的。Happy CAPTCHA-ing! |
|