2012-05-13 16 views
2

データをデータベースに挿入するためのフォームを作成し、データが人間から送られたかどうかを確認するために、既にCIに統合されているCAPTCHAを使用しました。CodeIgniter CAPTCHA validation

これは私のコントローラである:

$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.)私が既に行ったコールバックを作成しましたが、フォームを送信すると新しいCAPTCHAコードでエラーが発生したため問題がありました。

2.)CAPTCHAのコードをデータベースに挿入し、そこからチェックします。問題は、データベースの読み込みが多くなり、非常に忙しいためです。

2番目の質問です。このCAPTCHAはフォルダ内の.jpg画像のみを保存しているのですか、それとも他の形式ですか? (私は、彼らが使用された後、このキャプチャのを削除したいので、私はこれを聞いてるのよ。)

答えて

6
* 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; 
    } 

} 
+0

こんにちは、img_pathは私がコードを保存するかコードを作成する予定ですか?どのように実際に動作するのか混乱しています –

+0

@Akhilraj N S:私はあなたの手順に従ってきましたが、capthaは動作していないようで、フォームはとにかく提出されます。 私はあなたのコールバック関数をそのまま使っていましたが、このinsetedも試しました:if(0!== strcmp($ this-> input-> post( 'captcha')、$ this-> session-> userdata ['captcha' ]))でも、すべて同じ効果があります。 最後に、フォルダから画像を削除しようとしましたが、「unlink(フルパス\キャプチャ):権限が拒否されました」というエラーが表示されます。 – Lykos

+0

@Deepanshu、img_pathは、キャプチャ画像を保存するフォルダ/ディレクトリです。そのフォルダを作成する必要があります。そこに保存される画像には、キャプチャを介してPHPで作成された画像がありました。 – user1149244

0

私はあなたがCodeIgniterの中で実装が容易であるreCAPTCHAの使用することをお勧め:http://codeigniter.com/wiki/ReCAPTCHA

+0

をはい、私の問題を解決するのは良いことですが、現状ではそうではありません。システムに統合されたソリューションが必要なためです。 – user1257255

+0

これは統合された解決策です – bottleboot

+0

オフラインモードで作業しようとすると機能しません。 – user1257255