需要使用的是什么:
pstatement.setInt();
pstatements.setFloat();
etc.
以及 setString()以外的所有其他方法,这是防止SQL注入的唯一方法吗?
答案 0 :(得分:2)
这很简单,大多数数据库都会将语句与发送参数和执行语句分开准备。正是这种语句和参数的分离实际上提供了针对SQL注入的保护(与在查询中手动转义和连接字符串相反)。发送这些参数的格式通常特定于数据库中的数据类型。
假设您在数据库和Java中使用等效类型(例如BIGINT
<> long
,VARCHAR
<> String
,{{ 1}}<> TIMESTAMP
)然后使用特定类型的设置器将减少转换次数。说java.sql.Timestamp
- > 4字节大端编码而不是int
- > String
- > 4字节大端编码。
此外,它会减少代码中的混乱,因为您不需要首先从Java特定的数据类型转换为int
。
现在JDBC确实支持String
许多数据库类型(参见JDBC 4.2附录B中的转换),所以没有什么能阻止你只使用setString
。但从易用性的角度来看,我不知道你为什么要那样做;特定类型的方法更容易使用。
答案 1 :(得分:-1)
如果要在将输入发送到要拒绝的数据库之前验证输入,可以使用相应的“set”语句,并在它们周围放置try / catch块。这样,您可以在向数据库发送命令之前向用户提供反馈。