1

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

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

有人做过吗?还是通过其他方式做到这一点?

4

2 回答 2

1

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

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

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

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

您如何发现将应用程序变量内插为数据值以外的事物的情况?

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

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

于 2008-12-04T22:24:29.587 回答
0

您是否有能力使用连接的调试器对应用程序进行全面测试?

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

于 2009-06-04T13:39:06.153 回答