V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
loading
V2EX  ›  Go 编程语言

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

  •  
  •   loading ·
    ycf · 2019-06-17 19:28:51 +08:00 via Android · 3611 次点击
    这是一个创建于 1984 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 参数(主要是加通配符),会有注入风险吗?
    最佳实践是什么?
    13 条回复    2019-06-20 19:18:56 +08:00
    zuoakang
        1
    zuoakang  
       2019-06-17 19:52:52 +08:00 via Android   ❤️ 3
    肯定的咯,一般都是把 keyword 再加一层双引号
    blless
        2
    blless  
       2019-06-17 19:55:53 +08:00 via Android   ❤️ 1
    参数化查询了解一下
    liprais
        3
    liprais  
       2019-06-17 19:58:14 +08:00 via iPhone   ❤️ 2
    不用 preparedstatement 避免不了
    raptium
        4
    raptium  
       2019-06-17 20:06:28 +08:00   ❤️ 2
    楼主的例子应该就已经是参数化的了吧,我看着好像没问题啊
    Takamine
        5
    Takamine  
       2019-06-17 23:40:20 +08:00 via Android   ❤️ 1
    一般都是走预编译吧。
    不放心就加一层参数检验正则就行。
    raptium
        6
    raptium  
       2019-06-18 06:48:14 +08:00 via iPhone   ❤️ 1
    又想了一下,如果 keyword 里本来就有 % 似乎查到的就不是想要的了。
    loading
        7
    loading  
    OP
       2019-06-18 06:50:50 +08:00 via Android
    @raptium keyword 这个起码可以在前端搞定,差不到只是涉及到对不对而已,这个后端关注的应该是安全性多一些。
    wenzhoou
        8
    wenzhoou  
       2019-06-18 08:03:46 +08:00 via Android   ❤️ 1
    应该是没有问题,但是实际上还是应该做,去除控制字符,并且分词然后查询
    ebingtel
        9
    ebingtel  
       2019-06-18 08:40:26 +08:00   ❤️ 1
    没问题 你的 sql 里面已经有"?"占位符了……客户端会做预编译的
    razertory
        10
    razertory  
       2019-06-18 10:11:54 +08:00   ❤️ 1
    注入不会。不过要考虑索引问题,
    msg7086
        11
    msg7086  
       2019-06-18 11:55:02 +08:00   ❤️ 1
    keyword 本身还要做%和_的转义吧。
    loading
        12
    loading  
    OP
       2019-06-18 12:51:51 +08:00 via Android
    感谢楼上所有老铁。
    spacewander
        13
    spacewander  
       2019-06-20 19:18:56 +08:00
    如果只是想查询是否包含给定的 keyword,可以试下用 DB 提供的字符串查找 SQL 函数,比如 strpos。性能会好些,另外不用担心转义的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5698 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:47 · PVG 09:47 · LAX 17:47 · JFK 20:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.