Фильтрация пользовательского ввода - требуется уточнение - PullRequest
1 голос
/ 05 сентября 2010

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

Насколько я понимаю, вы не хотите очищать данные, поступающие в базу данных, за исключением того, что вы избегаете таких операций, как mysql_escape_string, вы хотите очистить ихпри отображении его на переднем конце с чем-то вроде htmlentities или htmlspecialchars.Однако, если вы хотите, вы можете проверить / отфильтровать введенные пользователем данные при отправке формы, чтобы убедиться, что данные имеют правильный формат, например, если поле предназначено для адреса электронной почты, вы хотите проверить, что оно имеет правильный формат электронной почты.Это правильно?

Мой следующий вопрос: что вы делаете с данными, когда вы повторно отображаете их в веб-форме?Допустим, пользователю разрешено редактировать информацию в этой форме после ее заполнения и добавления информации в базу данных.Затем они возвращаются и видят данные в полях, которые они первоначально вводили. Нужно ли санировать данные, чтобы они правильно отображались в полях формы?Например, есть поле под названием «Мой заголовок», лицо, которое вводит «Мой заголовок» - «Менеджер».Вы видите цитаты вокруг менеджера, когда вы отображаете его как есть в поле формы, которое он разрывает из-за цитат:

<input type="text" name="title" value="My title is "Manager"">

Так что вам не нужно делать что-то вроде htmlentities, чтобы превратить цитаты в егоHTML-сущности?В противном случае значение поля будет выглядеть так: Мой заголовок

Надеюсь, это имеет смысл.

1 Ответ

2 голосов
/ 05 сентября 2010

Ничто не говорит о том, что вы не можете очистить данные перед вставкой базы данных.В конце концов, если ваш сценарий / сайт / компания имеет определенную политику относительно того, что приемлемо в поле формы, лучше удалить все, что не разрешено, перед сохранением.Таким образом, вы выполняете санацию только один раз, перед вставкой / обновлением данных, а не КАЖДЫЙ раз, когда вы извлекаете данные.

Если вы разрешаете HTML-сущности для, скажем, акцентированных символов, но не для HTML-тегов, тогда вам придетсяпроверьте недействительные сущности (&foobar;?), а также теги HTML.Так как вы не позволяете им, не беспокойтесь о хранении их.Если вам требуется действительный адрес электронной почты, проверьте, соответствует ли он RFC 5322, и сохраните его только после того, как пользователь введет правильные данные.(То, существует ли этот адрес электронной почты на самом деле, - другое дело).

Теперь давайте разберемся одно.Есть разница между очисткой и спасением.Очистка означает буквально очистить - вы удаляете из данных все, что вам не нужно.Вы можете либо молча отбросить его, либо сообщить пользователю об ошибке и попросить его исправить.С другой стороны, экранирование - это просто средство кодирования данных, поэтому они отображаются правильно.

С вашей строкой My title is "Manager" вам не нужно очищать ее, поскольку в этом нет ничего действительно неправильного или оскорбительного.Что вам нужно сделать, так это избежать его, по крайней мере, htmlspecialchars(), чтобы встроенные двойные кавычки не «ломали» вашу форму.Если вы вставите его дословно, большинство браузеров увидят в нем value="My title is" и некоторый фиктивный атрибут / мусор Manager"".Итак, вы запускаете его через htmlspecialchars и в итоге получаете My title is &quot;Manager&quot;, который без проблем встраивается в value="".Никакой дезинфекции, только правильное кодирование.

Теперь, когда эта форма отправлена, вам снова нужно санировать / проверять, так как данные были в руках потенциально злонамеренного пользователя, и данные могли бытьизменено на My title is <script>document.location='http://attacksite.com';</script>pwn me.

По сути, рабочий процесс должен быть:

  1. предоставить пользователю форму
  2. получить отправленные данные.
  3. очистить данные
  4. если форма заполнена неправильно, отображаются ошибки и перейти к 1)
  5. экранировать данные для запроса sql
  6. вставить в базу данных

потом позже

извлечение данных из базы данных экранирование / кодирование в зависимости от ситуации, однако будет отображаться отображение данных.если данные переходят в форму, выполните 1-6, как раньше.
...