Codeigniter выход и безопасность ввода - PullRequest
1 голос
/ 09 октября 2011

В случае, если пользователь отправил текст, при выводе на страницу, какой текстовый фильтр вы используете как при вводе, так и при выводе?

Насколько я понимаю, использование $this->input->post('something',true) очистит содержимое XSS от входных данных, так что нет другого способа обеспечения безопасности? Что-то вроде htmlspecialchars(), strip_tags() и т. Д .?

Также я хотел бы знать, если, например, htmlspecialchars () хорошо использовать, почему библиотека безопасности CI не применяет htmlspecialchars () по умолчанию к переданной строке?

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Вы должны использовать библиотеку 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 голос
/ 10 октября 2011

Насколько я понимаю, вы хотели бы сохранить отправленный пользователем текст в базе данных, а затем отобразить его на странице - что-то вроде базовой системы комментирования или чего-то еще. Вы просто не хотите, чтобы при выводе этой страницы какие-либо непослушные / неполные символы 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. Надеюсь, это поможет, удачи, чувак, и, как всегда, ничто не может быть абсолютно безопасным.

1 голос
/ 09 октября 2011

Тип зависит от того, что вы делаете с этим вводом, но, скорее всего, вы захотите пропустить строку и через htmlspecialchars().

...