Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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中构建查询以防止使用prepared语句进行SQL注入_Java_Jdbc_Prepared Statement_Sql Injection - Fatal编程技术网

如何在Java中构建查询以防止使用prepared语句进行SQL注入

如何在Java中构建查询以防止使用prepared语句进行SQL注入,java,jdbc,prepared-statement,sql-injection,Java,Jdbc,Prepared Statement,Sql Injection,我需要以这样的方式构建查询,以防止SQL注入攻击的可能性 我知道两种构建查询的方法 String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString(); String query = "select * from tbl_names where name = ? "; 在第一种情况下,我所做的只是一个连接 在第二种情况下,我会这样做: Pre

我需要以这样的方式构建查询,以防止SQL注入攻击的可能性

我知道两种构建查询的方法

String query = new StringBuilder("select * from tbl_names where name = '").append(name).append(';).toString();

String query = "select * from tbl_names where name = ? ";
在第一种情况下,我所做的只是一个连接

在第二种情况下,我会这样做:

PreparedStatement ps = connection.prepareStatement(query)
ps.setString(1,name);

我想知道什么是行业标准?您是使用字符串附加方式构建查询,然后准备语句,还是已经准备好语句,然后再传递参数?

您的第一段代码不安全,容易受到SQL注入的攻击您不应该使用该表单。

为了使第一个片段安全,您需要手动转义该值以防止SQL注入。这很难正确执行,选择错误的值处理方式可能会降低性能,具体取决于基础数据库(例如,如果为整型列提供字符串文字,则某些数据库系统将不使用索引)

第二个片段是标准方式。它可以防止SQL注入使用此表单。


使用带有参数占位符的准备语句要简单得多,它还允许您使用不同的值集重用已编译语句。此外,根据数据库的不同,这对于跨连接重用查询计划具有额外的性能优势。

您还可以使用
[OWASP ESAPI库][1]
。它包括验证器、编码器和许多其他有用的东西。 例如,你可以

ESAPI.encoder().encodeForSQL(Codec,input);

更多的编解码器正在开发中。目前支持MySQL和Oracle。其中一种可能对您的情况很有帮助。

第二种情况是防止SQL注入的最佳方法,它还有一个额外的好处,即它可以加快数据库中的速度。这正是我想要的!非常感谢。