Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在java jdbc代码中检测非参数化sql的工具_Sql_Jdbc_Refactoring_P6spy_Parameterization - Fatal编程技术网

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

用于在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()是一些情况,但也有:!==就像 如何在表达

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

我想知道使用PMD/Findbugs/etc创建一个规则的策略是否是,传递给PreparedStatement的任何字符串(其中有“=”或“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。