2013-03-06 3 views
0

Le système de messagerie utilise la même fonction pour envoyer et répondre aux messages. Un utilisateur envoie un message à un autre avec comme sujet: "juste tester £ 69 $ 100 @ ha". Et le message contient du texte, php et html. PHP est supprimé par CI xss_clean et html est bloqué/remplacé par le système. Il est envoyé sans erreurs. L'autre utilisateur le reçoit, l'ouvre et essaie de répondre avec un texte en clair de 47 caractères. La classe de validation de formulaire CI le bloque et affiche une erreur: le sujet doit comporter moins de 1000 caractères. Le premier et le plus important est qu'il ne devrait pas déclencher une erreur de validation. Deuxièmement CI forme val. a sujet réglé à max. 30 caractères, et le message réglé à max 1000 caractères - de sorte que le message d'erreur est également incorrect. Mon intuition est que l'un des personnages du sujet bouleverse la forme CI. mais ça ne l'a pas bouleversé quand le message original a été envoyé! Une idée de ce qui se passe ici?Problème de validation Codeigniter

Voici le code pertinent du formulaire;

<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); ?>"> 

Et voici le code du contrôleur;

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

avez-vous chargé l'aide de formulaire? – sandip

+0

@sandip Oui, il y aurait une erreur si je ne l'avais pas fait. – Ally

Répondre

0

Vous écrasez les messages affectés aux règles.

Veuillez noter que $this->form_validation->set_message fonctionne par règle. Non, par champ par règle. Ainsi, lorsque vous définissez $this->form_validation->set_message('max_length'... pour la deuxième fois, il écrase le message initial affecté à l'exigence 'max_length'.

En général, vous n'avez pas besoin de définir de messages pour ceux-ci, codeigniter lui-même générera un message d'erreur décent en fonction de vos besoins.

Dans mon flux de travail, j'utilise généralement la fonction set_message pour générer des messages aux validations de rappel personnalisées que nous effectuons sur les champs de formulaire.

+0

Merci d'avoir signalé cela. Je n'ai pas encore tout à fait compris la classe de validation de CI. Cependant, cela ne cause pas le problème. Pour contourner le problème pour l'instant j'ai contourné la validation du sujet pour les réponses car le sujet n'est pas modifiable pour les réponses et a déjà passé la validation lorsque le message original a été envoyé. Cela ne supprime cependant pas le fait qu'il y a un problème, peut-être avec la classe de validation de CI et éventuellement le caractère de livre sterling "£". – Ally

+0

Vous ne devez pas contourner la validation car un champ n'est pas modifiable. Toute personne sachant comment utiliser Firebug changera le formulaire pour ce qu'il veut. La classe de validation validera tout ce que vous lui dites pour valider les caractères spéciaux ne sont pas vraiment un problème basé sur les règles que vous avez posté. – dakdad