用于检测java jdbc代码中的非参数化sql的工具

时间:2008-12-04 22:12:45

标签: sql jdbc refactoring p6spy parameterization

我希望检查Java / jdbc代码中的SQL语句,以确保要执行的SQL具有可接受的质量。 PMD和Findbugs似乎都没有JDBC或sql规则。我可以使用p6spy来记录SQL并以这种方式查看,但这是手动的。

我想知道使用PMD / Findbugs / etc创建一个规则,即任何字符串传递给PreparedStatement,其中有一个“=”或“in”的规则在比较端只有参数化的变量。

有人这样做过吗?或者通过其他方式做到这一点?

2 个答案:

答案 0 :(得分:1)

这是一个棘手的问题。像=IN()这样的比较运算符是某些情况,但也有:!= <> < <= > >= LIKE

如何在表达式中发现将应用程序变量插入文字的情况?

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

您可以搜索包含字符串分隔符的SQL,但SQL注入不仅来自内插字符串文字。

您如何发现将应用程序变量插入数据值以外的其他情况?

String sql = "SELECT * FROM mytable ORDER BY " + columnname;

我不知道任何自动检测SQL注入漏洞的方法。代码审查是发现它们的更有效方式。在包含内插应用程序变量的每个SQL语句中,您必须确认应用程序变量是“安全的”,并且您的应用程序已明确验证它们或对其进行转换,以使它们不包含危险的有效负载。

答案 1 :(得分:0)

您是否能够使用连接到它的调试器完全测试应用程序?

在JDBC驱动程序的Connection.createStatement()实现中设置断点,并运行应用程序...(或者如果使用没有源代码的驱动程序,请编写一个只委托调用的假驱动程序真实的,并记录createStatement()的所有实例