php你的驗證碼安全碼?

發布時間:2011年11月02日      浏覽次數:764 次
驗證碼的作用主要有防止暴力破解,防止惡意灌水,防止自動提交等,在這裏我(wǒ)(wǒ)就不多說了。驗證碼的類型也有數字、字母等,甚至厲害點的還有中(zhōng)文的。但是不管你的驗證碼多麽厲害,隻要你在表單驗證中(zhōng)存在如下(xià)的失誤,你的驗證碼就形同虛設!
驗證碼的一(yī)般思路,就是每次登陸的地方訪問一(yī)個腳本文件,該文件生(shēng)成含驗證碼的圖片并将值寫入到Session裏,提交的時候驗證登陸的腳本就會判斷提交的驗證碼是否與Session裏的一(yī)緻。
問題出現了,在登陸密碼錯誤之後,我(wǒ)(wǒ)們不去(qù)訪問生(shēng)成驗證圖片的文件,那麽如果Session中(zhōng)的驗證碼沒有被清空,此時驗證碼就是跟上次的一(yī)樣,辛辛苦苦構建的驗證碼機制就形同虛設了。
下(xià)面我(wǒ)(wǒ)們先來看一(yī)段有問題的代碼:
登陸部分(fēn):

CODE:
<tr>
<td>管理員(yuán)姓名:td>
<td><input type="text" name="username" />td>
tr>
<tr>
<td>管理員(yuán)密碼:td>
<td><input type="password" name="password" />td>
tr>
<tr>
<td>驗證碼:td>
<td><input type="text" name="captcha" onkeyup="pressCaptcha(this)" />td>
tr>
<tr>
<td colspan="2" align="right">
<img src="index.php?act=captcha&1628020115" width="145" height="20" alt="CAPTCHA" border="1" onclick= this.src="index.php?act=captcha&"+Math.random() style="cursor: pointer;" title="看不清?點擊更換另一(yī)個驗證碼。" />
td>
tr>
?>
這裏沒什麽問題,來看登陸驗證的代碼(我(wǒ)(wǒ)想這樣的驗證思路,也是大(dà)多數人都在用的吧):

CODE:
/*------------------------------------------------------ */
//-- 驗證登陸信息
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'signin')
{
include('../includes/cls_captcha.php');
/* 檢查驗證碼是否正确 */
$validator = new captcha();
if (!$validator->check_word($_POST['captcha']))
{
sys_msg($_LANG['captcha_error'], 1);
}
/* 檢查密碼是否正确 */
$sql = "SELECT user_id, user_name, password, action_list FROM " .$ecs->table('admin_user').
" WHERE user_name='$_POST[username]' AND password='" .md5($_POST['password']). "'";
$row = $db->GetRow($sql);
if ($row)
{
// 登錄成功
set_admin_session($row['user_id'], $row['user_name'], $row['action_list']);
// 更新最後登錄時間和IP
$db->Execute("UPDATE " .$ecs->table('admin_user').
" SET last_time='" .date('Y-m-d H:i:s', time()). "', last_ip='" .real_ip(). "'".
" WHERE user_id=$_SESSION[admin_id]") OR die($db->ErrorMsg());
if (isset($_POST['remember']))
{
setcookie('ECSCP[admin_id]', $row[0], time() + 3600 * 24 * 360);
setcookie('ECSCP[admin_pass]', md5($row['password'] . $_CFG['hash_code']), time() + 3600 * 24 * 360);
}
header('location:./');
}
else
{
sys_msg($_LANG['login_faild'], 1);
}
}
?>
問題就出在上面這段代碼裏,在檢查密碼錯誤之後,并沒有更新驗證碼,這樣我(wǒ)(wǒ)們就可以把登陸頁面的驗證碼圖片部分(fēn)去(qù)掉,而隻要用URL訪問一(yī)下(xià)驗證碼的頁面,就可以隻提交用戶名、密碼、剛才得到的驗證碼實現暴力破解了,利用此方法,同樣可以實現灌水,刷票等。

解決方法:我(wǒ)(wǒ)們需要在檢查密碼錯誤後更新驗證碼,對于留言等類型的,還要在提交成功後更新驗證碼。
安全就是這樣,我(wǒ)(wǒ)們總是想讓自己的程序更安全,但是一(yī)般情況下(xià),我(wǒ)(wǒ)們又(yòu)總是走在常規思維裏跳不出來,于是導緻我(wǒ)(wǒ)們的程序出現了很多"非常規漏洞",或者叫做"缺陷",總之就是不完美。我(wǒ)(wǒ)寫這篇文章除了指出上面這個問題之外(wài),還希望大(dà)家都能行動起來,用"非常規"眼光,重新檢查下(xià)自己的程序,把更多以前自己沒有發現的小(xiǎo)問題帖出來,讓大(dà)家共同提高!
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!