在预处理语句中是setString()防止SQL注入的唯一有用方法吗?

时间:2015-01-29 14:58:23

标签: java jdbc prepared-statement sql-injection

需要使用的是什么:

    pstatement.setInt();  
    pstatements.setFloat(); 
    etc.

以及 setString()以外的所有其他方法,这是防止SQL注入的唯一方法吗?

2 个答案:

答案 0 :(得分:2)

这很简单,大多数数据库都会将语句与发送参数和执行语句分开准备。正是这种语句和参数的分离实际上提供了针对SQL注入的保护(与在查询中手动转义和连接字符串相反)。发送这些参数的格式通常特定于数据库中的数据类型。

假设您在数据库和Java中使用等效类型(例如BIGINT<> longVARCHAR<> String,{{ 1}}<> TIMESTAMP)然后使用特定类型的设置器将减少转换次数。说java.sql.Timestamp - > 4字节大端编码而不是int - > String - > 4字节大端编码。

此外,它会减少代码中的混乱,因为您不需要首先从Java特定的数据类型转换为int

现在JDBC确实支持String许多数据库类型(参见JDBC 4.2附录B中的转换),所以没有什么能阻止你只使用setString。但从易用性的角度来看,我不知道你为什么要那样做;特定类型的方法更容易使用。

答案 1 :(得分:-1)

如果要在将输入发送到要拒绝的数据库之前验证输入,可以使用相应的“set”语句,并在它们周围放置try / catch块。这样,您可以在向数据库发送命令之前向用户提供反馈。