繁体   English   中英

Codeigniter验证问题

[英]Codeigniter validation issue

消息系统使用相同的功能来发送和回复消息。 一个用户向另一位用户发送一条消息,主题为:“仅测试£69 $ 100 @ ha”。 消息包含文本,php和html。 PHP被CI xss_clean剥离,并且html被系统阻止/替换。 它被发送没有错误。 其他用户收到它,打开它,然后尝试以47个字符的纯文本答复。 CI表单验证类将其阻止并显示错误:主题必须小于1000个字符。 第一个也是最重要的问题是它不应触发验证错误。 其次CI形式val。 将主题设置为最大。 30个字符,并且消息设置为最大1000个字符-因此错误消息也不正确。 我的直觉是,该学科中的一个人物正在破坏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';
        }
     }

}

您正在覆盖为规则分配的消息。

请注意, $this->form_validation->set_message按规则工作。 不,每个规则每个字段。 因此,当您第二次设置$this->form_validation->set_message('max_length'...时,它将覆盖分配给'max_length'要求的初始消息。

通常,您无需为此设置消息,codeigniter本身会根据您的要求生成不错的错误消息。

在我的工作流程中,我通常使用set_message函数来生成消息,以对表单字段进行自定义回调验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM