2008-12-04 8 views
1

Je cherche à inspecter les instructions SQL dans le code Java/jdbc pour s'assurer que le SQL à exécuter est de qualité acceptable. Ni PMD, ni Findbugs ne semble avoir de règles JDBC ou sql. Je pourrais utiliser p6spy pour enregistrer le SQL et regarder de cette façon, mais c'est manuel. Je me demande si la stratégie de l'utilisation de PMD/Findbugs/etc pour créer une règle que toute chaîne passée à PreparedStatement où il y a un "=" ou "in" a seulement vars paramétrés sur le côté de la comparaison.outil pour détecter sql non-paramétré dans java code jdbc

Quelqu'un at-il fait cela? Ou fait cela par d'autres moyens?

Répondre

1

Ceci est un problème délicat. Les opérateurs de comparaison comme = et IN() sont quelques cas, mais il y a aussi: != <> < <= > >= LIKE. Comment repérer des cas d'interpolation de variables d'application en tant que littéraux dans des expressions?

Comment repérer des cas d'interpolation de variables d'application en tant que littéraux dans des expressions?

String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable"; 

Vous pouvez rechercher délimiteurs de chaîne contenant SQL, mais l'injection SQL ne vient pas seulement de interpoler littéraux de chaîne.

Comment repéreriez-vous des cas d'interpolation de variables d'application autres que des valeurs de données? Je ne connais aucun moyen automatique de détecter les failles d'injection SQL. L'examen du code est un moyen plus efficace de les repérer. Dans chaque instruction SQL qui contient des variables d'application interpolées, vous devez confirmer que les variables d'application sont "sécurisées" et que votre application les a explicitement validées ou transformées afin qu'elles ne contiennent pas de données utiles dangereuses.

+0

Je ne sais pas cela peut être fait. Je considérerais l'interpolation des variables d'application comme un problème car c'est pour le refactoring avant de migrer vers un nouveau rdbms plutôt que de simplement chercher des problèmes d'injection sql. Je me penche vers la recherche de toutes les vars commençant par sql et progressant à partir de là. – sal

+0

Hm. Je n'ai pas compris votre commentaire. Je suppose que toutes les instructions SQL de votre application Java sont stockées dans des chaînes avec des noms de variables commençant par 'sql'? Si oui, alors oui, vous devez faire une révision de code pour tous ces cas. –

0

Avez-vous la possibilité de tester complètement l'application avec un débogueur connecté?

Définissez un point d'arrêt dans l'implémentation Connection.createStatement() de votre pilote JDBC et exécutez l'application ... (ou si vous utilisez un pilote pour lequel vous n'avez pas de code source, écrivez un pilote faux qui ne fait que déléguer des appels à la vraie, et consigner toutes les instances de createStatement())

+0

J'ai fini par utiliser p6spy pour enregistrer tous les SQL et les retracer tous dans le src. – sal