0

メッセージング システムは、メッセージの送信と返信に同じ機能を使用します。1 人のユーザーが別のユーザーに、件名「just testing £69 $100 @ ha」のメッセージを送信します。メッセージには、テキスト、php、および html が含まれます。PHP は CI xss_clean によって削除され、html はシステムによってブロック/置換されます。エラーなしで送信されます。他のユーザーがそれを受け取り、それを開き、47 文字のプレーン テキストで返信しようとします。CI フォーム検証クラスはそれをブロックし、エラーを表示します: 件名は 1000 文字未満である必要があります。最初の最も重要な問題は、検証エラーをトリガーしてはならないということです。次に、CI フォームの値です。件名を最大に設定しています。30 文字、メッセージが最大 1000 文字に設定されているため、エラー メッセージも正しくありません。私の推測では、件名の登場人物の 1 人が CI フォーム val を混乱させているようです。しかし、元のメッセージが送信されたとき、それは動揺しませんでした!

フォームからの関連コードは次のとおりです。

<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';
        }
     }

}
4

1 に答える 1

0

ルールに割り当てられたメッセージを上書きしています。

$this->form_validation->set_messageルールごとに機能することに注意してください。ない、ルールごとのフィールドごと。したがって、$this->form_validation->set_message('max_length'...2回目に設定すると、「max_length」要件に割り当てられた最初のメッセージが上書きされます。

通常、これらのメッセージを設定する必要はありません。codeigniter自体が、要件に基づいて適切なエラーメッセージを生成します。

私のワークフローでは、通常、set_message関数を使用して、フォームフィールドで行うカスタムコールバック検証へのメッセージを生成します。

于 2013-03-06T03:12:13.933 に答える