验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!
验证码的一般思路,就是每次登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到Session里,提交的时候验证登陆的脚本就会判断提交的验证码是否与Session里的一致。
问题出现了,在登陆密码错误之后,我们不去访问生成验证图片的文件,那么如果Session中的验证码没有被清空,此时验证码就是跟上次的一样,辛辛苦苦构建的验证码机制就形同虚设了。
下面我们先来看一段有问题的代码:
登陆部分:
gt; ;入力タイプ="テキスト"= 「ユーザー名」
/>td > tr > <tr > ><< />入力タイプ=
「パスワード」< />名前=
"パスワード" />
td> tr> >確認コード:
td> 「テキスト」名前 = "キャプチャ" onkeyup="pressCaptcha(this)" />
td> ;
tr> < =
"2" align="right"< />> <img src
="index .php?act=captcha&1628020 115インチ幅= 「145」 身長=「20」 alt=「CAPTCHA」 border< />=「1」
onclick< /> = これ
. src
="index.php?act=captcha&"+Math.random() style
= "カーソル: ポインタ; " タイトル =「はっきり見えない場合は、クリックして別の確認コードを変更してください。" />
td>
tr>
?>
//-- ログイン情報を確認してください
/*--------------------- ----- ---------------------------- */
if ($_REQUEST[' act'] == 'signin')
{
include('../includes/cls_captcha.php');
/* 確認コードが正しいか確認してください * /
$val idator = new captcha();
if (!$validator->check_word($_POST [「キャプチャ」 ]))
{
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['パスワード'] . $_ CFG[]ハッシュコード '])、時間() + 3600 * 24 * 360);
}
ヘッダー(の場所:./ ');
}
else
1); }}?> ; 問題は、パスワードエラーを確認した後の確認コードにあります。この方法では、ログイン ページの確認コードの画像部分を削除し、URL を使用して確認コード ページにアクセスし、ユーザー名、パスワード、取得した確認コードを送信するだけで済みます。この方法を使用すると、水の注入やチケット詐欺なども実行できます。 以下の写真を見て、直感的な理解を深めてください。 =700) window.open('http://www.bkjia.com/uploads/allimg/131016/05251961K-0.gif');" src="http://www.bkjia.com/ Uploads/allimg/131016/05251961K-0.gif" onload="if(this.width>'700')this.width='700';if(this.height>'700')this.height='700' ;" border=0>
解決策: パスワードのエラーをチェックした後、確認コードを更新する必要があります。メッセージやその他の種類の場合は、送信が成功した後に確認コードも更新する必要があります。
セキュリティは次のようなものです。私たちは常にプログラムをより安全なものにしたいと考えていますが、通常の状況では常に従来の考え方に囚われており、そのためプログラムには多くの「型破りな抜け穴」や「欠陥」が生じます。つまり、プログラムは完璧ではありません。この記事では、上記の問題点を指摘するとともに、みなさんが行動を起こし、「いつもと違う」視点で自分の手順を見直し、これまで気づかなかった小さな問題点をどんどん投稿して、みんなで改善していけることを願っています。
http://www.bkjia.com/PHPjc/317687.html