数据库 like 参数用拼接会有隐患吗?

2019-06-17 19:28:51 +08:00
 loading
router.POST("/post", func(c *gin.Context) {

keyword := c.Query("keyword")

keyword="%"+keyword+"%"

rows, err := db.Query(`SELECT * From user where name like ?`,keyword)


伪代码,请见谅。

问题:这样拼接 like 参数(主要是加通配符),会有注入风险吗?
最佳实践是什么?
3623 次点击
所在节点    Go 编程语言
13 条回复
zuoakang
2019-06-17 19:52:52 +08:00
肯定的咯,一般都是把 keyword 再加一层双引号
blless
2019-06-17 19:55:53 +08:00
参数化查询了解一下
liprais
2019-06-17 19:58:14 +08:00
不用 preparedstatement 避免不了
raptium
2019-06-17 20:06:28 +08:00
楼主的例子应该就已经是参数化的了吧,我看着好像没问题啊
Takamine
2019-06-17 23:40:20 +08:00
一般都是走预编译吧。
不放心就加一层参数检验正则就行。
raptium
2019-06-18 06:48:14 +08:00
又想了一下,如果 keyword 里本来就有 % 似乎查到的就不是想要的了。
loading
2019-06-18 06:50:50 +08:00
@raptium keyword 这个起码可以在前端搞定,差不到只是涉及到对不对而已,这个后端关注的应该是安全性多一些。
wenzhoou
2019-06-18 08:03:46 +08:00
应该是没有问题,但是实际上还是应该做,去除控制字符,并且分词然后查询
ebingtel
2019-06-18 08:40:26 +08:00
没问题 你的 sql 里面已经有"?"占位符了……客户端会做预编译的
razertory
2019-06-18 10:11:54 +08:00
注入不会。不过要考虑索引问题,
msg7086
2019-06-18 11:55:02 +08:00
keyword 本身还要做%和_的转义吧。
loading
2019-06-18 12:51:51 +08:00
感谢楼上所有老铁。
spacewander
2019-06-20 19:18:56 +08:00
如果只是想查询是否包含给定的 keyword,可以试下用 DB 提供的字符串查找 SQL 函数,比如 strpos。性能会好些,另外不用担心转义的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/574835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX