CodeIgniter登录表单添加图片验证码强制用户验证问题咨询
前端修改
调整HTML表单的验证码输入框,增加必填校验做第一层基础拦截:
<form id="login" name="login" method="post" action="<?php echo load::get('base_url');?>account/login" accept-charset="UTF-8"> <input id="login_field" type="text" name="user" id="user" required placeholder="Account"> <input id="login_field" name="password" id="password" type="password" required placeholder="*******"> <img src="<?php echo load::get('base_url');?>image_verify.php" alt="Image Verify"> <!-- 增加required必填属性,添加占位提示 --> <input name="bot" type="text" class="post" id="bot" size="6" maxlength="10" required placeholder="请输入验证码"> <input name="submit" type="image" value="Log In" src="<?php echo load::get('base_url');?>assets/<?php echo load::get('tmp');?>/images/login.png"> <input type="hidden" name="login" value="1" /> </form>
注意:前端校验可以被篡改,核心校验逻辑必须放在后端实现。
后端修改
首先确认你的image_verify.php生成验证码时,已经将正确的验证码内容存入了$_SESSION中,比如存储在$_SESSION['verify_code']字段,之后调整控制器的login逻辑,在验证用户名密码之前先校验验证码:
public function login(){ // 开启session(如果项目全局已经开启可以删除这行) session_start(); if(isset($_POST['login']) && $_POST['login'] == 1){ foreach($_POST as $key=>$value){ $this->Maccount->$key = trim($value); } // 新增验证码校验逻辑 if(!isset($this->Maccount->bot) || empty($this->Maccount->bot)){ $this->errors[] = '请输入验证码'; }elseif(strcasecmp($this->Maccount->bot, $_SESSION['verify_code']) != 0){ // strcasecmp为不区分大小写比对,符合验证码通用使用习惯 $this->errors[] = '验证码错误'; }else{ // 校验通过后销毁当前验证码,防止被重复提交使用 unset($_SESSION['verify_code']); // 原有用户名、密码校验逻辑放在验证码校验通过后执行 if(!isset($this->Maccount->user)) $this->errors[] = 'No username given.'; else{ if(!isset($this->Maccount->password)) $this->errors[] = 'No password given.'; else{ if(!$this->Maccount->valid_username($this->Maccount->user)) $this->errors[] = 'Invalid username.'; else{ if(!$this->Maccount->valid_password($this->Maccount->password)) $this->errors[] = 'Invalid password.'; else{ if($this->Maccount->login_user()){ header('Location: '.$this->config->base_url.'account'); exit; // 跳转后增加exit终止后续代码执行 } else{ $this->errors[] = 'Wrong username or password.'; } } } } } } } if(!empty($this->errors)){ $this->load->set('errors', $this->errors); } $this->load->view($this->load->get('tmp').DS.'account'.DS.'login'); }
额外注意点
- 验证码要设置过期时间,一般5分钟内有效,避免被暴力破解
- 每次验证无论成功失败都要刷新验证码,防止同一个验证码被多次尝试
内容的提问来源于stack exchange,提问作者Vasilica Dimancescu
相关产品推荐
相关产品推荐

