V5.3.4 Output Encoding and Injection Prevention
Requirement:#
Verify that data selection or database queries (e.g. SQL, HQL, ORM, NoSQL) use parameterized queries, ORMs, entity frameworks, or are otherwise protected from database injection attacks. (C3)
Explanation:#
Приложение должно использовать параметризованные запросы или хранимые процедуры для создания динамических предложений (например, java.sql.PreparedStatement).
Чтобы убедиться, что выборка данных или запросы к базе данных защищены от атак с внедрением базы данных, необходимо обеспечить использование параметризованных запросов или инфраструктур объектно-реляционного сопоставления (ORM). Параметризованный запрос — это запрос, в котором заполнители используются для параметров, предоставляемых во время выполнения. Этот подход защищает от атак путем внедрения в базу данных, предотвращая выполнение вредоносного кода. Например, в SQL вместо конкатенации строк в динамических операторах SQL можно использовать заполнители. Среда ORM обеспечивает более высокий уровень абстракции, что позволяет вам взаимодействовать с базой данных, используя конструкции объектно-ориентированного программирования, вместо того, чтобы писать необработанный SQL. Это устраняет необходимость ручного экранирования пользовательских данных и помогает предотвратить атаки путем внедрения в базу данных. Кроме того, некоторые системы управления базами данных имеют встроенную защиту от атак путем внедрения базы данных, например Entity Framework в платформе Microsoft .NET. Это также можно использовать для обеспечения защиты выбора данных или запросов к базе данных. Короче говоря, чтобы проверить защиту от атак с внедрением базы данных, вы должны обеспечить использование параметризованных запросов, фреймворков ORM или фреймворков сущностей.
Remediation:#
Чтобы устранить атаки с внедрением базы данных, выполните следующие действия:
- Используйте параметризованные запросы. По возможности используйте параметризованные запросы вместо объединения строк для создания динамических операторов SQL. Это защищает от атак внедрения, рассматривая пользовательский ввод отдельно от команды SQL.
- Используйте инфраструктуры объектно-реляционного сопоставления (ORM): платформы ORM могут обеспечить более высокий уровень абстракции, который устраняет необходимость ручного экранирования пользовательских входных данных и помогает предотвратить атаки с внедрением базы данных.
- Реализуйте проверку ввода: проверка ввода должна выполняться, чтобы гарантировать, что данные, предоставляемые пользователем, имеют правильный формат и находятся в ожидаемых пределах. Это помогает предотвратить внедрение злоумышленниками вредоносных данных в базу данных.
- Экранирование специальных символов: при объединении предоставленных пользователем данных с операторами SQL экранируйте специальные символы в данных. Это помогает предотвратить внедрение злоумышленниками вредоносного кода в команду SQL.
- Используйте хранимые процедуры: хранимые процедуры также можно использовать для предотвращения атак путем внедрения в базу данных. Это связано с тем, что хранимые процедуры предварительно компилируются и выполняются на сервере, поэтому параметры, передаваемые хранимой процедуре, обрабатываются отдельно от команды SQL.
- Мониторинг журналов: регулярно проверяйте журналы на предмет подозрительной активности, такой как неожиданные обновления базы данных или изменения важных данных. Это может помочь вам обнаружить потенциальные атаки и быстро отреагировать, если атака будет обнаружена.
- Обновляйте программное обеспечение: регулярно обновляйте программное обеспечение и системы управления базами данных до последней версии, чтобы гарантировать исправление всех известных уязвимостей.
Следуя этим шагам, вы можете гарантировать, что ваш выбор данных или запросы к базе данных защищены от атак с внедрением в базу данных.
Пример использования параметризованных запросов для защиты от атак внедрения в базу данных в Java с использованием JDBC:
В этом примере классы Connection и PreparedStatement из JDBC API используются для выполнения запроса к базе данных. Класс PreparedStatement используется для создания параметризованного запроса, который позволяет передавать пользовательский ввод как отдельный параметр, а не включать его непосредственно в строку запроса. Метод setString() используется для установки значения параметра, который затем передается в базу данных безопасным и надежным образом. Запрос выполняется с помощью метода executeQuery(), а результирующий набор обрабатывается и отображается по мере необходимости. Используя параметризованные запросы, мы можем защититься от атак с внедрением в базу данных, поскольку любые специальные символы или вредоносный ввод пользователя рассматриваются как отдельный параметр и не выполняются как часть запроса. Это гарантирует, что база данных останется защищенной, а данные останутся в безопасности. Важно отметить, что конкретная реализация и используемые методы будут зависеть от используемого языка программирования и технологии баз данных, но общий подход к использованию параметризованных запросов для защиты от атак с внедрением в базу данных остается прежним.