Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CodeIgniter验证码验证_Php_Validation_Codeigniter_Captcha - Fatal编程技术网

Php CodeIgniter验证码验证

Php CodeIgniter验证码验证,php,validation,codeigniter,captcha,Php,Validation,Codeigniter,Captcha,我已经创建了一些表单,用于将数据插入数据库,并用于检查数据是否是从human发送的。我使用了CAPTCHA,它已经集成到CI中 这是我的控制器: $checkrules = array( 'img_path' => realpath(APPPATH . '../upload/checking/img') . '/', 'img_url' => base_url() . 'upload/checking/img/', 'font_

我已经创建了一些表单,用于将数据插入数据库,并用于检查数据是否是从human发送的。我使用了CAPTCHA,它已经集成到CI中

这是我的控制器:

    $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);
    }
我现在的问题是验证验证码的最佳方法是什么

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

2.)将验证码代码插入数据库并进行检查。问题是,将有大量的加载数据库,它将非常繁忙


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

我建议您使用易于在codeigniter中实现的recaptcha:


公共功能索引()
{   
$this->load->helper(数组('form','url','captcha');
$this->load->library('form_validation');
$this->form_validation->set_error_分隔符(“”,);
$this->form_validation->set_规则('username'、'username'、'trim | required | xss_clean');
$this->form_validation->set_rules('password','password','trim | required | xss|u clean | callback|u check_database');
$this->form_validation->set_规则('captcha','captcha','callback_validate_captcha');
如果($this->form\u validation->run()==FALSE)
{
$original_string=array_merge(范围(0,9)、范围('a','z')、范围('a','z'));
$original\U string=内爆(“,$original\U string”);
$captcha=substr(str_shuffle($original_string),0,6);
//字段验证失败。用户已重定向到登录页
$VAL=数组(
“word”=>$captcha,
“img_路径”=>“./captcha/”,
'img_url'=>'http://mycodeignitor.org/captcha/',
'font_path'=>BASEPATH'font/texb.ttf',
“img_宽度”=>150,
“img_高度”=>50,
“到期日”=>7200
);
$cap=创建验证码($VAL);
$data['image']=$cap['image'];
如果(文件_存在(BASEPATH.../captcha/“$this->session->userdata['image']))
取消链接(BASEPATH.../captcha/“$this->session->userdata['image']);
$this->session->set_userdata(数组('captcha'=>$captcha,'image'=>$cap['time']..jpg');
$this->load->view('index\u index',$data);
}
其他的
{
如果(文件_存在(BASEPATH.../captcha/“$this->session->userdata['image']))
取消链接(BASEPATH.../captcha/“$this->session->userdata['image']);
$this->session->unset_userdata('captcha');
$this->session->unset_userdata('image');
重定向(“主页”、“刷新”);
}
}
公共函数验证\验证码(){
如果($this->input->post('captcha')!=$this->session->userdata['captcha'))
{
$this->form_validation->set_message('validate_captcha','错误的验证码,嗯,你是终结者吗?');
返回false;
}否则{
返回true;
}
}

是的,解决我的问题是件好事,但以我目前的方式不是,因为我需要在系统中使用集成的解决方案。这是一个集成的解决方案,不是真的,因为如果我尝试在脱机模式下工作,这将不起作用。可能你没有正确设置它,因为所有键都与localhost一起工作,正如文档所说:嗨,img_路径将有一个我应该保存的图像,或者codeIgniter将创建它?我不知道该怎么做actually@AkhilrajN S:我已经按照你的步骤做了,但是captha似乎不起作用,而且表单还是提交了。我已经按原样使用了您的回调函数,并尝试了以下插入的方法:if(0!==strcmp($this->input->post('captcha'),$this->session->userdata['captcha')),但都具有相同的效果。最后一件事是,我试图从文件夹中删除图像,但出现错误“取消链接(完整路径\验证码):权限被拒绝”。@Deepanshu,img_路径是您希望保存验证码图像的文件夹/目录。您必须创建该文件夹。将在那里保存的图像是通过验证码在PHP中创建的图像。
 * 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;
    }

}