锁定老帖子 主题:SQL注入攻击防御方案
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-22
zhangjunbao 写道 太强大了~
虽然用绑定变量,并且不用ibatis的表示这种方式不需要。。。 说句实话,没看懂你在说什么? |
|
返回顶楼 | |
发表时间: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 = ? // 禁止 防御攻击的方案就是需要公开征集意见才可能完善的。希望更多人提意见! |
|
返回顶楼 | |
发表时间: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','%') 这样拼接可以么? |
|
返回顶楼 | |
发表时间: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中出现了常量都不行。 |
|
返回顶楼 | |
发表时间: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中是允许的 |
|
返回顶楼 | |
发表时间:2012-03-22
很支持温少的这个解决方案,从连接池或者连接上解决sql注入的问题,其实开发时,强制约束还是很必要的,要不我们要做各种设计。在使用了ibatis或者hibernate后,基本用不到这些技术了,但还是存在手动拼装sql的需求。温少的解决方案是在sql发送到数据库之前对sql注入进行检测,我在实际中是对输入参数进行sql注入过滤,这样非法参数就无法进入sql语句,整条语句就不再检测了,因为要自己写个parse还是很麻烦的
|
|
返回顶楼 | |
发表时间:2012-03-23
youarestupid 写道 zhangjunbao 写道 太强大了~
虽然用绑定变量,并且不用ibatis的表示这种方式不需要。。。 说句实话,没看懂你在说什么? 看上去这方案只对ibatis有需要吧?主要是温少说的'不恰当的<iterate>',‘$'相关问题会有可能? 比如我用hibernate或者jdbc,并且我强制全部用绑定变量的方式来设参数,那就不需要这个方案了 |
|
返回顶楼 | |
发表时间:2012-03-23
问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢? 谢谢达人呀~ |
|
返回顶楼 | |
发表时间:2012-03-23
最后修改:2012-03-23
leeaee 写道 问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢? 谢谢达人呀~ 这是JDBC标准的unwrap操作,其他连接池可能不支持,但是Druid是完全支持的!如下: Connection conn = druidDataSource.getConnection(); OracleConnection oracleConn = conn.unwrap(OracleConnection.class); |
|
返回顶楼 | |
发表时间:2012-03-24
wenshao 写道 leeaee 写道 问个弱智的问题...wenshao在么?
请问怎么能把Druid的connection和oracleconnection相互间转换呢? 谢谢达人呀~ 这是JDBC标准的unwrap操作,其他连接池可能不支持,但是Druid是完全支持的!如下: Connection conn = druidDataSource.getConnection(); OracleConnection oracleConn = conn.unwrap(OracleConnection.class); Perfect~太崇拜咯,谢谢的~ |
|
返回顶楼 | |