Подтвердить что ты не робот

Что является хорошим методом для дезинфекции всего массива $_POST в php?

У меня есть форма с большим количеством переменных, которые затем отправляют электронное письмо, а не дезинфицируют каждое значение $_POST с помощью filter_var($_POST['var'], FILTER_SANITIZE_STRING);. Я был после более простой части кода. Я придумал ниже, что, похоже, работает, поскольку я считаю, что действие по умолчанию FILTER_SANITIZE_STRING, но мне просто интересно, что такое мнения людей, и если это не хорошая практика, возможно, вы могли бы мне объяснить, почему? Значения $_POST затем индивидуально внедряются в новые переменные, поэтому я бы использовал массив array_map только в начале, чтобы дезинформировать все...

$_POST = array_map('filter_var', $_POST);

Спасибо за ваши ответы, чтобы дать вам немного больше информации, в основном:

У меня есть 20-30 полей ввода в форме, которая захватывается, данные затем отображаются пользователю для проверки их ввода, переменные затем дезинфицируются, пользователь затем отправляет электронное письмо и затем, наконец, детали вводятся в db.

В настоящее время я дезинфицирую использующ вышеуказанную функцию array_map, а также FILTER_SANITIZE_EMAIL на адресе электронной почты перед отправкой электронной почты, а затем избегая ввода с помощью mysql_real_escape_string() перед вставкой в ​​db. Не вдаваясь в подготовленные заявления и т.д., Как вы думаете, я должен делать что-нибудь дополнительно? Еще раз спасибо!

4b9b3361

Ответ 1

Если тип каждой из ваших входных переменных является строкой, и вы хотите дезинформировать их все сразу, вы можете использовать:

// prevent XSS
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Это будет дезинфицировать ваши массивы $_GET и $_POST.

Видел здесь: PHP -Применение значений массива

Ответ 2

Зависит от того, для чего он используется.

Если вы вставляете его в базу данных, то mysql_real_escape_string() для цитируемых строк и тип каста для чисел будет способ пойти - хорошо идеально подготовленные заявления, но это совершенно другой вопрос.

Если вы планируете выводить данные на веб-страницу, я бы рекомендовал что-то вроде htmlspecialchars()

Если вы планируете использовать пользовательский ввод в качестве аргумента оболочки, вы должны использовать escapeshellarg()

Перейдем к вашему вопросу об отправке писем. Ну, должно быть достаточно:

filter_var($_POST['message'], FILTER_SANITIZE_STRING);

Все это делает в основном стрип-теги и кодирует специальные символы.

Ответ 3

Не существует правильного способа сделать полноценную санитарию. Какой метод санитарии вам нужен, зависит от того, что делается с данными.

Санируйте данные непосредственно перед использованием.

Ответ 4

Это то, что я использую во всех моих проектах:

function util_array_trim(array &$array, $filter = false)
{
    array_walk_recursive($array, function (&$value) use ($filter) {
        $value = trim($value);
        if ($filter) {
            $value = filter_var($value, FILTER_SANITIZE_STRING);
        }
    });

    return $array;
}

Он позволяет обрезать и дезинфицировать вложенный массив опубликованных данных

Ответ 5

Чтобы применить определенные фильтры к нескольким полям, используйте оператор switch.

$post  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

foreach($post as $k => $v) {
    switch ($k) {
        case 'int_1':
        case 'int_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_INT) * 1;
            break;
        case 'float_1':
        case 'float_2':
            $post[$k] = filter_var($v, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION) * 1;
            break;
        default:
            break;
    }
}

Примечание. Моя среда IDE (NetBeans) предупреждает об использовании глобального $_POST где-либо как нарушение безопасности, поэтому я просто привык вместо этого использовать локальную переменную $post. Если вы решите не выполнять санацию общей строки, для случая default: можно использовать FILTER_SANITIZE_STRING.