验证码的作用主要有防止暴力破解,防止恶意灌水,防止自动提交等,在这里我就不多说了。验证码的类型也有数字、字母等,甚至厉害点的还有中文的。但是不管你的验证码多么厉害,只要你在表单验证中存在如下的失误,你的验证码就形同虚设!
验证码的一般思路,就是每次登陆的地方访问一个脚本文件,该文件生成含验证码的图片并将值写入到Session里,提交的时候验证登陆的脚本就会判断提交的验证码是否与Session里的一致。
问题出现了,在登陆密码错误之后,我们不去访问生成验证图片的文件,那么如果Session中的验证码没有被清空,此时验证码就是跟上次的一样,辛辛苦苦构建的验证码机制就形同虚设了。
下面我们先来看一段有问题的代码:
登陆部分:
>管理者名: td> >>入力タイプ
="テキスト" 名前=" ユーザー名" />td> 🎜 >tr> td
> >="パスワード"
名前="パスワード"
/>td > td><入力タイプ
="テキスト" 名前 ="キャプチャ" onkeyup="pressCaptcha(this)" /> <🎜; >td< />>
tr< />> < 🎜>「正しい」
> <img src
="index.php?act=captcha&1628020115" >width="145" < />身長=
"20" alt="CAPTCHA" ボーダー="1" onclick = this.src< />="index.php?act=captcha&"
< />Math .
ランダム()
スタイル="カーソル: ポインタ <🎜" >title=「はっきり見えませんか?クリックして別の確認コードを変更します。" />
td>
tr>
?>
//-- ログイン情報を確認します
/*------------ ---------------------------------------------------- - */
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['パスワード'] . $_CFG[ 'ハッシュコード']), 時間() 3600 * 24 * 360);
}
'location:./'); } else { _LANG[
'login_faild'
], 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>
解決策: パスワードが間違っていることを確認した後、確認コードを更新する必要があります。メッセージやその他の種類の場合は、パスワードが間違っていることを確認した後で確認コードを更新する必要もあります。
セキュリティとは次のようなものです。私たちは常にプログラムをより安全にしたいと考えていますが、通常の状況では常に従来の考え方に固執しており、そこから抜け出すことができないため、多くの「型破りな脆弱性」が発生します。私たちのプログラムは完璧ではありません。上記の問題点を指摘するだけでなく、皆さんも「従来とは違う」視点で自分の手順を見直し、行動してほしいと思います。過去をもっと改善してください。気づいていない小さな問題を投稿して、みんなで改善してください