【发布时间】:2022-06-11 02:59:23
【问题描述】:
考虑一下这个说法:
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM t WHERE id=?");
stmt.setInt(1, id);
以上被认为是安全的免受 SQL 注入攻击。知道id 是int 类型,下面的那个也安全吗?
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM t WHERE id=" + id);
如果没有,会出什么问题?
【问题讨论】:
-
当
id实际上是int类型时,不可能进行SQL 注入。 -
如果
id是一个int,则不可能进行SQL 注入,只会溢出。然而,读者很难检查,它是文本和代码的混合体。参数化的 SQL 可以外部化为 XML 或其他。 -
现在是安全的。一个问题是,稍后有人可能会决定 String ID 更合适并更改参数类型,但不会更改实现。在这种情况下,你会很脆弱。我喜欢
setInt方法,因为将 ID 参数更改为 String 需要更改实现,因为如果第二个参数不是整数,setInt将无法编译 -
只要是整数就可以了,但是!一些代码分析器可能会将其标记为潜在的 sql 注入。与参数化 sql 保持一致而不是在这里和那里混合字符串 concat 会更容易(对每个人来说)。
标签: java sql-injection