Это хорошо освещенная тема, но я хотел бы получить некоторое подтверждение о методах использования данных из пользовательских переменных в нескольких разных ситуациях.
-
Эта переменная никогда не используется в базе данных, никогда не сохраняется, отображается только на экране для пользователя. Какую функцию использовать, чтобы убедиться, что html или javascript не могут повредить?
-
Переменная берется в базу данных и используется в SQL-запросах.
-
Переменная делает оба.
На данный момент я xss_clean и strip_tags. Я всегда делал это, просто автопилотом. Есть ли лучшая техника? Извиняюсь, если есть одинаковый вопрос. Я предполагаю, что есть, хотя я не мог найти такого тщательного, как это.
Приветствия.
- Используйте соответствующую функцию при выводе в контексте HTML, это
htmlspecialchars
- Использовать подготовленные заявления
- См. 1. и 2. – в зависимости от того, отображается ли эта переменная или вы используете ее в запросе.
Одним из худших недоверия людей PHP является то, что $ _GET или $ _POST имеет какое-либо отношение к безопасности.
Это не источник, а место назначения!
- Если вам приходится иметь дело с базой данных, правила всегда одинаковы, независимо от того, поступают ли данные из $ _POST, запроса SOAP или базы данных. Это должно быть ВСЕГДА то же самое: заполнители данных для данных, whitelisting для всего остального.
- Если вам нужно вывести некоторые данные в браузер, вы должны правильно подготовить его, независимо от того, поступают ли данные от $ _POST, запроса SOAP или базы данных.
- Если вам нужно прочитать файл – вам нужно закрепить имя файла, независимо от того, откуда он.
$id="1;drop table users;"; $id=mysql_real_escape_string($id); $sql="SELECT * FROM table WHERE id=$id";
- В первом случае htmlspecialchars (), вероятно, является лучшим выбором, позволяя пользователям использовать все символы, такие как <,>, & и т. Д.
- Во втором случае вам нужно будет использовать некоторую функцию escaping базы данных, такую как mysql_real_escape_string или подготовленный оператор с PDO или mysqli. Подготовленные утверждения – лучший выбор здесь, но если вы только знакомы с mysql, то mysql_real_escape_string отлично работает. Если вы не используете mysql, то в большинстве SQL-API есть аналогичные функции.
- В третьем случае делайте это как отдельно, так и отдельно, давая два разных результата: один для вывода и один для базы данных.
Рекомендации:
http://php.net/manual/en/function.htmlspecialchars.php
http://php.net/manual/en/function.mysql-real-escape-string.php
http://php.net/manual/en/book.pdo.php
http://php.net/manual/en/book.mysqli.php