Question

Je construis un Java Web Application utilisant Java EE 6 et JSF 2.0, en utilisant l'API de persistance pour toutes les opérations de base de données.

Le back-end est MySQL, mais je l'ai utilisé les fonctions EntityManager et requêtes nommées dans EJB-QL pour toutes les opérations. Sont des attaques par injection SQL possible dans ce cas?

Était-ce utile?

La solution

Il est possible que si vous inline les variables contrôlées par l'utilisateur dans une chaîne SQL / JPQL comme ceci:

String sql = "SELECT u FROM User u WHERE id=" + id;

Si vous ne faites pas cela et utilisez paramétrés / requêtes nommées uniquement, vous êtes en sécurité.

Autres conseils

Oui, il est possible. Cela dépend de la façon dont vous mettre en œuvre.
Jetez un oeil à pour empêcher l'injection dans des langues de JPA.

Si votre fournisseur JPA traite tous les arguments d'entrée pour gérer les attaques d'injection, alors vous devriez être couvert. Nous faisons mince EclipseLink.

Comme l'affiche précédente mentionné assemblant votre propre JPQL ou SQL (pour les requêtes natives) pourrait vous exposer.

Je recommande d'utiliser des requêtes nommées avec des paramètres sur les chaînes concaténer pour construire JPQL / SQL.

Doug

Dans le cas où vous demandez d'un point de vue offensif / pratique, si une déclaration de JPQL est construit à partir de l'entrée d'utilisateur, pensez à l'entrée d'utilisateur suivant:

blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42

Si la victime utilise une implémentation JPA> = 2.1, et la base de données back-end est Oracle, quelque chose comme ce qui précède peut agir comme une injection booléenne SQL pour vous dire si le début de l'utilisateur de base de données avec « A ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top