Очистить $ _SERVER ['HTTP_USER_AGENT'] & $ _SERVER ['HTTP_REFERER'] перед сохранением в БД? - PullRequest
2 голосов
/ 30 января 2012

У меня есть форма обратной связи, которая будет принимать несколько полей, введенных пользователем, а также несколько полей, сгенерированных PHP-функциями, такими как «user-agent» и «referer».

Мой вопрос: должны ли эти строки быть введены? Я понимаю, что можно легко изменить пользовательский агент и ссылающуюся страницу, но может ли посетитель добавить SQL-инъекцию, подобную строке, поэтому, когда PHP извлекает эту информацию, это потенциально нарушает мою форму?

Например, если пользователь изменил свой пользовательский агент или ссылающуюся страницу, чтобы включить строку Robert'); DROP TABLE Students;--

Ответы [ 4 ]

6 голосов
/ 30 января 2012

Слово "дезинфицировать" довольно двусмысленно и даже обманчиво.
На самом деле нет никакой необходимости «дезинфицировать» струны вообще. Вы должны только форматировать их.

Итак, лучше использовать более точный термин.

Если вы говорите о побеге, ответ довольно прост:
Вы должны экранировать ЛЮБУЮ строку, которую собираетесь ввести в запрос, независимо от ее источника, содержания или цели.
Это не из-за детских пугающих сказок из некоторых глупых комиксов.
Это просто правильный формат для строковых данных в запросе: вы должны заключить их в кавычки и, таким образом, избежать этих разделителей, которые могут присутствовать в данных.

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

Обратите внимание , что для любой другой части запроса, такой как номер или идентификатор, экранирование совершенно бесполезно и ничего не "санирует".

То же правило относится к подготовленным высказываниям:
Используйте его всегда для любых данных, а не только для «ненадежного пользовательского ввода».

4 голосов
/ 30 января 2012

простой ответ: проверка / санитарная обработка / экранирование все (например, данные на стороне клиента), потому что все может быть измененным и злым или содержать неожиданные символы, которые могут сломайте ваш запрос (например, Полковник Шрапнель объяснил ).

, чтобы минимизировать риск, вы должны также использовать подготовленные операторы вместо того, чтобы создавать строки sql самостоятельно (примечание: это не означает, что вы можете пропустить проверки).

РЕДАКТИРОВАТЬ: спасибо за комментарии, я перефразировал целое первое предложение вместо того, чтобы унижать его все больше и больше.

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

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

Более подробное объяснение можно найти в прикрепленной ссылке:

Как я могу предотвратить внедрение SQL в PHP?

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

Всегда очищать / фильтровать любой ввод из браузера.

Просто предположите, что все пользователи злые, и с вами все будет в порядке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...