2016-03-15 45 views
1

我有一个LIKE子句使用%通配符的SQL查询。 我读过LIKE子句可能有问题,如下所示:http://githubengineering.com/like-injection/。 但我不确定在某些用户输入(尽管查询本质上是相同的)下面的两个不同的函数调用之间会有性能差异,并且它们之间的差异与所讨论的链接。使用LIKE子句正确格式化sql查询

我预计对第一个函数的调用只会返回类似于“& 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

任何字符串串联涉及用户输入构建SQL是一个安全隐患 - 总是用准备好的语句设置用户提供的参数。 – BarrySW19

回答

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 "%'")]) 
+0

你对第二个查询是正确的。我的意思是'... LIKE'%'+? +'%'...'这相当于你的版本。 – MicSokoli