2016-03-15 111 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