我有一个搜索页面,它使用用户输入的术语来查询数据库。我在Spring中使用Mybatis 3.4.0。
问题是Mybatis正在删除搜索词中的任何单引号,无论我是否逃避它们。这些是有效的查询,因为用户需要能够搜索像O'Toole这样的字符串,但没有返回任何内容。
以下是mapper代码的片段。相关字段为caseWhereConditionDTO.value
,传入的值为O''TOOLE
(在代码之前手动转义)
<if test="caseWhereConditionDTO.value != null">
${caseWhereConditionDTO.leftExpression}
${caseWhereConditionDTO.operator}
#{caseWhereConditionDTO.value}
${caseWhereConditionDTO.closeConditionString}
</if>
导致where子句
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'OTOOLE%'
缺少双重逃脱的O''TOOLE
在映射器中,一切正常,我用#替换#和环绕用单引号
'${caseWhereConditionDTO.value}'
导致sql输出
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'
给出了预期的查询结果
但当然我想保留#{}
的sql注入保护所以我的问题是,如何在仍使用#{} / prepared语句的sql注入保护的情况下查询带单引号的术语?
答案 0 :(得分:0)
有两个选项,无需转义单引号:
除非确定输入不包含任何%
,否则必须首先对它们进行转义(如果它们存在于输入中且未进行转义,则会对SQL造成混淆:{{1}输入的一部分或&#34; 运算符&#34;?)然后将%
连接到值:%
然后value = value + "%";
。< / p>
更好的选择是在SQL查询中连接LIKE #{value}
:%
。它确实有效,我刚刚重新检查过它。