用于在java jdbc代码中检测非参数化sql的工具
我希望检查Java/jdbc代码中的SQL语句,以确保要执行的SQL具有可接受的质量。PMD和Findbugs似乎都没有JDBC或sql规则。我可以使用p6spy来记录SQL,这样看,但这是手动的 我想知道使用PMD/Findbugs/etc创建一个规则的策略是否是,传递给PreparedStatement的任何字符串(其中有“=”或“in”)在比较端只有参数化变量用于在java jdbc代码中检测非参数化sql的工具,sql,jdbc,refactoring,p6spy,parameterization,Sql,Jdbc,Refactoring,P6spy,Parameterization,我希望检查Java/jdbc代码中的SQL语句,以确保要执行的SQL具有可接受的质量。PMD和Findbugs似乎都没有JDBC或sql规则。我可以使用p6spy来记录SQL,这样看,但这是手动的 我想知道使用PMD/Findbugs/etc创建一个规则的策略是否是,传递给PreparedStatement的任何字符串(其中有“=”或“in”)在比较端只有参数化变量 有人这样做过吗?或者用其他方法来做这件事?这是一个棘手的问题。比较运算符(如=和IN()是一些情况,但也有:!==就像 如何在表达
有人这样做过吗?或者用其他方法来做这件事?这是一个棘手的问题。比较运算符(如
=
和IN()
是一些情况,但也有:!=<>=就像
如何在表达式中将应用程序变量插值为文本
String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";
您可以搜索包含字符串分隔符的SQL,但SQL注入并不仅仅来自插入字符串文本
您如何发现将应用程序变量插值为数据值以外的内容的情况
String sql = "SELECT * FROM mytable ORDER BY " + columnname;
我不知道任何自动检测SQL注入缺陷的方法。代码审查是发现它们的更有效的方法。在每个包含插值应用程序变量的SQL语句中,您必须确认应用程序变量是“安全的”,并且您的应用程序已显式验证或转换它们,以便它们不包含危险的负载。这是一个棘手的问题。比较运算符(如
=
和IN()
是一些情况,但也有:!=<>=就像
如何在表达式中将应用程序变量插值为文本
String sql = "SELECT *, " + someJavaVar + " AS constant_column FROM mytable";
您可以搜索包含字符串分隔符的SQL,但SQL注入并不仅仅来自插入字符串文本
您如何发现将应用程序变量插值为数据值以外的内容的情况
String sql = "SELECT * FROM mytable ORDER BY " + columnname;
我不知道任何自动检测SQL注入缺陷的方法。代码审查是发现它们的更有效的方法。在每个包含插值应用程序变量的SQL语句中,您必须确认应用程序变量是“安全的”,并且您的应用程序已显式验证或转换它们,以便它们不包含危险的负载。您是否有能力使用连接到它的调试器对应用程序进行完整测试
在JDBC驱动程序的Connection.createStatement()实现中设置断点,然后运行应用程序。。。(或者,如果使用的驱动程序没有源代码,请编写一个假的驱动程序,只将调用委托给真实的驱动程序,并记录createStatement()的所有实例)您是否能够在连接了调试器的情况下完全测试应用程序
在JDBC驱动程序的Connection.createStatement()实现中设置断点,然后运行应用程序。。。(或者,如果使用的驱动程序没有源代码,请编写一个假的驱动程序,只将调用委托给真实的驱动程序,并记录createStatement()的所有实例)我不知道这可以做到。我将插值应用程序变量视为一个问题,因为这是为了在迁移到新的rdbms之前进行重构,而不仅仅是寻找sql注入问题。我倾向于从sql开始搜索所有变量,然后从sql开始搜索。我不明白你的评论。我猜Java应用程序中的所有SQL语句都存储在字符串中,变量名以“SQL”开头?如果是这样,那么是的,您需要对所有这些情况进行代码审查。我不知道这是否可以做到。我将插值应用程序变量视为一个问题,因为这是为了在迁移到新的rdbms之前进行重构,而不仅仅是寻找sql注入问题。我倾向于从sql开始搜索所有变量,然后从sql开始搜索。我不明白你的评论。我猜Java应用程序中的所有SQL语句都存储在字符串中,变量名以“SQL”开头?如果是这样,那么是的,您需要对所有这些情况进行代码检查。我最终使用p6spy记录所有SQL,然后将它们全部追溯到src。我最终使用p6spy记录所有SQL,然后将它们全部追溯到src。