Как правильно фильтровать ввод от пользователей в PHP? - PullRequest
1 голос
/ 23 февраля 2011

Что является отраслевым стандартом для фильтрации ввода от пользователей (как POST, так и GET), чтобы избежать SQL-инъекций и тому подобного. До сих пор я использую функции filter_input () и mysql_real_escape_string ()? Достаточно ли этого, а если нет, то какие еще методы я должен использовать?

Ответы [ 5 ]

3 голосов
/ 23 февраля 2011

Важным правилом для жизни является FIEO .Filter Input Escape Output.

ЛЮБАЯ информация, которую вы берете и храните у пользователя, должна быть отфильтрована на стороне сервера, для этого вам следует использовать mysql_real_escape_string.Это всегда должно быть последним, что вы должны сделать перед добавлением значения в базу данных.Проверьте ввод данных пользователем, убедитесь, что это то, что вам нужно, удалите все символы или теги, если вам нужно использовать регулярные выражения, проверьте его длину и любые другие правила - сделайте все это, а затем, наконец, примените функцию MySQL mysql_real_escape_string.

ЛЮБАЯ информация, которую вы отображаете на своей веб-странице, которая является динамической - то есть поступила из базы данных пользовательского контента или напрямую поступила от пользователя, затем должна быть экранирована.Вы должны URL кодировать любые символы, удалять (или кодировать) любые теги HTML.

Я настоятельно рекомендую вам посмотреть эту презентацию по веб-безопасности эксперта Криса Шифлетта:

http://www.slideshare.net/shiflett/evolution-of-web-security

3 голосов
/ 23 февраля 2011

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

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

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

При output вам также нужно экранировать значения в соответствии с вашим выходным носителем, по тем же причинам, по которым вы экранируете их при помещении их в SQL-запрос: чтобы избежать путаницы в синтаксисе, который может быть использован , То есть при выводе на веб-страницу вы избегаете значений HTML. Опять же, не имеет значения, какая это ценность; если он правильно экранирован, это может быть что угодно.

0 голосов
/ 23 февраля 2011

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

0 голосов
/ 23 февраля 2011

вы можете использовать PDO для подключения к базе данных в php.PDO означает PHP Data Object.Это лучше, чем mysql_connect.PDO ориентирован на Objetc и обеспечивает намного большую защиту.

http://www.php.net/manual/en/class.pdo.php

$link = new PDO ( $dsn, $user, $password, $options ) ;
0 голосов
/ 23 февраля 2011

Я предлагаю вам использовать базу данных lib для сохранения данных в базе данных, например, pear db или cakephp orm

, в этом методе вы действительно уверены, что можете атаковать вашу базу данных для инъекции

...