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

时间:2017-01-12 19:02:56

标签: 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);

我目前的理解是@define按字面意思将字符串插入到查询中,但@bind会进行清理。因此,如果我们控制columns和tableName parameters并且只有values参数是用户输入,那么我们应该没问题。

1 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,发现答案很难找到。一位同事告诉我,这只是编程生成之前的常识,所以也许它的文档在软件发展过程中被遗忘了。

事实上,Oracle的Binding and Defining起初似乎很有希望,但却完全是误导性的,因为它的“定义”是指设置引用以检索结果,这在JDBI中根本不是什么意思。

如果我的同事是正确的,那么这就是他们的意思:

  • @Define用于常量,并插入格式<field>
  • @Bind用于变量,并插入格式:field(“命名参数”)。你是对的:绑定的副作用是发生消毒。
  • @BindIn用于列表,并插入格式(element IN (<field>))。这些元素也被消毒了。

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