V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cocalrush
V2EX  ›  问与答

如何优雅的防止 sql 注入?

  •  
  •   cocalrush · 2015-11-12 08:52:20 +08:00 · 6357 次点击
    这是一个创建于 3300 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近遇到一个麻烦,有一个文本框可以输入任何文本。
    现在的解决方案是拦截参数里面的敏感符号(-- ‘ 等)和敏感词( select and 等),但是总觉得不够好。
    想请问下如何优雅的防止 sql 注入呢?
    非常感谢。
    59 条回复    2015-11-16 09:19:21 +08:00
    Andy1999
        1
    Andy1999  
       2015-11-12 08:54:46 +08:00 via iPhone
    PDO
    a302800411
        2
    a302800411  
       2015-11-12 08:55:13 +08:00
    执行 SQL 的时候函数用两个参数那种?
    tobyxdd
        3
    tobyxdd  
       2015-11-12 08:56:59 +08:00 via Android
    PreparedStatement😂😂
    cocalrush
        4
    cocalrush  
    OP
       2015-11-12 09:01:03 +08:00
    @Andy1999 感谢~。现在目前用的是 JAVA (逃)...
    mcone
        5
    mcone  
       2015-11-12 09:03:00 +08:00
    浓浓的知乎装某器官范儿,你这问题风格应该拉去知乎

    个人感觉这东西要啥优雅,又没人看得到,管用就行。优雅如不成,被 x 了就不好玩了
    cocalrush
        6
    cocalrush  
    OP
       2015-11-12 09:03:20 +08:00
    @a302800411
    @tobyxdd
    感谢 目前也用了 PreparedStatement... 但是我司觉得还是不够放心 - -!
    cocalrush
        7
    cocalrush  
    OP
       2015-11-12 09:06:55 +08:00
    @mcone 是的,我也是这么想的。
    以前都过滤了"and"字符。但是在英文版上 老外输"and"不是一般的多。所以造成了误杀很多。现在精简了下,所以上来问下有没更好的方案。
    刚刷了知乎回来, bigger 条涨满了没法释放...
    echo1937
        8
    echo1937  
       2015-11-12 09:07:39 +08:00
    口口相传 PreparedStatement 可以防注入,多的我也不知道。
    barbery
        9
    barbery  
       2015-11-12 09:20:55 +08:00
    必须 prepare 啊,原生防注入
    gdtv
        10
    gdtv  
       2015-11-12 09:23:32 +08:00
    用了 prepare 就可以了,这个完全不是问题,我担心的是带有危险的 js 脚本或者 xss ,这些才麻烦
    winterock
        11
    winterock  
       2015-11-12 09:26:55 +08:00
    专业的事交给专业的人。
    网络攻击这种事情,我只能说防不胜防。
    试试知道创宇或者安全宝。
    tabris17
        12
    tabris17  
       2015-11-12 09:31:22 +08:00   ❤️ 1
    放弃拼接 SQL 保平安
    HentaiMew
        13
    HentaiMew  
       2015-11-12 09:32:33 +08:00
    优雅这个词真的是被用烂了…
    xwing
        14
    xwing  
       2015-11-12 09:33:47 +08:00
    坚决不用 sql 拼接。 设置数据库操作权限。如果是 java 的话,为什么不用 ORM ?
    zrp1994
        15
    zrp1994  
       2015-11-12 09:36:07 +08:00
    base64 加密下?如果不需要查询其中的内容……
    virusdefender
        16
    virusdefender  
       2015-11-12 09:37:27 +08:00   ❤️ 2
    字符串过滤只能骗自己

    欢迎试试 http://sqlchop.chaitin.com/
    cocalrush
        17
    cocalrush  
    OP
       2015-11-12 09:52:59 +08:00
    @barbery
    @echo1937
    @gdtv
    妥~
    XSS 是真麻烦...
    cocalrush
        18
    cocalrush  
    OP
       2015-11-12 09:56:12 +08:00
    @xwing 也有用 ORM 但是有些查询还是得原生 sql
    cocalrush
        19
    cocalrush  
    OP
       2015-11-12 09:56:53 +08:00
    @virusdefender 这个有点意思... 找时间研究下 感谢。
    thinkmore
        20
    thinkmore  
       2015-11-12 10:17:24 +08:00
    最好让用户不能输入自定义 sql ,为什么一定要把 sql 接口暴露给用户呢?
    @cocalrush
    至于 css 和 js ,一般转义还是能够解决问题的
    Ouyangan
        21
    Ouyangan  
       2015-11-12 10:46:54 +08:00
    PreparedStatement . 学习的时候没讲过么...
    penjianfeng
        22
    penjianfeng  
       2015-11-12 11:01:08 +08:00
    一看就是被知乎害的,啥事儿都要来个”优雅“, WTF ,你先说吧 sql 注入给搞定再说优雅不优雅吧,没学会走就像跑了
    powergx
        23
    powergx  
       2015-11-12 11:05:55 +08:00
    orm
    hqs123
        24
    hqs123  
       2015-11-12 11:09:07 +08:00
    这个没有优雅不优雅之说,只能预防和发生入侵启用紧急方案。
    yangxiongwei
        25
    yangxiongwei  
       2015-11-12 11:11:26 +08:00
    既然是 Java 项目,用 Druid 做数据源吧

    Druid 基于 SQL 语义分析来实现防御 SQL 注入攻击。
    hgc81538
        26
    hgc81538  
       2015-11-12 11:28:49 +08:00 via iPhone
    各種語言對注入的解決方法,可參考
    http://bobby-tables.com
    500miles
        27
    500miles  
       2015-11-12 12:08:05 +08:00
    我靠靠靠靠靠靠靠靠

    嘛玩意儿都要优雅...............

    被人脱裤了最优雅
    cocalrush
        28
    cocalrush  
    OP
       2015-11-12 12:13:52 +08:00
    @hgc81538 哈哈 这个有趣~ 感谢。
    muzuiget
        29
    muzuiget  
       2015-11-12 12:39:59 +08:00
    现在还手工拼 SQL ?
    redkei
        30
    redkei  
       2015-11-12 13:33:55 +08:00
    如何优雅的。。。?

    **是一种什么样的体验?

    对不起看到这种知乎风就反胃,忍不住吐槽下能不能正常说话
    kendetrics
        31
    kendetrics  
       2015-11-12 13:36:54 +08:00
    参数化
    canesten
        32
    canesten  
       2015-11-12 13:49:15 +08:00
    用 Java 的没听过 MyBatis 么
    fwings260
        33
    fwings260  
       2015-11-12 16:47:30 +08:00
    借楼问问,防 SQL 注入,前端能做啥?
    crazycen
        34
    crazycen  
       2015-11-12 16:49:47 +08:00 via Android
    不用 sql 就好
    Garantion
        35
    Garantion  
       2015-11-12 17:53:08 +08:00
    @virusdefender 刚刚还想说长亭的 sqlchop 支持!
    ivvei
        36
    ivvei  
       2015-11-12 18:33:21 +08:00
    Java 就不能 PrepareStatement 了?一样可以的吧!
    mornlight
        37
    mornlight  
       2015-11-12 19:27:48 +08:00
    @fwings260
    SQL 注入是服务端问题,前端啥都干不了,前端做的把戏只能骗骗无聊用户。
    dallaslu
        38
    dallaslu  
       2015-11-12 20:24:10 +08:00
    为每一条 SQL 写一个正则判断。如:

    select * from user where username='v2ex' and password='235512'

    对应正则

    ^select \* from user where username='\w+' and password='\w+'$
    cevincheung
        39
    cevincheung  
       2015-11-12 20:31:25 +08:00
    @dallaslu 这要是写个大系统不要死
    dallaslu
        40
    dallaslu  
       2015-11-12 20:42:43 +08:00
    @cevincheung 你要优雅还是要命
    cevincheung
        41
    cevincheung  
       2015-11-12 20:50:33 +08:00
    @dallaslu 要命
    raincious
        42
    raincious  
       2015-11-12 20:57:25 +08:00
    @dallaslu

    这是在开玩笑么?

    select * from user where username='v2ex' and password='235512'
    select * from user where password='235512' and username='v2ex'
    select * from user where password = '235512' and username = 'v2ex'
    select * from user where password = '235512' and username = 'v2ex'

    select *
    from user
    where password = '235512' and username = 'v2ex'

    Select * from user where username='v2ex' and password='235512'
    sElect * from user where username='v2ex' and password='235512'
    ....
    select * from user where username='v2ex' anD password='235512'

    select * from user where password = '235512' and 1=1 and username = 'v2ex'
    select * from user where password = '235512' and 1=1 and 0=0 and username = 'v2ex'
    tflz514
        43
    tflz514  
       2015-11-12 20:58:33 +08:00
    incompatible
        44
    incompatible  
       2015-11-12 21:04:57 +08:00
    @dallaslu 然而你这方案优雅和保命都不沾边。
    执行带参数的 sql 语句唯一正确的方式就是使用 prepared statement
    BlueWolf
        45
    BlueWolf  
       2015-11-12 21:13:18 +08:00
    @tflz514 截图这工具是自研产品?误报漏报率如何
    tflz514
        46
    tflz514  
       2015-11-12 21:15:09 +08:00
    msg7086
        47
    msg7086  
       2015-11-12 21:19:06 +08:00
    只有正确与错误的做法。
    正确的做法直接免疫 SQL 注入,不需要防止不防止,不需要关心优雅还是污。
    错误的做法都是污。再优雅也污。
    MrMario
        48
    MrMario  
       2015-11-12 21:35:58 +08:00
    @virusdefender 你也去长亭啦?
    virusdefender
        49
    virusdefender  
       2015-11-12 21:54:01 +08:00
    @MrMario 嗯,是的~
    dong3580
        50
    dong3580  
       2015-11-12 22:12:01 +08:00
    参数化即可解决,
    dallaslu
        51
    dallaslu  
       2015-11-12 22:29:22 +08:00
    @raincious 然而程序员知道自己写的 SQL 是什么格式,其他形式的语句就可以忽略了。
    dallaslu
        52
    dallaslu  
       2015-11-12 22:30:56 +08:00
    @incompatible 然而你能幽默一些么
    feuvan
        53
    feuvan  
       2015-11-12 23:15:33 +08:00
    prepared statement ,优雅的解决方案
    incompatible
        54
    incompatible  
       2015-11-13 00:48:07 +08:00
    @dallaslu 你给了一个业余的解决方案,我纠正了你 这跟幽默有什么关系?
    leehon
        55
    leehon  
       2015-11-13 01:02:35 +08:00
    我认为比较优雅的方式:检测到测试者提交非法变量,就输出死循环 alert ,或让其浏览器假死崩溃
    测试者手忙脚乱,你在屏幕这边自然就优雅了
    dallaslu
        56
    dallaslu  
       2015-11-13 09:22:24 +08:00
    @incompatible 楼主问的是「如何优雅」而不是「如何专业」地解决 SQL 注入。所以最关注的不是有效解决问题,而是解决问题的姿势,一定要优美雅致有情调。何况 3 楼已经提到 PreparedStatement ,楼主也补充了是他司对 PreparedStatement 不放心……唯有用逼死人的方案,才能让其顿悟。和你说这些,我一定是醉了……
    incompatible
        57
    incompatible  
       2015-11-13 11:21:33 +08:00 via iPhone
    @dallaslu 然而我也不认为你解决问题的姿势有什么优雅可言
    你我笑点和品位不 match 没什么可多说的了
    Bryan0Z
        58
    Bryan0Z  
       2015-11-13 13:54:03 +08:00 via Android
    @incompatible 这也能吵起来……
    fwings260
        59
    fwings260  
       2015-11-16 09:19:21 +08:00
    @mornlight 果然。。。去年在那公司,破 B 后台非让我加个正则,我说前端你加的再多,别人想黑你一样能绕过,有啥用。。。。他就是让我加,还各种改来改去。。。。弃坑果然没错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 10:36 · PVG 18:36 · LAX 02:36 · JFK 05:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.