flawopen.com/SQL-инъекция/Java

SQL-инъекция in Java

Критический CWE-89 Draft — pending review
Language: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia
Простыми словами

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

Ключевые термины на этой странице
output encoding
Converting special markup characters into safe entities so browsers display them as text rather than script.

Что происходит

SQL-инъекция in Java occurs when unvalidated strings are concatenated into JDBC Statement or HQL/JPQL queries.

Реальные последствия

In 2005, the Samy XSS worm infected over 1 million user profiles on MySpace in under 20 hours, forcing the platform offline.

Documented historical AppSec case study.

Уязвимый код vs Безопасный

VULNERABLE
// userId comes straight from the request
String query = "SELECT * FROM users "
    + "WHERE id = " + userId;
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
FIXED
// value is bound, never concatenated
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt =
    connection.prepareStatement(query);
stmt.setString(1, userId);
ResultSet rs = stmt.executeQuery();

Почему исправление работает

PreparedStatement precompiles the query structure in the database engine, binding parameter values separately.

Подводные камни языка

MyBatis: ${} vs #{}

#{} uses safe parameterized binding, while ${} performs raw string substitution.

Hibernate HQL/JPQL

Concatenating HQL queries is just as dangerous as raw SQL. Always use setParameter().

Распространенные заблуждения

"Stored procedures prevent injection"

Only if the stored procedure itself uses parameters rather than dynamic EXECUTE strings.

Как проверить свой код

grep -rn "createStatement().*executeQuery(.*+" --include="*.java" .
Run SpotBugs with the FindSecBugs plugin in CI to catch SQL_INJECTION_JDBC automatically.

Чек-лист по безопасности

Часто задаваемые вопросы

Is Spring Data JPA safe?

Derived queries (@Query) are safe if method parameters are bound with :param or ?1.

Источники и ссылки

Смотреть на: Java Python JavaScript Java Go PHP C# Rust
Смотрите также: Cross-Site Scripting Command InjectionPath Traversal