使用 LIKE 子句正确格式化 sql 查询
Proper formatting of sql query with LIKE clause
我有一个 SQL 查询,其中的 LIKE 子句使用 %
通配符。
我读到过 LIKE 子句可能有问题,就像这里:http://githubengineering.com/like-injection/。
但是我不确定对于某些用户输入,下面两个不同的函数调用之间是否会有性能差异(尽管查询本质上是相同的),以及它们之间的差异是否与 link.
我预计对第一个函数的调用只会 return 结果如“&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。看起来你正在尝试这样做:
(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 "%'")])
我有一个 SQL 查询,其中的 LIKE 子句使用 %
通配符。
我读到过 LIKE 子句可能有问题,就像这里:http://githubengineering.com/like-injection/。
但是我不确定对于某些用户输入,下面两个不同的函数调用之间是否会有性能差异(尽管查询本质上是相同的),以及它们之间的差异是否与 link.
我预计对第一个函数的调用只会 return 结果如“&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。看起来你正在尝试这样做:
(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 "%'")])