小编典典

(如何)如何在MyBatis的SQL查询中安全地且与数据库无关地使用“ IKE”?

sql

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

选择来自id = #{id}的人员*

此语法可激活适当的转义等,以避免SQL注入攻击。如果您拥有可靠的输入并且想跳过转义,则可以逐字插入参数:

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

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

SELECT * FROM姓名为LIKE #{beginningOfName} ||的人 ‘%’

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

MSSQL-使用’+’运算符而不是’||’破坏了标准。

MySQL-通过重新定义||严重违反了标准 表示“或”。

所以,我可以

选择来自名称为LIKE CONCAT(#{beginningOfName},’%’)的人员*

并仅限于这种情况下的MySQL,否则我可以做

SELECT * FROM姓名为 ‘{beginningOfName}%’的人员

并且必须自己清理输入内容。

有没有更优雅的解决方案?


阅读 217

收藏
2021-04-15

共1个答案

小编典典

通常,这是通过%在传入参数之前将其添加到参数本身来完成的,而使用的是您在SQL之外使用的任何语言。但是请注意,如果您的搜索词可能包含_或包含%在其中,则可能仍然需要执行任何一种转义步骤。

要解决一般的串联问题,请将MySQL放入ANSIsql_mode中,您将获得对||运算符的适当支持,以及对架构名称而不是字符串文字的双引号的正确处理。

(如果无法执行此操作,则必须构建一个函数以从||或中构建语句CONCAT(),以抽象出差异。)

2021-04-15