JDBI-JDBI中@define和@bind有什么区别?

lin*_*ngz 5 jdbi

这两个函数是否都已清理/可以防止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参数是用户输入,那么我们应该可以。

And*_*ong 5

我遇到了同样的问题,发现答案出奇的困难。一位同事告诉我,这只是编程一代人以前的常识,因此随着软件的发展,也许它的文档已被忘记。

实际上,Oracle的Binding and Defining乍看起来似乎很有希望,但完全令人误解,因为它的“ Defining”是指建立引用以检索结果,这在JDBI中根本不存在。

如果我的同事是正确的,这实际上是他们的意思:

  • @Define用于常量,并插值format <field>
  • @Bind是用于变量,并内插格式:field(“命名参数”)。您是正确的:绑定的副作用是发生了清理。
  • @BindIn用于列表,并插值格式(element IN (<field>))。元素也经过了消毒。

我的错误是使用参数的<field>格式@Bind,导致插值始终为空字符串。