В текущем проекте используется MySQL. Изучив функции mysqli
, оказалось, что их очень сложно использовать. На мой взгляд, любой программист, использующий библиотеку, должен иметь Почетную медаль.
Три проблемы:
mysqli
не обрабатывает NULL или такие функции, как CURRENT_DATE
- невозможно использовать параметризованные операторы SQL для запросов со случайными предложениями WHERE (так как вы предотвращаете атаки SQL-инъекций?)
- на мой взгляд, это слишком много работы, чтобы использовать
sqli
в сложных случаях (см. Ссылку)
PDO не решает ни одну из этих проблем. Проблема заключается в SQL-инъекции: как PDO помогает с SQL-инъекцией, если вы не используете параметризованные запросы?
Имея это в виду, написал небольшую библиотеку для MySQL на PHP, которая делает работу просто и эффективно. Смотри https://github.com/bangkok-maco/MySQL-sql-injection-prevention
(Кто-то услужливо разместил здесь библиотеку, но заменил ее ссылкой , но для ознакомления используйте REAME на сайте.)
Проблема в том, что я знаю, знают ли базовые принципы достаточно проблем, требующих решения.
Вот принципы:
- каждый SELECT выполняется пользователем без прав DML (INSERT, UPDATE, DELETE)
- инструкция DML возвращает только количество затронутых строк
- конфиденциальные данные недоступны, кроме как через функции и процедуры MySQL
- теневой пользователь и никто другой не может выполнять эти функции и не имеет других прав
- операторы DML параметризованы; Операторы SELECT никогда не параметризуются
По логике, этого достаточно?
Инъекция SQL может привести к недопустимому SELECT (который может быть просто съеден), но этот SELECT не может записывать данные. DML параматеризован, поэтому данные скалярны. Конфиденциальные данные, например пароли, просто недоступны через обычный SQL или через обычных пользователей.