2013-03-06 82 views
0

消息系統使用相同的功能發送和回覆消息。一個用戶發送消息給另一個主題:「只測試69英鎊100美元@公頃」。並且消息包含文本,php和html。 PHP被CI xss_clean剝離,html被系統阻塞/取代。它發送沒有錯誤。其他用戶收到它,打開它並嘗試用47個字符的純文本回復。 CI表單驗證類將其封鎖並顯示錯誤:主題必須少於1000個字符。第一個也是最重要的問題是它不應該引發驗證錯誤。其次CI形式val。已將主題設置爲最大。 30個字符,並將消息設置爲最多1000個字符 - 因此錯誤消息也不正確。我的直覺是,這個主題中的一個角色正在打亂CI形式val。但是當原始信息被髮送時它並沒有讓它感到不安!任何想法這裏發生了什麼?Codeigniter驗證問題

以下是表單中的相關代碼;

<form name="sendmessage" method="POST" action="<? echo base_url(); ?>user/messaging/sendmessage/"> 
     <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" /> 
     <input type="hidden" name="recipiant" value="<? echo $message['mem_msg_from_id']; ?>" /> 
     <input type="hidden" name="thread" value="<? echo $message['mem_msg_thread_id']; ?>" /> 
     <? if(substr($message['mem_msg_subject'],3) == 'Re:'){$subject = $message['mem_msg_subject'];}else{$subject = 'Re: ' . $message['mem_msg_subject'];} ?> 
     <input type="hidden" name="subject" value="<? echo ucfirst($subject); ?>"> 

這裏是控制器代碼;

public function sendmessage(){ 
    if($this->input->is_ajax_request()){ // ajax request only 
     $subject = $this->input->post('subject',TRUE); 
     $message = $this->input->post('message',TRUE); 
     $recipiant = $this->input->post('recipiant',TRUE); 
     $thread_id = $this->input->post('thread',TRUE); 

     $subject_val = $this->form_validation->set_rules('subject', 'Subject', 'required|min_length[3]|max_length[30]'); 
     $subject_req_error = $this->form_validation->set_message('required', 'A %s is required!'); 
     $subject_min_error = $this->form_validation->set_message('min_length', '%s must be at least 3 characters!'); 
     $subject_max_error = $this->form_validation->set_message('max_length', '%s must be under 30 characters!'); 

     $message_val = $this->form_validation->set_rules('message', 'Message', 'required|min_length[5]|max_length[1000]'); 
     $message_req_error = $this->form_validation->set_message('required', 'A %s is required!'); 
     $message_min_error = $this->form_validation->set_message('min_length', '%s must be at least 5 characters!'); 
     $message_max_error = $this->form_validation->set_message('max_length', '%s must be under 1000 characters!'); 

     $this->form_validation->set_error_delimiters('<div class="pull-left">','&nbsp;</div><br>'); 


     if ($this->form_validation->run() == FALSE){ // FAILED TRY AGAIN 
      echo '<div style="font-weight: bold; color: red;">' . form_error('subject') . form_error('message') . '</div>'; 
     }else{ // ALL SEEMS TO BE IN ORDER HERE 

      // clean it up a bit 
      $subject = str_replace('<', '', $subject); 
      $subject = str_replace('>', '' , $subject); 
      $subject = auto_link($subject, 'both', TRUE); 

      $message = str_replace('<', '', $message); 
      $message = str_replace('>', '' , $message); 
      $message = auto_link($message, 'both', TRUE); 

      // stick it in the database 
      $db = $this->user_messaging_model->sendMessage($this->userinfo['user_id'], $recipiant, $subject, $message, $thread_id); 

      echo 'sent'; 
     } 
    } 

} 
+0

你有沒有加載表單助手? – sandip 2013-03-06 04:26:20

+0

@sandip是的,如果我沒有,它會拋出一個錯誤。 – Ally 2013-03-06 16:42:50

回答

0

您正在覆蓋爲規則分配的消息。

請注意,$this->form_validation->set_message按規則工作。不是,每個規則每個字段。因此,當您第二次設置$this->form_validation->set_message('max_length'...時,它會覆蓋分配給「max_length」要求的初始消息。

一般而言,您不需要爲這些消息設置消息,codeigniter本身會根據您的要求生成不錯的錯誤消息。

在我的工作流程中,我通常使用set_message函數來生成消息來自定義回調驗證,我們在表單字段上進行驗證。

+0

謝謝你指出。我還沒有在CI的驗證課上得到我的頭。但是,這不會導致問題。爲了解決這個問題,我已經繞過了回覆的主題驗證,因爲主題對於回覆是不可編輯的,並且在原始郵件發送時已經通過了驗證。這並沒有消除這個問題,儘管CI的驗證類和英鎊的字符可能是「£」。 – Ally 2013-03-06 16:50:42

+0

您不應該繞過驗證,因爲字段不可編輯 - 任何知道如何使用Firebug的人都會將表單更改爲任何他們想要的內容。驗證類將驗證您告訴它的任何內容,以驗證特殊字符不是基於您發佈的規則的問題。 – dakdad 2013-03-06 23:45:17