|
| |
| |
你的位置 首页 >> 系统安全 >> 安全防护->别再让注射遗传下去
|
|
别再让注射遗传下去
|
| 日期:2007-11-29 09:38:56 来源:
不详 作者:
未知
|
别再让注射遗传下去---杜绝对象查询注射
TEAM : I.S.T.O AUTHOR : kj021320 官方BLOG : http://blog.csdn.net/I_S_T_O 转载需注明作者,未经作者同意,不得用于任何形式的商业活动
现在越来越流行ORM技术~~~程序员把有关数据库的操作都交给持久层去处理, 也为了更方便所以框架也提供了另外对象查询语言例如HIBERNATE的HQL EJB的EJBQL等 这是好事吗?恩 的确很好~对于严谨的程序员来说!但是对于那些对技术一知半解的就不一定了! 或者对于那些偷懒的人来说更是糟糕的事情 以下我分别采用3大常用的持久层框架,加上代码的片段
Ibatis
<select id="unsafe" resultMap="myResultMap"> select * from table where name like '%$value$%' </select>
UnSafeBean b = (UnSafeBean)sqlMap.queryForObject("value", request.getParameter("name")); 假设用户输入 kj021320
其翻译为本地SQL代码 select * from table where name like '%kj021320%' 而在ibatis 上面 $$ 之间的变量只是做了一般的替换 没有做SQL的转义这样往往就会存在攻击
需要把你的代码更正一下 <select id="safe" parameterClass="java.lang.String" resultMap="myResultMap"> select * from table where name like #value# </select> SafeBean b = (SafeBean)sqlMap.queryForObject("value", "%"+request.getParameter("name")+"%");
虽然有点麻烦 要在XML中说明一下你的参数的类型!但是这样就可以轻易的防止了对象查询的注射
Hibernate
这个框架用的人比较多了,继续看下面的代码示例
LoginUser lu = (LoginUser)session.find("from cn.isto.User as u where u.upass = '" + LoginUser.getUpass()+"' "); 这样很明显了~ 提交的pass可以随意更改HQL语句,达到绕过认证 下面让我们来加工一下修补修补
LoginUser lu = (LoginUser)session.find("from cn.isto.User as u where u.upass = ? " , LoginUser.getUpass() ,
Type );
Session 类下面find有3种方法具体查看相应的API,一定一定要采用参数追加的形式 以上只是简单的说明了一下 其实hibernate还有好多方式建立HSQL的 例如 createSQLQuery iterate 等都是值得注意的
到了最后老大牛 Enterprise Java Beans了
EJB
说到 EJB 其实有点太广了!一般没有用到 entity bean 的话可以忽略了,而SessionBean MessageDriverBean的安全不在这里
讨论~~~entity bean注射一般不会存在配置文件里面 看下面的 <query> <query-method> <method-name>findByMember</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql> <![CDATA[SELECT OBJECT(h) FROM Member AS h WHERE h.name = ?1]]> </ejb-ql> </query>
一般参数都是 ? 形式,这个是规范!改不了!但是~ 在自己构造EJBQL查询的时候呢? 就有可能偷懒了 看下面的代码
StringBuffer ql =new StringBuffer(" SELECT OBJECT(h) FROM Member AS h "); String order = request.getParameter("order"); if ( !=null ) ql.append(" order by id ").append( order ); Query query = em.createQuery(ql);
看到了 以上代码就存在着对象查询的注射 让我们来修补一下 private static final String[] ORDERS = {"asc","desc"}; if (Arrays.asList(ORDERS).contains(order)) { ql.append(order); } else{ ql.append("asc"); } Query query = em.createQuery(ql);
总的一句话来说!不要让代码有太多的自由度,不要偷懒呵呵! 还有更多的持久层框架没有做安全隐患分析!例如 JDO pBeans 等 迟点补全!
责任编辑:admin
|
|
|
|
|
|