Безопасность PHP $ _GET, передовая практика безопасности $ _POST

Это хорошо освещенная тема, но я хотел бы получить некоторое подтверждение о методах использования данных из пользовательских переменных в нескольких разных ситуациях.

  1. Эта переменная никогда не используется в базе данных, никогда не сохраняется, отображается только на экране для пользователя. Какую функцию использовать, чтобы убедиться, что html или javascript не могут повредить?

  2. Переменная берется в базу данных и используется в SQL-запросах.

  3. Переменная делает оба.

На данный момент я xss_clean и strip_tags. Я всегда делал это, просто автопилотом. Есть ли лучшая техника? Извиняюсь, если есть одинаковый вопрос. Я предполагаю, что есть, хотя я не мог найти такого тщательного, как это.

Приветствия.

  1. Используйте соответствующую функцию при выводе в контексте HTML, это htmlspecialchars
  2. Использовать подготовленные заявления
  3. См. 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"; 
  1. В первом случае htmlspecialchars (), вероятно, является лучшим выбором, позволяя пользователям использовать все символы, такие как <,>, & и т. Д.
  2. Во втором случае вам нужно будет использовать некоторую функцию escaping базы данных, такую ​​как mysql_real_escape_string или подготовленный оператор с PDO или mysqli. Подготовленные утверждения – лучший выбор здесь, но если вы только знакомы с mysql, то mysql_real_escape_string отлично работает. Если вы не используете mysql, то в большинстве SQL-API есть аналогичные функции.
  3. В третьем случае делайте это как отдельно, так и отдельно, давая два разных результата: один для вывода и один для базы данных.

Рекомендации:

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