flawopen.com/Injection SQL/Java

Injection SQL in Java

Critique CWE-89 Draft — pending review
Language: English Português (Brasil) Español Français Deutsch Русский 简体中文 日本語 हिन्दी 한국어 Bahasa Indonesia
Explication simple

Imaginez un guichet où l'on attend un numéro. L'injection SQL se produit lorsqu'un fraudeur injecte une formule magique qui force le guichetier à vider tous les tiroirs.

Termes clés sur cette page
output encoding
Converting special markup characters into safe entities so browsers display them as text rather than script.

Ce qui se passe

Injection SQL in Java occurs when unvalidated strings are concatenated into JDBC Statement or HQL/JPQL queries.

Impact dans le monde réel

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.

Vulnérable vs corrigé

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();

Pourquoi la correction fonctionne

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

Pièges spécifiques au langage

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().

Idées reçues courantes

"Stored procedures prevent injection"

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

Comment vérifier si vous êtes concerné

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

Liste de contrôle de prévention

Foire aux questions

Is Spring Data JPA safe?

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

Références

Voir aussi : Cross-Site Scripting Command InjectionPath Traversal