使用 LIKE 子句正确格式化 sql 查询

Posted

技术标签:

【中文标题】使用 LIKE 子句正确格式化 sql 查询【英文标题】:Proper formatting of sql query with LIKE clause 【发布时间】:2016-03-15 15:57:47 【问题描述】:

我有一个带有 LIKE 子句的 SQL 查询,该子句使用 % 通配符。 我读过 LIKE 子句可能有问题,比如这里:http://githubengineering.com/like-injection/。 但是我不确定对于某些用户输入,下面两个不同的函数调用之间是否存在性能差异(尽管查询本质上是相同的),以及它们之间的差异是否与链接中讨论的内容有关.

我预计对第一个函数的调用只会返回像“&my-query%”这样的结果,因此用户的输入实际上是由两个百分号包围的,但事实并非如此。

(query db ["SELECT * FROM some_table WHERE some_value LIKE ?"
       (str "%" user-input "%")])

(query db ["SELECT * FROM some_table WHERE some_value LIKE '%' ? '%']"
       user-input])

【问题讨论】:

任何涉及用户输入以构建 SQL 的字符串连接都存在安全风险 - 始终使用准备好的语句来设置用户提供的参数。 【参考方案1】:

您的第一个查询对我来说看起来很安全。第二个看起来像无效的 SQL。您似乎正在尝试这样做:

(query db ["SELECT * FROM some_table WHERE some_value LIKE CONCAT('%', ?, '%')"
   user-input])

这也是安全的。

不安全的查询会将用户输入直接嵌入到 SQL 字符串中,如下所示:

(query db [(str "SELECT * FROM some_table WHERE some_value LIKE '%" user-input "%'")])

【讨论】:

您对第二个查询是正确的。我实际上的意思是... LIKE '%' + ? + '%' ... 相当于你的版本。

以上是关于使用 LIKE 子句正确格式化 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL如何进行sql like (sql查询结果)的查询

如何在 JPQL 中正确执行 LIKE 和 CASE 子句

pd.read_sql - 不支持的格式字符错误 (0x27)

如何在同一SQL查询中合并子句LIKE和BETWEEN?

T-SQL - 如何在LIKE子句中转义斜杠/方括号

如何在 PL/SQL 的 LIKE 子句中使用变量