【问题标题】:CodeIgniter CAPTCHA validationCodeIgniter 验证码验证
【发布时间】:2012-05-21 06:10:08
【问题描述】:

我创建了一些表单,用于将数据插入数据库并检查数据是否来自人类,我使用了已集成到 CI 的 CAPTCHA。

这是我的控制器:

    $checkrules = array(
        'img_path' => realpath(APPPATH . '../upload/checking/img') . '/',
        'img_url' => base_url() . 'upload/checking/img/',
        'font_path' => realpath(APPPATH . '../upload/checking/font.ttf'),
        'img_width' => 150,
        'img_height' => 30,
        'expiration' => 7200
    );

    $check = create_captcha($checkrules);
    $data['checkimg'] = $check['image'];

    $this->form_validation->set_rules('name', 'Name', 'required|max_length[40]|xss_clean');
    $this->form_validation->set_rules('email', 'E-mail', 'required|valid_email|xss_clean');
    $this->form_validation->set_rules('website', 'Website', 'max_length[80]|prep_url|xss_clean');
    $this->form_validation->set_rules('comment', 'Comment', 'required|xss_clean');
    $this->form_validation->set_rules('check', 'Check', 'required|xss_clean');

    if ($this->form_validation->run() == FALSE)
    {
        $this->load->view('cms/theme', $data);
    }
    else
    {
        echo "success";
        $this->load->view('cms/theme', $data);
    }

我现在的问题是验证 CAPTCHA 的最佳方法是什么?

1.) 创建回调,我已经完成了,但是出现了问题,因为当我发送表单时新的验证码出错。

2.) 将 CAPTCHA 的代码插入数据库并从中检查。问题是因为会有很多加载数据库,而且会很忙。

第二个问题。此验证码是否仅将 .jpg 图片保存在文件夹中,或者它可以是任何其他格式? (我问这个是因为我想在使用后删除这个验证码。)

【问题讨论】:

    标签: php validation codeigniter captcha


    【解决方案1】:
     * Example of captcha validation without database useage
     * Instead of it used session to store captcha value
     * The images will be deleted after the use
    

    public function index()
    {   
        $this->load->helper(array('form', 'url','captcha'));
        $this->load->library('form_validation');
    
           $this->form_validation->set_error_delimiters('<div class="error">', '</div>');
           $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
           $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');
           $this->form_validation->set_rules('captcha', 'Captcha', 'callback_validate_captcha');
    
        if($this->form_validation->run() == FALSE)
           {
    
            $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
            $original_string = implode("", $original_string);
            $captcha = substr(str_shuffle($original_string), 0, 6);
    
             //Field validation failed.  User redirected to login page
            $vals = array(
                    'word' => $captcha,
                    'img_path' => './captcha/',
                    'img_url' => 'http://mycodeignitor.org/captcha/',
                    'font_path' => BASEPATH.'fonts/texb.ttf',
                    'img_width' => 150,
                    'img_height' => 50,
                    'expiration' => 7200
            );
    
            $cap = create_captcha($vals);
            $data['image'] = $cap['image'];
    
            if(file_exists(BASEPATH."../captcha/".$this->session->userdata['image']))
                unlink(BASEPATH."../captcha/".$this->session->userdata['image']);
    
            $this->session->set_userdata(array('captcha'=>$captcha, 'image' => $cap['time'].'.jpg'));
            $this->load->view('index_index',$data);
           }
           else
           {
                if(file_exists(BASEPATH."../captcha/".$this->session->userdata['image']))
                    unlink(BASEPATH."../captcha/".$this->session->userdata['image']);
    
                $this->session->unset_userdata('captcha');
                $this->session->unset_userdata('image');
                redirect('home', 'refresh');
           }
    
    
    
    }
    
    public function validate_captcha(){
        if($this->input->post('captcha') != $this->session->userdata['captcha'])
        {
            $this->form_validation->set_message('validate_captcha', 'Wrong captcha code, hmm are you the Terminator?');
            return false;
        }else{
            return true;
        }
    
    }
    

    【讨论】:

    • 嗨,img_path 会有一个我应该保存的图像,还是 codeIgniter 会创建它?我很困惑它实际上是如何工作的
    • @Akhilraj N S:我已按照您的步骤操作,但验证码似乎无法正常工作,并且无论如何都会提交表单。我已经按原样使用了您的回调函数,并且还尝试了插入: if (0 !== strcmp($this->input->post('captcha'), $this->session->userdata['captcha']) ) 但都具有相同的效果。最后一件事我试图从文件夹中删除图像,但我收到错误“unlink(full-path\captcha): Permission denied”。
    • @Deepanshu,img_path 是您希望保存验证码图像的文件夹/目录。您必须创建该文件夹。将保存在那里的图像是通过验证码在 PHP 中创建的图像。
    【解决方案2】:

    我建议你使用在codeigniter中易于实现的recaptcha:http://codeigniter.com/wiki/ReCAPTCHA

    【讨论】:

    • 是的,解决我的问题是件好事,但以我目前的方式不是,因为我需要在系统中集成解决方案。
    • 这是一个集成解决方案
    • 不是真的,因为如果我尝试在离线模式下工作,这将不起作用。
    • 也许你没有正确设置它,因为所有的键都与 localhost 一起工作,正如文档所说:developers.google.com/recaptcha/intro?hl=it-IT
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2010-12-31
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多