Прежде всего, спасибо за заботу о веб-безопасности. Многие разработчики PHP ничего об этом не знают и не хотят учиться. Именно они раскрывают наши пароли и банковские счета хакерам. Будь частью решения! : -)
1. Относитесь к расширению mysql как к устаревшему.
Используйте взамен PDO или mysqli . Простое расширение mysql не поддерживает подготовленные операторы и некоторые другие функции, такие как управление транзакциями. Никто не должен использовать mysql, если у них есть PDO_mysql или mysqli для них.
2. Не интерполируйте внешние данные в SQL.
Каждый раз, когда вы получаете значение из $ _GET или $ _POST, вы должны считать его небезопасным для использования в любом операторе SQL, или в shell_exec (), или в другом экземпляре, где вы выполняете строку в качестве некоторого кода.
3. Используйте подготовленные параметры запроса вместо интерполяции.
Это действительно легко. На самом деле проще использовать параметры запроса, чем интерполировать переменные в строки SQL. Вам не нужно беспокоиться об экранировании или длительной сложной конкатенации строк.
См. Пример кода здесь: http://us.php.net/manual/en/pdo.prepare.php
4. Для угловых случаев используйте тщательную фильтрацию.
Параметр запроса занимает место для одного литерального значения в выражении SQL. Не имена таблиц, не имена столбцов, не ключевые слова SQL, не списки значений или полные выражения. Для этого вам нужно использовать интерполяцию строк, но посмотрите мою презентацию Мифы и ошибки SQL-инъекций , где приведены примеры того, как вы можете использовать «белые» значения для интерполяции.
Также ознакомьтесь с расширением PHP filter , которое предлагает гибкий способ проверки ввода или удаления недопустимых символов, чтобы убедиться, что используется только допустимая часть ввода.
Глядя на ваши примеры, запрос SELECT не имеет динамических значений, интерполированных из внешних источников, таких как $ _GET. Так что это безопасно.
Запрос INSERT принимает значение из запроса, которое может содержать вредоносный контент, который изменяет способ выполнения вашего запроса. Это хороший кандидат для использования параметров запроса.
Также учтите, что SQL-инъекция является одной из двух наиболее распространенных проблем безопасности в PHP. Другой - межсайтовый скриптинг (XSS). Это не имеет прямого отношения к SQL, но вы должны также узнать об этом.
Вот хороший ресурс для получения дополнительной информации о безопасности веб-программирования: Шпаргалки OWASP.org .