Skip to main content

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:

String userInput = "O'Hara";
// Create a connection to the database
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Prepare a statement with a parameter
PreparedStatement statement = connection.prepareStatement("SELECT * FROM users WHERE name = ?");
// Set the parameter value
statement.setString(1, userInput);
// Execute the query
ResultSet resultSet = statement.executeQuery();
// Process the result set
while (resultSet.next()) {
String name = resultSet.getString("name");
System.out.println("Name: " + name);
}
// Close the resources
resultSet.close();
statement.close();
connection.close();

В этом примере классы Connection и PreparedStatement из JDBC API используются для выполнения запроса к базе данных. Класс PreparedStatement используется для создания параметризованного запроса, который позволяет передавать пользовательский ввод как отдельный параметр, а не включать его непосредственно в строку запроса. Метод setString() используется для установки значения параметра, который затем передается в базу данных безопасным и надежным образом. Запрос выполняется с помощью метода executeQuery(), а результирующий набор обрабатывается и отображается по мере необходимости. Используя параметризованные запросы, мы можем защититься от атак с внедрением в базу данных, поскольку любые специальные символы или вредоносный ввод пользователя рассматриваются как отдельный параметр и не выполняются как часть запроса. Это гарантирует, что база данных останется защищенной, а данные останутся в безопасности. Важно отметить, что конкретная реализация и используемые методы будут зависеть от используемого языка программирования и технологии баз данных, но общий подход к использованию параметризованных запросов для защиты от атак с внедрением в базу данных остается прежним.

Additional:#