JDBI - JDBI 中的@define 和@bind 有什么区别?
JDBI - What's the difference between @define and @bind in 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
参数是用户输入,那么我们应该没问题。
我遇到了同样的问题,但发现答案出奇地难以找到。一位同事告诉我,这在编程时代之前只是一种常识,所以随着软件的发展,它的文档可能被遗忘了。
事实上,Oracle 的Binding and Defining 乍一看似乎很有前途,但完全是误导,因为它的"Defining" 指的是设置引用来检索结果,这在JDBI 中根本不是这个意思.
如果我的同事是正确的话,这就是他们的实际意思:
@Define
用于常量,并插入格式 <field>
.
@Bind
用于变量,并插入格式 :field
(a "named parameter")。你是对的:绑定的副作用是会发生清理。
@BindIn
用于列表,并插入格式 (element IN (<field>))
。这些元素也被清理了。
我的错误是对 @Bind
参数使用 <field>
格式,这导致插值始终为空字符串。
这两个函数是否针对 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
参数是用户输入,那么我们应该没问题。
我遇到了同样的问题,但发现答案出奇地难以找到。一位同事告诉我,这在编程时代之前只是一种常识,所以随着软件的发展,它的文档可能被遗忘了。
事实上,Oracle 的Binding and Defining 乍一看似乎很有前途,但完全是误导,因为它的"Defining" 指的是设置引用来检索结果,这在JDBI 中根本不是这个意思.
如果我的同事是正确的话,这就是他们的实际意思:
@Define
用于常量,并插入格式<field>
.@Bind
用于变量,并插入格式:field
(a "named parameter")。你是对的:绑定的副作用是会发生清理。@BindIn
用于列表,并插入格式(element IN (<field>))
。这些元素也被清理了。
我的错误是对 @Bind
参数使用 <field>
格式,这导致插值始终为空字符串。