Дезинфицировать пользовательский ввод в laravel

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

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

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

5 ответов


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


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

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

/*
 * 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;
}

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

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

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


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

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


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

Это легко:

очистить входные данные = $ cleaned = Xss:: clean (Input:: get ('comment');

использовать в представлениях = $cleaned = Xss:: clean (Input:: file ('profile'), TRUE);