论坛首页 Java企业应用论坛

SQL注入攻击防御方案

浏览 33937 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-03-21  
这位大哥 写了 fastjson 又弄了个sql注入防御的,真是牛人啊~~ 中国软件事业就靠你啦~  不过还是花时间多陪陪家人比较好~~
0 请登录后投票
   发表时间:2012-03-21  
yuechen323 写道
这位大哥 写了 fastjson 又弄了个sql注入防御的,真是牛人啊~~ 中国软件事业就靠你啦~  不过还是花时间多陪陪家人比较好~~


太高的帽子不敢带。。。 这是捧杀吧
0 请登录后投票
   发表时间:2012-03-21  
每次看到项目组里的人写“脏脏”的代码就会很蛋疼....
0 请登录后投票
   发表时间:2012-03-21  
wenshao 写道
yuechen323 写道
这位大哥 写了 fastjson 又弄了个sql注入防御的,真是牛人啊~~ 中国软件事业就靠你啦~  不过还是花时间多陪陪家人比较好~~


太高的帽子不敢带。。。 这是捧杀吧


哈哈哈,阿里人表示有压力(俺不是阿里 也不是淘宝系的)
0 请登录后投票
   发表时间:2012-03-21   最后修改:2012-03-21
youarestupid 写道
wenshao 写道
项目中的人员素质不一,人员多,代码越多,越容易出问题,只要有一个遗漏,就悲剧了。

入侵者从此获得用户密码,拖库。。。

重大风险面前,低成本在连接池上引入拦截,性价比还是很高的!


如果Druid不存在SQL注入风险,那么它肯定会对所有需要执行的SQL语句,都进行执行前过滤处理,这样的话,如果我需要像我上面举例的需求:需要动态修改字段结构、动态创建子表、动态更改字段类型等,Druid如何来做到?


新增加了doPrivileged的功能,测试场景看这里:
https://github.com/AlibabaTech/druid/blob/master/src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java

// 被拦截
Assert.assertFalse(WallUtils.isValidateMySql("select @@version_compile_os"));

// 不被拦截
WallProvider.doPrivileged(new PrivilegedAction<Object>() {
    public Object run() {
        Assert.assertTrue(WallUtils.isValidateMySql("select @@version_compile_os"));
        return null;
    }
});
0 请登录后投票
   发表时间:2012-03-21  
在看代码,又没注释,如果能补充点class diagram多好啊。。文档最好也补充点吧
0 请登录后投票
   发表时间:2012-03-21  
wenshao 写道
youarestupid 写道
wenshao 写道
项目中的人员素质不一,人员多,代码越多,越容易出问题,只要有一个遗漏,就悲剧了。

入侵者从此获得用户密码,拖库。。。

重大风险面前,低成本在连接池上引入拦截,性价比还是很高的!


如果Druid不存在SQL注入风险,那么它肯定会对所有需要执行的SQL语句,都进行执行前过滤处理,这样的话,如果我需要像我上面举例的需求:需要动态修改字段结构、动态创建子表、动态更改字段类型等,Druid如何来做到?


新增加了doPrivileged的功能,测试场景看这里:
https://github.com/AlibabaTech/druid/blob/master/src/test/java/com/alibaba/druid/bvt/filter/wall/DoPrivilegedTest.java

// 被拦截
Assert.assertFalse(WallUtils.isValidateMySql("select @@version_compile_os"));

// 不被拦截
WallProvider.doPrivileged(new PrivilegedAction<Object>() {
    public Object run() {
        Assert.assertTrue(WallUtils.isValidateMySql("select @@version_compile_os"));
        return null;
    }
});


对于确实十分敏感,但是又不得不执行通过页面输入值组装而成的原生SQL的场景,可以加入人工审核过程,比如:
如果需要管理员,在后台中动态创建表结构,可以在接收到页面传递过来的表名称、字段结构等数值后,组装成完整的SQL语句,但是不立刻执行这个SQL语句,而是把这个SQL语句的字符串,转换成16进制字符串,插入数据库,然后程序进入超级管理员审核阶段,超级管理员通过一个单独的程序(和生成SQL语句的程序完全无关),得知有一个需要他审核的SQL语句,然后超级管理员从数据库中取得这个16进制的SQL语句,还原成普通SQL字符串,人工查看SQL语句是否存在注入漏洞,如果不存在注入漏洞,超级管理员就放行这条SQL语句,此时工作流返回到普通管理员的界面上,普通管理员此时再执行人工审核通过的SQL语句。

这种处理,理论上可以最大化地防止SQL注入,如果这样还防不住SQL注入,那么只能怪超级管理员审核SQL语句时太粗心。

这种折腾法,只针对一些“不紧迫”的场景,比如,假设淘宝网允许店长自定义商品属性,自定义的商品属性就是动态创建的一个子表(当然,这种需求实际上不必创建子表,可以用通用纵表来解决),这种需求下,淘宝网的超级管理员可以对店长提交过来的建表SQL语句进行人工审核。

如果需求要求立刻执行原生SQL语句,不容许翻来覆去地人工审核SQL,那么上面这种折腾法就不适用了。
0 请登录后投票
   发表时间:2012-03-21  
刚刚去viki看了下,还不错,想得防御都很详细全面。
0 请登录后投票
   发表时间:2012-03-21  
flashing 写道
如果你用的是prepared,这玩意有啥用吗。。。这是给asp和php用的把,汗


话说php也可以用prepare,这是数据库提供的支持。如果数据库支持prepare,这个东西还有用吗?
0 请登录后投票
   发表时间:2012-03-21  
surfire91 写道
flashing 写道
如果你用的是prepared,这玩意有啥用吗。。。这是给asp和php用的把,汗


话说php也可以用prepare,这是数据库提供的支持。如果数据库支持prepare,这个东西还有用吗?

对啊,大家怎么老说php存在注入漏洞,java不存在。。。我看不是一样的嘛。。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics