Фильтрация ввода формы PHP - PullRequest
2 голосов
/ 04 января 2012

Я новичок в PHP и работаю над базовым сценарием проверки формы.Я понимаю, что входная фильтрация и выходной выход жизненно важны по соображениям безопасности.У меня вопрос: достаточно ли безопасен код, который я написал ниже?Сначала несколько поясняющих замечаний.

  1. Я понимаю, что есть разница между очисткой и проверкой.В приведенном ниже поле примера поле представляет собой простой текст, поэтому все, что мне нужно сделать, это санировать его.
  2. $ clean ['myfield'] - это значение, которое я отправил бы в базу данных MySQL.Я использую подготовленные операторы для взаимодействия с моей базой данных.
  3. $ html ['myfield'] - это значение, которое я отправляю обратно клиенту, чтобы, когда он / она отправляет форму с недопустимыми / неполными данными, очищеннаяполя, в которых есть данные, будут заполнены заново, поэтому им не придется вводить все с нуля.

Вот (слегка очищенный) код:

$clean = array();
$html = array();
$_POST['fname'] = filter_var($_POST['fname'], FILTER_SANITIZE_STRING);
$clean['fname'] = $_POST['fname'];
$html['fname'] = htmlentities($clean['fname'], ENT_QUOTES, 'UTF-8');
if ($_POST['fname'] == "") {
    $formerrors .= 'Please enter a valid first name.<br/><br/>';
}
else {
    $formerrors .= 'Name is valid!<br/><br/>';
}

Спасибо за вашу помощь!

~ Джаред

Ответы [ 3 ]

5 голосов
/ 04 января 2012

Я понимаю, что фильтрация входных данных и экранирование выходных данных жизненно важны из соображений безопасности.

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

Этап фильтрации входных данных и этап экранирования выходных данных обязательно являются отдельными задачами и не могут быть объединены в один этап, не в последнюю очередь потому, что существуютмного разных типов экранирования выходных данных, и для каждого контекста вывода должен быть выбран правильный (например, экранирование HTML на странице, экранирование URL для создания ссылки, экранирование SQL и т. д.).

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

В приведенном ниже примере поля это простой текст, поэтому всеМне нужно сделать, это продезинфицировать.

Да.Увы, FILTER_SANITIZE_STRING ни в коем случае не является вменяемым дезинфицирующим средством.Он полностью удаляет некоторый контент (strip_tags, который сам по себе крайне нечувствителен), в то время как HTML-контент избегает другого контента.например, кавычки превращаются в &#34;.Это бессмыслица.

Вместо этого для очистки входных данных посмотрите:

  • проверка правильности строки для используемой кодировки (возможно, UTF-8;см. например это регулярное выражение для этого);

  • удаление управляющих символов, U + 0000 – U + 001F и U + 007F – U + 009F.Разрешить ввод новой строки только в преднамеренных многострочных текстовых полях;

  • , удаляя символы, которые не подходят для использования в разметке ;

  • проверка входных данных соответствует требованиям приложения для каждого поля, для данных, модель содержимого которых более специфична, чем произвольные текстовые строки.Хотя ваше экранирование должно правильно обрабатывать символ <, вероятно, хорошей идеей является раннее избавление от него в полях, где нет смысла его иметь.

Для выхода экранированияшаг, который я обычно предпочитаю от htmlspecialchars() до htmlentities(), хотя правильное использование аргумента UTF-8 останавливает последнюю функцию, нарушающую обычное поведение.

1 голос
/ 04 января 2012

В зависимости от того, что вы хотите защитить, фильтр, который вы вызываете, может быть сверхактивным (см. Комментарии). При инъекции вы должны быть в безопасности, так как вы используете подготовленные заявления (см. этот ответ )

В проектной заметке вы можете сначала фильтровать, а затем проверять наличие пустых значений. Делая это, вы можете сократить свой код;)

0 голосов
/ 04 января 2012

Я понимаю, что фильтрация входных данных ... жизненно важна из соображений безопасности.

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

все, что мне нужно сделать, - это продезинфицировать.

Нет такой вещи, как " общая дезинфекция ". Вы должны понимать каждый конкретный случай и его ограничения. Например, для базы данных вам нужно использовать несколько различных методов очистки, а не один. Хотя для имен файлов это будет совершенно другое.

Я использую подготовленные операторы для взаимодействия с базой данных.

Таким образом, вы вообще не должны касаться данных. Просто оставьте все как есть.

Вот (слегка очищенный) код:

Кажется, в вашем коде есть излишнее количество.
Вы очищаете свои HTML-данные дважды, хотя возможно, что они вам вообще не понадобятся. и по какой-то причине вы выдаете ошибку в случае успеха.

Я бы так и сделал

$formerrors = '';
if ($_POST['fname'] == "") {
    $formerrors .= 'Please enter a valid first name.<br/><br/>';
}

if (!$formerrors) {
  $html = array();
  foreach ($_POST as $key => $val) {
    $html[$key] = htmlspecialchars($val,ENT_QUOTES);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...