在准备好的语句中,setString() 是防止 SQL 注入的唯一有用方法吗?

In prepared statement is setString() the only useful method to prevent SQL injection?

需要用到什么:

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

以及除 setString() 之外的所有这些方法,这是唯一可用于防止 SQL 注入的方法?

如果你想在将输入发送到数据库被拒绝之前验证输入,你可以使用适当的 'set' 语句,并在它们周围放置 try/catch 块。这样您就可以在必须向数据库发送命令之前向用户提供反馈。

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

假设您在数据库和 Java 中使用相同的类型(例如 BIGINT <> longVARCHAR <> StringTIMESTAMP <> java.sql.Timestamp) 然后使用类型特定的设置器将导致更少的转换。说 int -> 4 字节大端编码而不是 String -> int -> 4 字节大端编码。

此外,它还可以减少代码中的混乱情况,因为您不需要首先从 Java 特定数据类型转换为 String

现在 JDBC 确实支持很多数据库类型的 setString(有关转换,请参阅 JDBC 4.2 的附录 B),因此没有什么能阻止您仅使用 setString.但是从易用性的角度来看,我不知道你为什么要这样做;类型特定的方法更容易使用。