搜索导航:

常用工具: 网吧管理 | 手机工具 | 上网必备 | 图像处理 | 视频工具 | 音频工具 | MSN 专区 | 办公软件 | 行政管理 | 商业贸易 | 股票彩票

黑客软件: 入侵攻击 | 木马病毒 | 游戏外挂 | 密码破解 | 探嗅监听 | 漏洞扫描 | 在线视频 | 远程控制 | 其它黑软 | 加密解密 | 漏洞利用

新闻文章: 安全报告 | 西盟新闻 | 工具介绍 | 网络安全 | OICQ秘籍 | 免费资源 | 菜鸟文摘 | 数据安全 | 最近更新 | RSS订阅 | 菜鸟编程

 西盟网络(ZmKe.CoM)成立于2006年,经过数年发展已成为国内知名IT门户及知名域名空间运营商.我们将坚持创新.打造一流网络平台!
您当前的位置:西盟软件站工具介绍安防介绍 → 文章内容

别再让注射遗传下去---杜绝对象查询注射

作者:佚名  来源:不详  发布时间:2007-12-11 17:53:15
:2007-11-28

现在越来越流行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 等 迟点补全!

[] [返回上一页] [打 印]
其他评论:

请遵守国家法律和互联网法规。

· 您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任.

· 留言板管理人员有权保留或删除其管辖留言中的任意内容.

· 本站提醒:不要进行人身攻击与无聊谩骂。谢谢配合!

注意:系统启用了静态/缓存功能,您的回复可能不能立即显示。

用户名: 邮  箱  验证码: 验证码,看不清楚?请点击刷新验证码

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。)