这两个函数是否已针对SQL注入进行清理/安全?例如,请考虑以下事项:
@SqlUpdate("INSERT INTO <tableName> (<columns>) VALUES (<values>)")
public abstract void addRowToDataset(@Define("tableName") String tableName, @Define("columns") String columns, @BindIn("values") Collection<Object> values);
我目前的理解是@define
按字面意思将字符串插入到查询中,但@bind
会进行清理。因此,如果我们控制columns
和tableName parameters
并且只有values
参数是用户输入,那么我们应该没问题。
答案 0 :(得分:5)
我遇到了同样的问题,发现答案很难找到。一位同事告诉我,这只是编程生成之前的常识,所以也许它的文档在软件发展过程中被遗忘了。
事实上,Oracle的Binding and Defining起初似乎很有希望,但却完全是误导性的,因为它的“定义”是指设置引用以检索结果,这在JDBI中根本不是什么意思。
如果我的同事是正确的,那么这就是他们的意思:
@Define
用于常量,并插入格式<field>
。@Bind
用于变量,并插入格式:field
(“命名参数”)。你是对的:绑定的副作用是发生消毒。@BindIn
用于列表,并插入格式(element IN (<field>))
。这些元素也被消毒了。我的错误是使用<field>
格式的@Bind
参数,导致插值始终为空字符串。