V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
autung
V2EX  ›  程序员

各位大佬, mysql 中模糊查询 % 和 _这个特殊符号的有什么解决方法?传递特殊符号会有注入问题么?有的话一般怎么解决?

  •  
  •   autung · 2019-12-26 09:55:58 +08:00 · 3771 次点击
    这是一个创建于 1794 天前的主题,其中的信息可能已经有所发展或是发生改变。
    27 条回复    2019-12-27 00:47:42 +08:00
    Mogamigawa
        1
    Mogamigawa  
       2019-12-26 09:59:33 +08:00
    放心, SQL 注入是过去时了, 现在的框架都可以抵御 SQL 注入.
    ThirdFlame
        2
    ThirdFlame  
       2019-12-26 10:01:47 +08:00
    @Mogamigawa 不不不 框架有能力 ,不代表你就写不出来 sql 注入。
    xiaochun41
        3
    xiaochun41  
       2019-12-26 10:17:04 +08:00
    当你需要引用外部输入的变量去构建 sql 语句时候,对输入进行转义就可以了。
    具体如何转义,各个语言的 mysql api 一般都有提供方法。
    autung
        4
    autung  
    OP
       2019-12-26 10:21:22 +08:00
    这种广泛存在的问题应该是有规范的吧,有些网站是可以是用全部特殊符号,但是有些网站又会限制某些特殊符号,但是用提示和过滤显得有些麻烦,总不能每个接口有用户输入都要做这些提示吧,且这些特殊符号也有相应的使用场景,啊想想这一连串的问题,真是莫名的头大,而我只是一个改 bug 的垃圾小前端! want to go die !
    autung
        5
    autung  
    OP
       2019-12-26 10:23:22 +08:00
    @xiaochun41 我们老大说会有注入问题应该避免传特殊符号,我觉得这并不是一个好的方式,毕竟会莫名的增添很多麻烦
    manami
        6
    manami  
       2019-12-26 10:24:11 +08:00
    使用 mysql 的预编译语句可有效防止 sql 注入
    ````
    // 省略……
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(xxx)
    // 省略……
    ````
    manami
        7
    manami  
       2019-12-26 10:29:02 +08:00
    使用了预编译语句,特殊符号当成普通参数一样插入就行
    xiaochun41
        8
    xiaochun41  
       2019-12-26 10:31:18 +08:00
    @autung 你也可以直接在获取输入的地方,统一做一下,并不算麻烦。
    sx90
        9
    sx90  
       2019-12-26 10:31:55 +08:00
    连 CPU 也有 BUG

    不嫌累,不嫌加载过慢,就层层加密,层层审计

    一般,直接用框架,多快好省
    autung
        10
    autung  
    OP
       2019-12-26 10:32:47 +08:00
    @manami 下次让后端小伙子自己试试
    manami
        11
    manami  
       2019-12-26 10:34:47 +08:00
    @autung 卧槽刚仔细看了下与预编译不能处理%和_特殊字符
    manami
        12
    manami  
       2019-12-26 10:35:23 +08:00
    那只能在执行 sql 语句前对参数进行过滤了
    VictorJing94
        13
    VictorJing94  
       2019-12-26 10:38:30 +08:00
    关键词在后台过滤一下
    autung
        14
    autung  
    OP
       2019-12-26 10:45:11 +08:00
    @VictorJing94 我觉得这才是最正确的答案,毕竟前端的传递的内容和方式都不能信任
    aguesuka
        15
    aguesuka  
       2019-12-26 10:47:44 +08:00 via Android
    用 instr 代替 like %param%查询
    hhgfy
        16
    hhgfy  
       2019-12-26 10:47:57 +08:00
    % 用 '\' 转义吧
    zrc
        17
    zrc  
       2019-12-26 10:48:45 +08:00
    instr ?
    autung
        18
    autung  
    OP
       2019-12-26 10:49:46 +08:00
    @hhgfy it's right
    aguesuka
        19
    aguesuka  
       2019-12-26 10:54:16 +08:00 via Android
    不同的数据库也提供了转义符,谷歌的关键词叫 sql like ecsape
    Felldeadbird
        20
    Felldeadbird  
       2019-12-26 11:16:34 +08:00
    前端不需要刻意处理。后端接收到你提交的数据库后,让后端连接数据库时,基于 SQL 进行预编译处理。
    ily433664
        21
    ily433664  
       2019-12-26 11:18:34 +08:00
    转义特殊字符
    public static String escapeLikeValue(String value) {
    //String[] SPECIAL_CHARACTERS = {"%", "_", "[", "]", "^"};
    for (String str : SPECIAL_CHARACTERS) {
    value = value.replace(str, "\\" + str);
    }
    return value;
    }
    zpf124
        22
    zpf124  
       2019-12-26 11:36:49 +08:00
    Java 工具框架用多了, 我也向楼上一样 以为预编译的 sql 就能防御 mysql 的通配符。

    不过 Mybatis 确实提供了 通配符的处理, 采用#{} 传的值已经被处理了,只有${} 才会出问题。
    ahqiuy
        23
    ahqiuy  
       2019-12-26 12:10:09 +08:00
    前两天刚刚遇到这种情况,做了 mybatis 的插件进行转义
    fox0001
        24
    fox0001  
       2019-12-26 12:54:57 +08:00 via Android
    我们用 Solr 实现所有查询,SQL 注入是不存在的
    gaius
        25
    gaius  
       2019-12-26 14:28:02 +08:00
    like concat('%',#{},'%')不会注入,用$的情况需要 escapeSql
    mary9
        26
    mary9  
       2019-12-26 23:33:13 +08:00 via Android
    1.%和_都是特殊字符,使用 escape 处理,具体搜 escape 用法。
    2.其它语言不清楚,Go 用的原生 sql,值用?代替就可防止注入。
    jss
        27
    jss  
       2019-12-27 00:47:42 +08:00 via iPhone
    GO: 啥叫 SQL 注入…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   957 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:07 · PVG 05:07 · LAX 13:07 · JFK 16:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.