我希望检查Java / jdbc代码中的SQL语句,以确保要执行的SQL具有可接受的质量。 PMD和Findbugs似乎都没有JDBC或sql规则。我可以使用p6spy来记录SQL并以这种方式查看,但这是手动的。
我想知道使用PMD / Findbugs / etc创建一个规则,即任何字符串传递给PreparedStatement,其中有一个“=”或“in”的规则在比较端只有参数化的变量。
有人这样做过吗?或者通过其他方式做到这一点?
答案 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()的所有实例