Что является хорошим методом для дезинфекции всего массива $_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. Не вдаваясь в подготовленные заявления и т.д., Как вы думаете, я должен делать что-нибудь дополнительно? Еще раз спасибо!
Ответы
Ответ 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
.