论坛首页 Java企业应用论坛

SQL注入攻击防御方案

浏览 33932 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-03-22  
zhangjunbao 写道
太强大了~
虽然用绑定变量,并且不用ibatis的表示这种方式不需要。。。

说句实话,没看懂你在说什么?
0 请登录后投票
   发表时间:2012-03-22   最后修改:2012-03-22
liq_2001 写道
or id > 0 或者 '1'||name >'0' 或者  '1'||name like '1%'类似永真,也能防范。禁止拼接sql才是王道


你的建议不错,增加一个配置选项mustParameterized,默认关闭的。

如果配置mustParameterized为true,

select * from t where id = 3 // 禁止
select * from t where id IN (3, 5) // 禁止
select * from t where id NOT IN (3, 5) // 禁止
select * from t where id = ? // 允许
select * from t where 1 = 0 OR id = ? // 允许
select * from t where 1 = 0 OR id = ? LIMIT 10 // 允许
select * from t where 1 = 0 OR id = ? ORDER BY 1 // 允许
select * from t where 1 != 0 OR id = ? // 禁止


防御攻击的方案就是需要公开征集意见才可能完善的。希望更多人提意见!
0 请登录后投票
   发表时间:2012-03-22  
wenshao 写道
liq_2001 写道
or id > 0 或者 '1'||name >'0' 或者  '1'||name like '1%'类似永真,也能防范。禁止拼接sql才是王道


你的建议不错,增加一个配置选项mustParameterized,默认关闭的。

如果配置mustParameterized为true,

select * from t where id = 3 // 禁止
select * from t where id IN (3, 5) // 禁止
select * from t where id NOT IN (3, 5) // 禁止
select * from t where id = ? // 允许
select * from t where 1 = 0 OR id = ? // 允许
select * from t where 1 = 0 OR id = ? LIMIT 10 // 允许
select * from t where 1 = 0 OR id = ? ORDER BY 1 // 允许
select * from t where 1 != 0 OR id = ? // 禁止


防御攻击的方案就是需要公开征集意见才可能完善的。希望更多人提意见!


select field1 from table where field2 like concat('%','ILikeGirl','%')


这样拼接可以么?
0 请登录后投票
   发表时间:2012-03-22  
youarestupid 写道
wenshao 写道
liq_2001 写道
or id > 0 或者 '1'||name >'0' 或者  '1'||name like '1%'类似永真,也能防范。禁止拼接sql才是王道


你的建议不错,增加一个配置选项mustParameterized,默认关闭的。

如果配置mustParameterized为true,

select * from t where id = 3 // 禁止
select * from t where id IN (3, 5) // 禁止
select * from t where id NOT IN (3, 5) // 禁止
select * from t where id = ? // 允许
select * from t where 1 = 0 OR id = ? // 允许
select * from t where 1 = 0 OR id = ? LIMIT 10 // 允许
select * from t where 1 = 0 OR id = ? ORDER BY 1 // 允许
select * from t where 1 != 0 OR id = ? // 禁止


防御攻击的方案就是需要公开征集意见才可能完善的。希望更多人提意见!


select field1 from table where field2 like concat('%','ILikeGirl','%')


这样拼接可以么?


正在实现的算法,只要Where中出现了常量都不行。
0 请登录后投票
   发表时间:2012-03-22   最后修改:2012-03-22
测试代码:
https://github.com/AlibabaTech/druid/blob/master/src/test/java/com/alibaba/druid/bvt/filter/wall/MustParameterizedTest3.java

WallConfig config = new WallConfig();

config.setMustParameterized(true);

Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id  = (3 + 5 - 2 - 1)", config));
Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id  != id + 3", config));
Assert.assertTrue(WallUtils.isValidateMySql("select * from t where id  = ? ORDER BY 1", config));
Assert.assertTrue(WallUtils.isValidateMySql("select 1, 2, 3 from t where id  = ?", config));
Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id  != id + 3", config));
Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id = 'aa' + 'bbb'", config));



在where中间存在常量是被禁止的,在select和order by中是允许的
0 请登录后投票
   发表时间:2012-03-22  
很支持温少的这个解决方案,从连接池或者连接上解决sql注入的问题,其实开发时,强制约束还是很必要的,要不我们要做各种设计。在使用了ibatis或者hibernate后,基本用不到这些技术了,但还是存在手动拼装sql的需求。温少的解决方案是在sql发送到数据库之前对sql注入进行检测,我在实际中是对输入参数进行sql注入过滤,这样非法参数就无法进入sql语句,整条语句就不再检测了,因为要自己写个parse还是很麻烦的
0 请登录后投票
   发表时间:2012-03-23  
youarestupid 写道
zhangjunbao 写道
太强大了~
虽然用绑定变量,并且不用ibatis的表示这种方式不需要。。。

说句实话,没看懂你在说什么?


看上去这方案只对ibatis有需要吧?主要是温少说的'不恰当的<iterate>',‘$'相关问题会有可能?

比如我用hibernate或者jdbc,并且我强制全部用绑定变量的方式来设参数,那就不需要这个方案了
0 请登录后投票
   发表时间:2012-03-23  
问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢?

谢谢达人呀~
0 请登录后投票
   发表时间:2012-03-23   最后修改:2012-03-23
leeaee 写道
问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢?

谢谢达人呀~


这是JDBC标准的unwrap操作,其他连接池可能不支持,但是Druid是完全支持的!如下:
Connection conn = druidDataSource.getConnection();
OracleConnection oracleConn = conn.unwrap(OracleConnection.class);
0 请登录后投票
   发表时间:2012-03-24  
wenshao 写道
leeaee 写道
问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢?

谢谢达人呀~


这是JDBC标准的unwrap操作,其他连接池可能不支持,但是Druid是完全支持的!如下:
Connection conn = druidDataSource.getConnection();
OracleConnection oracleConn = conn.unwrap(OracleConnection.class);


Perfect~太崇拜咯,谢谢的~
0 请登录后投票
论坛首页 Java企业应用版

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