2012-01-30 2 views
2

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

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

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

+0

Вы случайно слово: «... должны ли эти строки перед вводом ...». –

+0

mysql_query() не поддерживает стекирование запросов, злоумышленник никогда не сможет выполнить оператор drop. SQL Injection все еще очень серьезная проблема, но этот эксплойт никогда не сработает. – rook

ответ

4

простой ответ: Validate/Sanitize/бежать все (как на стороне клиента данных, например), потому что все может быть измененным и злым или содержать неожиданные символы, которые может разорвать ваш запрос (например, Col. Shrapnel explanained).

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

EDIT: благодарит за комментарии, я перефразировал все первое предложение вместо того, чтобы все больше и больше разочаровывать его.

+0

Что-то, что происходит с серверной стороны? –

+0

@Col. Шрапнель: спасибо за подсказку, я должен был очистить, вы не можете доверять _any_ внешним данным. Я перефразировал это предложение, чтобы принять это во внимание. – oezi

+0

+500 для «всего». –

0

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

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

Соединения не должны быть получены из браузера - anyone can write their own HTTP requests with a telnet client. Для этого есть, вероятно, специальные инструменты, и их было бы нелегко создать.

+0

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

0

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

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

How can I prevent SQL injection in PHP?

6

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

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

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

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

Примечание, что для любой другой части запроса, такие как номер или идентификатор, побега совершенно бесполезно, и не будет «дезинфицировать» ничего.

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

Смежные вопросы