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

时间:2016-03-15 15:57:48

标签: sql postgresql jdbc clojure sql-like

我有一个带有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])

1 个答案:

答案 0 :(得分: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 "%'")])