如何优雅的防止 sql 注入? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cocalrush
V2EX    问与答

如何优雅的防止 sql 注入?

  •  
  •   cocalrush 2015-11-12 08:52:20 +08:00 6771 次点击
    这是一个创建于 3620 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近遇到一个麻烦,有一个文本框可以输入任何文本。
    现在的解决方案是拦截参数里面的敏感符号(-- ‘ 等)和敏感词( 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
    SkyEcho
        2
    SkyEcho  
       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     Solana     2297 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 15:52 PVG 23:52 LAX 08:52 JFK 11:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86