这两个函数是否都已清理/可以防止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);
Run Code Online (Sandbox Code Playgroud)
我目前的理解是@define从字面上按原样将字符串插入查询中,但@bind会进行清理。因此,如果我们控制columnsand tableName parameters并且只有values参数是用户输入,那么我们应该可以。
我遇到了同样的问题,发现答案出奇的困难。一位同事告诉我,这只是编程一代人以前的常识,因此随着软件的发展,也许它的文档已被忘记。
实际上,Oracle的Binding and Defining乍看起来似乎很有希望,但完全令人误解,因为它的“ Defining”是指建立引用以检索结果,这在JDBI中根本不存在。
如果我的同事是正确的,这实际上是他们的意思:
@Define用于常量,并插值format <field>。@Bind是用于变量,并内插格式:field(“命名参数”)。您是正确的:绑定的副作用是发生了清理。@BindIn用于列表,并插值格式(element IN (<field>))。元素也经过了消毒。我的错误是使用参数的<field>格式@Bind,导致插值始终为空字符串。