(如何)我可以安全地使用MyBatis和DB-agnostic在SQL查询中使用"LIKE"?

Han*_*etz 15 sql mybatis

MyBatis中,您可以在SQL中标记应插入参数的位置,如下所示:

SELECT*FROM Person WHERE id = #{id}

此语法激活正确的转义等,以避免SQL注入攻击等.如果您有可信输入并希望跳过转义,则可以逐字插入参数:

SELECT*FROM {tableName} WHERE id =#{id}

现在,我想对不安全的输入进行LIKE搜索,所以我想做的是:

SELECT*FROM Person WHERE name LIKE #{beginningOfName} || '%'

但遗憾的是,重要的数据库服务器不支持||串联语法:

MSSQL - 使用'+'运算符而不是'||'来打破标准.

...

MySQL - 通过重新定义||严重打破了标准 表示OR.

所以,我也可以

SELECT*FROM Person WHERE name LIKE CONCAT(#{beginningOfName},'%')

在这种情况下,只限于MySQL,或者我可以做到

SELECT*FROM Person WHERE name LIKE '{beginningOfName}%'

并且必须自己清理输入.

有更优雅的解决方案吗?

bob*_*nce 11

通常,这是通过%在传入参数之前添加参数本身来完成的,无论您在SQL之外使用何种语言.但请注意,无论哪种方式,如果您的搜索字词可能包含_%在其中,您仍可能需要执行转义步骤.有关背景,请参阅此问题.)

为了解决一般的连接问题,将MySQL放入ANSI sql_mode并获得对||运算符的适当支持,以及正确处理模式名称的双引号而不是字符串文字.

(如果你不能做到这一点你必须建立一个功能,打造出既声明||CONCAT(),抽象掉的差异.)


Bar*_*cki 10

您可以使用绑定语法

引用官方文档

bind元素允许您从OGNL表达式创建变量并将其绑定到上下文.例如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>
Run Code Online (Sandbox Code Playgroud)


小智 7

如果你用的是mybatis,你可以为s写这个

SELECT(" * ");
FROM(" student ");
WHERE(" ten LIKE '%' #{ten} '%' ");
Run Code Online (Sandbox Code Playgroud)


小智 6

绑定包含在 if 中

<select id="select" parameterType="java.util.Map" resultType="ViajeDTO">

SELECT A.ID_VIAJE ID, A.NOMBRE, A.DESCRIPCION, A.FINICIO, A.FFIN, A.LOGO, A.URL, 
        A.ID_CLIENTE IDCLIENTE, B.NOMBRE CLIENTE
FROM VIAJE A
INNER JOIN CLIENTE B ON (A.ID_CLIENTE = B.ID_CLIENTE)
WHERE A.ESTATUS = 1 

<if test="P_NOMBRE != null">
    <bind name="pattern" value="'%' + P_NOMBRE + '%'" />
      AND A.NOMBRE LIKE #{pattern}
</if>
</select>
Run Code Online (Sandbox Code Playgroud)