Санизировать ввод пользователя в laravel

У меня есть простой вопрос: Когда лучше всего санировать вход пользователя? И какая из них считается лучшей практикой:

  • Дезактивировать данные перед записью в базу данных.
  • Сохранить исходные данные и дезинфицировать их в представлении.

Например, используйте HTML::entities() и сохраните результат в базе данных. Или используя методы HTML в представлениях, потому что в этом случае laravel по умолчанию использует HTML::entities(). Или, возможно, используя оба.

EDIT: Я нашел интересный пример http://forums.laravel.com/viewtopic.php?id=1789. Есть ли другие способы решить эту проблему?

Ответ 1

Я бы сказал, что вам нужны оба места, но по разным причинам. Когда поступают данные, вы должны проверять данные в соответствии с доменом и отклонять запросы, которые не соответствуют требованиям. В качестве примера нет смысла указывать тег (или текст в этом случае), если вы ожидаете число. Для параметра, представленного в год, вы даже можете проверить, что он находится в некотором диапазоне. Санитация запускается для бесплатных текстовых полей. Вы можете сделать простую проверку для неожиданных символов, например, 0-байтов. Имхо лучше хранить raw через безопасный sql (параметризованные запросы), а затем правильно кодировать для вывода. Есть две причины. Во-первых, если у вашего sanitizer есть ошибка, что вы делаете со всеми данными в вашей базе данных? Пересоединение может иметь нежелательные последствия. Во-вторых, вы хотите выполнить контекстное экранирование, независимо от того, какой вы используете (JSON, HTML, HTML-атрибуты и т.д.)

Ответ 2

У меня есть полная статья о фильтрации входных данных в Laravel, вам может показаться полезным http://usman.it/xss-filter-laravel/, вот отрывок из этого статья:

Вы можете сделать глобальную очистку XSS самостоятельно, если у вас нет библиотеки для записи общих методов, которые вам могут понадобиться часто, я прошу вас создать новую библиотеку Common в приложении/библиотеке. Поместите эти два метода в свою общую библиотеку:

/*
 * Method to strip tags globally.
 */
public static function global_xss_clean()
{
    // Recursive cleaning for array [] inputs, not just strings.
    $sanitized = static::array_strip_tags(Input::get());
    Input::merge($sanitized);
}

public static function array_strip_tags($array)
{
    $result = array();

    foreach ($array as $key => $value) {
        // Don't allow tags on key either, maybe useful for dynamic forms.
        $key = strip_tags($key);

        // If the value is an array, we will just recurse back into the
        // function to keep stripping the tags out of the array,
        // otherwise we will set the stripped value.
        if (is_array($value)) {
            $result[$key] = static::array_strip_tags($value);
        } else {
            // I am using strip_tags(), you may use htmlentities(),
            // also I am doing trim() here, you may remove it, if you wish.
            $result[$key] = trim(strip_tags($value));
        }
    }

    return $result;
}

Затем поместите этот код в начало вашего перед фильтра (в приложении /routes.php):

//Our own method to defend XSS attacks globally.
Common::global_xss_clean();

Ответ 3

Я только что нашел этот вопрос. Другой способ сделать это - заключить динамический вывод в тройные скобки, такие как {{{ $var }}}, и лезвие выйдет за строку для вас. Таким образом, вы можете сохранить потенциально опасные символы, если они важны где-то еще в коде и отображают их как экранированные строки.

Ответ 4

Это зависит от пользовательского ввода. Если вы, как правило, собираетесь выводить код, который они могут предоставить (например, возможно, это сайт, который содержит фрагменты кода), тогда вы будете санировать на выходе. Это зависит от контекста. Если вы запрашиваете имя пользователя и вводите теги HTML, ваша проверка должна подбирать это и идти "нет, это не круто, человек!"

Если это похоже на пример, который я изложил ранее (фрагменты кода), то пусть он пройдет через RAW (но обязательно убедитесь, что ваша база данных не сломается) и дезинфекция на выходе. При использовании PHP вы можете использовать htmlentities($string).

Ответ 5

я нашел это, потому что меня беспокоило xss в laravel, так что это пакеты gvlatko

легко:

Очистить ввод = $cleaned = Xss:: clean (Input:: get ('comment');

Использовать в views = $cleaned = Xss:: clean (Input:: file ('profile'), TRUE);