代码之家  ›  专栏  ›  技术社区  ›  sal

Java JDBC代码中非参数化SQL检测工具

  •  1
  • sal  · 技术社区  · 16 年前

    我想检查爪哇/JDBC代码中的SQL语句,以确保要执行的SQL具有可接受的质量。PMD NOT FINDBUGS似乎都没有JDBC或SQL规则。我可以使用p6spy来记录SQL并以这种方式查看,但这是手册。

    我想知道使用pmd/findbugs/etc创建规则的策略,即传递给PreparedStatement的任何字符串(其中有“=”或“in”)都只在比较端具有参数化的var。

    有人这样做吗?或者用其他方法?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Bill Karwin    16 年前

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

    如何将插入应用程序变量的情况定位为表达式中的文本?

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

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

    如何将插入应用程序变量的情况定位为数据值以外的其他内容?

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

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

        2
  •  0
  •   Licky Lindsay    15 年前

    您是否能够在连接了调试器的情况下完全测试应用程序?

    在JDBC驱动程序的connection.createStation()实现中设置断点,然后运行应用程序…(或者,如果使用的驱动程序没有源代码,则编写一个伪驱动程序,只将调用委托给实际的驱动程序,并记录createStation()的所有实例)

    推荐文章