Codeigniter输出和输入安全性

时间:2011-10-09 16:23:19

标签: php codeigniter sanitization

如果用户提交了文本,在输出到页面时,您在输入和输出中使用了什么文本过滤器?

据我了解,使用$this->input->post('something',true)将从输入数据中清除XSS内容,因此没有其他事情要做到安全吗?像htmlspecialchars()strip_tags()等等?

另外我想知道例如htmlspecialchars()是否适合使用,为什么CI安全库默认情况下不会将htmlspecialchars()应用于传递的字符串?

3 个答案:

答案 0 :(得分:3)

您应该使用form_validation库。您可以执行基于规则的检查和过滤。这是一种更有效的验证输入数据的方法。

以下是内置规则,任何带有一个参数的已定义函数都可以用作过滤器/规则。

required
matches
min_length
max_length
exact_length
greater_than
less_than
alpha
alpha_numeric
alpha_dash
numeric
integer
decimal
is_natural
is_natural_no_zeroetc    
valid_email
valid_emails
valid_ip
valid_base64

答案 1 :(得分:1)

有点取决于你对这个输入做了什么,但很可能你也想要通过htmlspecialchars()来运行字符串。

答案 2 :(得分:1)

据我了解,您希望将用户提交的文本存储在数据库中,然后将其显示在页面上 - 有点像基本的评论系统或其他东西。您只是不希望任何顽皮/不完整的HTML字符在输出时打破您的页面。

每当您有用户提交的数据时,您希望利用form_validation库进行清理并尽可能地将其清理,作为一种良好的安全措施。如果它进入您的数据库,您应该使用Active Records或Query Binding从Codeigniter获得额外的安全性,例如转义字符串等。

让我展示我在网站上提交和输出用户输入的解决方案。可能有更好的方法来做到这一点,但这将完成工作。

<?php

/*Controller
**************************************************/

class Something extends CI_Controller {

     function comments_or_whatever() {
         //Required -> trim value -> max_length of 100 -> strip HTML tags -> remove additional HTML entities missed by strip tags
        $this->form_validation->set_rules('input_1', 'The First User Input', 'required|trim|max_length[100]|xss_clean|strip_tags|callback__remove_html_entities');
        $this->form_validation->set_rules('input_2', 'The Second User Input', 'trim|exact_length[11]|xss_clean|strip_tags|callback__remove_html_entities');

        if ($this->form_validation->run() == FALSE) {
                //form didn't validate.. try again display error messages
                $this->load->view('your_view');
            }
        } else {
            $input_1 = $this->input->post('input_1');
            $input_2 = $this->input->post('input_2');

            $submission_array = array(
                        'db_field_1' => $input_1,
                        'db_field_2' => $input_2
                        );
            $this->load->model('comments');
            $result = $this->comments->submit_comments_or_whatever($submission_array);

            if ($result['is_true'] == TRUE) {
                //creates a temporary flash message and redirects to current page
                //if on a windows server use 'refresh' instead of 'location'
                $this->session->set_flashdata('message', '<div class="message">'.$result['message'].'</div>');
                redirect('something', 'location');
            } else {
                $data['message'] = $result['message'];
                $this->load->view('your_view', $data);
            }
        }
    }

    // Very important to get rid calling HTML Entities via HTML number codes such as &#60 etc. Strip_tags does not do this.
    // This is privately called during validation from the callback__remove_html_entities custom callback
    function _remove_html_entities($submission) {
        $submission = preg_replace("/&#?[a-z0-9]{2,8};/i","",$submission);
        return $submission;
    }
}

/* Model
 ****************************************/
class Comments extends CI_Model {

    function submit_comments_or_whatever($submission_array) {
        // Active record escapes string and does additional security 
        $query = $this->db->insert('comments', $submission_array);

        if ($query == TRUE) {
            $data['is_true'] = TRUE;
            $data['message'] = 'Your message has been successfully shared!';
            return $data;
        } else {
            $data['is_true'] = FALSE;
            $data['message'] = 'Sorry, but there was an error dude inserting your message into the database.';
            return $data;
        }
    }
}

/* View -> your_view.php
****************************************/

<?php echo validation_errors('<div class="message">', '</div>'); ?>
<?php echo $this->session->flashdata('message'); ?>
<?php if (!empty($message)) echo '<div class="message">'.$message.'</div>'; ?>




<?php echo form_open('something/comments_or_whatever'); ?>

<?php echo form_label('The First User Input', 'input_1'); ?><br>
<?php $input_1_form = array('name' => 'input_1', 'id' => 'input_1', 'value' => set_value('input_1')); ?>
<?php echo form_input($input_1_form); ?><br>

<?php echo form_label('The Second User Input', 'input_2'); ?><br>
<?php $input_2_form = array('name' => 'input_2', 'id' => 'input_2', 'value' => set_value('input_2')); ?>
<?php echo form_input($input_2_form); ?><br>

<?php echo form_submit('submit', 'Dude, submit my user inputed text!'); ?>
<?php echo form_close(); ?>

此代码假定您自动加载表单验证,会话和数据库库以及表单助手。现在,在表单验证期间,使用自定义正则表达式回调将所有用户输入的数据剥离为最少的纯文本。所有顽皮的HTML角色完全消失/消毒。您现在可以放心地在网页上的任何地方输出提交的数据,而不会破坏或担心安全问题。

仅仅执行HTMLSpecialChars()和html解码的问题是它没有考虑不完整的HTML标记。希望这有帮助,祝你好运,而且一如既往,没有什么是完全安全的。