php你的驗(yàn)證碼安全碼?
更新時(shí)間:2007年01月02日 00:00:00 作者:
驗(yàn)證碼的作用主要有防止暴力破解,防止惡意灌水,防止自動(dòng)提交等,在這里我就不多說了。驗(yàn)證碼的類型也有數(shù)字、字母等,甚至厲害點(diǎn)的還有中文的。但是不管你的驗(yàn)證碼多么厲害,只要你在表單驗(yàn)證中存在如下的失誤,你的驗(yàn)證碼就形同虛設(shè)!
驗(yàn)證碼的一般思路,就是每次登陸的地方訪問一個(gè)腳本文件,該文件生成含驗(yàn)證碼的圖片并將值寫入到Session里,提交的時(shí)候驗(yàn)證登陸的腳本就會(huì)判斷提交的驗(yàn)證碼是否與Session里的一致。
問題出現(xiàn)了,在登陸密碼錯(cuò)誤之后,我們不去訪問生成驗(yàn)證圖片的文件,那么如果Session中的驗(yàn)證碼沒有被清空,此時(shí)驗(yàn)證碼就是跟上次的一樣,辛辛苦苦構(gòu)建的驗(yàn)證碼機(jī)制就形同虛設(shè)了。
下面我們先來看一段有問題的代碼:
登陸部分:
大家可以看下面的圖片,增強(qiáng)點(diǎn)直觀的認(rèn)識(shí)。
解決方法:我們需要在檢查密碼錯(cuò)誤后更新驗(yàn)證碼,對(duì)于留言等類型的,還要在提交成功后更新驗(yàn)證碼。
安全就是這樣,我們總是想讓自己的程序更安全,但是一般情況下,我們又總是走在常規(guī)思維里跳不出來,于是導(dǎo)致我們的程序出現(xiàn)了很多"非常規(guī)漏洞",或者叫做"缺陷",總之就是不完美。我寫這篇文章除了指出上面這個(gè)問題之外,還希望大家都能行動(dòng)起來,用"非常規(guī)"眼光,重新檢查下自己的程序,把更多以前自己沒有發(fā)現(xiàn)的小問題帖出來,讓大家共同提高!
驗(yàn)證碼的一般思路,就是每次登陸的地方訪問一個(gè)腳本文件,該文件生成含驗(yàn)證碼的圖片并將值寫入到Session里,提交的時(shí)候驗(yàn)證登陸的腳本就會(huì)判斷提交的驗(yàn)證碼是否與Session里的一致。
問題出現(xiàn)了,在登陸密碼錯(cuò)誤之后,我們不去訪問生成驗(yàn)證圖片的文件,那么如果Session中的驗(yàn)證碼沒有被清空,此時(shí)驗(yàn)證碼就是跟上次的一樣,辛辛苦苦構(gòu)建的驗(yàn)證碼機(jī)制就形同虛設(shè)了。
下面我們先來看一段有問題的代碼:
登陸部分:
CODE:
<tr>
<td>管理員姓名:< />td>
<td><input type="text" name="username" />< />td>
< />tr>
<tr>
<td>管理員密碼:< />td>
<td><input type="password" name="password" />< />td>
< />tr>
<tr>
<td>驗(yàn)證碼:< />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="看不清?點(diǎn)擊更換另一個(gè)驗(yàn)證碼。" />
< />td>
< />tr>
?>
這里沒什么問題,來看登陸驗(yàn)證的代碼(我想這樣的驗(yàn)證思路,也是大多數(shù)人都在用的吧):<td>管理員姓名:< />td>
<td><input type="text" name="username" />< />td>
< />tr>
<tr>
<td>管理員密碼:< />td>
<td><input type="password" name="password" />< />td>
< />tr>
<tr>
<td>驗(yàn)證碼:< />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="看不清?點(diǎn)擊更換另一個(gè)驗(yàn)證碼。" />
< />td>
< />tr>
?>
CODE:
/*------------------------------------------------------ */
//-- 驗(yàn)證登陸信息
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'signin')
{
include('../includes/cls_captcha.php');
/* 檢查驗(yàn)證碼是否正確 */
$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']);
// 更新最后登錄時(shí)間和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);
}
}
?>
問題就出在上面這段代碼里,在檢查密碼錯(cuò)誤之后,并沒有更新驗(yàn)證碼,這樣我們就可以把登陸頁面的驗(yàn)證碼圖片部分去掉,而只要用URL訪問一下驗(yàn)證碼的頁面,就可以只提交用戶名、密碼、剛才得到的驗(yàn)證碼實(shí)現(xiàn)暴力破解了,利用此方法,同樣可以實(shí)現(xiàn)灌水,刷票等。//-- 驗(yàn)證登陸信息
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'signin')
{
include('../includes/cls_captcha.php');
/* 檢查驗(yàn)證碼是否正確 */
$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']);
// 更新最后登錄時(shí)間和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);
}
}
?>
大家可以看下面的圖片,增強(qiáng)點(diǎn)直觀的認(rèn)識(shí)。

解決方法:我們需要在檢查密碼錯(cuò)誤后更新驗(yàn)證碼,對(duì)于留言等類型的,還要在提交成功后更新驗(yàn)證碼。
安全就是這樣,我們總是想讓自己的程序更安全,但是一般情況下,我們又總是走在常規(guī)思維里跳不出來,于是導(dǎo)致我們的程序出現(xiàn)了很多"非常規(guī)漏洞",或者叫做"缺陷",總之就是不完美。我寫這篇文章除了指出上面這個(gè)問題之外,還希望大家都能行動(dòng)起來,用"非常規(guī)"眼光,重新檢查下自己的程序,把更多以前自己沒有發(fā)現(xiàn)的小問題帖出來,讓大家共同提高!
您可能感興趣的文章:
- PHP驗(yàn)證碼類代碼( 最新修改,完全定制化! )
- PHP 驗(yàn)證碼的實(shí)現(xiàn)代碼
- PHP 動(dòng)態(tài)隨機(jī)生成驗(yàn)證碼類代碼
- php 生成隨機(jī)驗(yàn)證碼圖片代碼
- php5 圖片驗(yàn)證碼實(shí)現(xiàn)代碼
- php 數(shù)學(xué)運(yùn)算驗(yàn)證碼實(shí)現(xiàn)代碼
- php 驗(yàn)證碼制作(網(wǎng)樹注釋思想)
- php中文字母數(shù)字驗(yàn)證碼實(shí)現(xiàn)代碼
- php圖片驗(yàn)證碼代碼
- 一個(gè)PHP驗(yàn)證碼類代碼分享(已封裝成類)
- 修改了一個(gè)很不錯(cuò)的php驗(yàn)證碼(支持中文)
相關(guān)文章
php 防止單引號(hào),雙引號(hào)在接受頁面轉(zhuǎn)義
在使用php的過程中,我們需要使用單引號(hào)和雙引號(hào),所以需要轉(zhuǎn)義一下2008-07-07解析WordPress中控制用戶登陸和判斷用戶登陸的PHP函數(shù)
這篇文章主要介紹了WordPress中控制用戶登陸和判斷用戶登陸的PHP函數(shù),WordPress現(xiàn)在多用戶功能已推出了一段時(shí)間,針對(duì)多用戶需求的開發(fā)也日益增多,需要的朋友可以參考下2016-03-03配置eAccelerator和XCache擴(kuò)展來加速PHP程序的執(zhí)行
這篇文章主要介紹了配置eAccelerator和XCache擴(kuò)展來加速PHP程序的執(zhí)行的方法,XCache和PHP5.5以來自帶的Zend Opcache一樣都是在共享內(nèi)存中存儲(chǔ)Opcode的緩存器,需要的朋友可以參考下2015-12-12使用PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼
PHP獲取網(wǎng)絡(luò)文件的實(shí)現(xiàn)代碼,其實(shí)就是一個(gè)小偷程序。學(xué)習(xí)php小偷程序的朋友可以參考下。2010-01-01PHP+Ajax實(shí)現(xiàn)的檢測(cè)用戶名功能簡(jiǎn)單示例
這篇文章主要介紹了PHP+Ajax實(shí)現(xiàn)的檢測(cè)用戶名功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了php結(jié)合ajax基于事件響應(yīng)動(dòng)態(tài)查詢數(shù)據(jù)庫及用戶名檢測(cè)相關(guān)操作技巧,需要的朋友可以參考下2019-02-02