You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:15:02