本类共有 307 篇文章,今日更新 0

RSS安全隐患探讨

[ 来源:http://www.91now.com/down/ | 作者: | 时间:2007-5-18 18:48:02 | 浏览: 人次 ]


又是枫红叶落金秋时,秋风渐起,带来的除了飞舞的落叶与阵阵寒意,还有CEO们期盼着以web 2.0这个定义模糊的概念带来利益的希望。在此,天缘姑且抛开以用户为主导的web2.0不谈,只就其中的一个重要组成部分——目前已经比较广泛使用的RSS技术与各位朋友作简单地探讨。  

RSS是以xml技术为基础,以聚合信息为目的进行信息表现的一种技术手段。其发展到目前,有多个版本及派生,比如ATOM等。随着对信息内容处理/包含的多样化,RSS的设计者将其功能与以加强,支持了js,ActiveX等多样丰富内容及处理表现的技术。而我们在享受着越来越便利的信息获取的同时,安全隐患的潘多拉盒子却慢慢地开启了。  

下面,就让天缘带着大家一起,用一个个简单地小例子,将RSS的隐患一一暴露出来吧。破坏RSS在大家心目中美好的期望并不是我所愿意的,但“不破不立,破而立之”。能在RSS更广泛流行之前,把问题暴露出来,总比事后补救更好一些呢。  


1.Web网页有繁人的弹出窗口,RSS能避免掉吗?  

在浏览网页的时候,第一讨厌的就是弹出的广告窗口,那么在RSS中,我们是否就可以静静地阅读文章而不受打扰呢。愿望是美好的,现实却是残酷的,看看下面的一个小例子:  

<?xml version="1.0" encoding="gb2312" ?>   
<rss version="2.0">  
<channel>  
 <title>伊人有约 喜欢稀饭BBS</title>  
 <link>http://skylove.study-area.org/bbs/thread.php?fid=18</link>  
 <description>拒绝浮躁,让我们沉寂下来认真学习</description>  
 <copyright>Copyright(C)喜欢稀饭BBS</copyright>  
 <managingEditor />  
 <language>zh-cn</language>  
 <ttl>10</ttl>  
 <generator>喜欢稀饭BBS</generator>  
 <item>  
<title>  
<![CDATA[ 测试 ]]>  
 </title>  
<description>  
<![CDATA[<font color=’red’ onMouseOver="javascript:window.open(’http://skylove.study-area.org’);">一个测试,把鼠标移动上来吧.</font>]]>  
</description>  

 <link>http://skylove.study-area.org/bbs/read.php?tid=752</link>  
 <comments>http://skylove.study-area.org/bbs/read.php?tid=752</comments>  
 <guid>http://skylove.study-area.org/bbs/read.php?tid=752</guid>  
<author>  
<![CDATA[ skylove ]]>  
 </author>  
 <source url="http://skylove.study-area.org/bbs/read.php?tid=752">喜欢稀饭BBS</source>  
 <pubDate>Mon, 10 Oct 2005 11:50:08 +0800</pubDate>  
<category>  
<![CDATA[ 伊人有约 喜欢稀饭BBS ]]>  
 </category>  
 </item>  
</channel>  
</rss>  


以上的文本,请保存为一个xml文件,之后在rss浏览器中打开就能看到效果。当鼠标移动到那行文字的时候,竟然新开了一个web页。当然,在此例中我所指向的是一个安全的地址。然而,如果是一个恶意的rss文件,打开的是一个含有恶意代码的web页,那样会如何呢?相信结果大家都能想到了。在rss中,允许利用<![CDATA[ 和]]> 包含按原格式输出的html文本,本身是为了丰富页面元素,允许方便地用html的元素来规定字体,颜色,图片显示等元素。由于是对html代码进行解释,因此,大多的RSS浏览器在设计的时候,对这部分元素的解释,直接采用调用ie浏览器内核的方式来完成。由此造成了css和js代码也可以被方便地解释执行——“剑本双刃,为仁为恶,存乎一心。”但由此带来的问题是——比直接ie浏览web页面更糟糕的是,很多RSS自带的web浏览功能中,是没有带恶意javascript脚本过滤功能的,因此相对于ie那比较糟糕的防御而言,RSS则更是心不设防。同样类似的例子是outlook等邮件客户端在浏览多媒体邮件时候带来的麻烦,不过现在outlook的漏洞已经被微软patch了。而众多RSS浏览器,由于不是微软出品或是windows捆绑,就只好期待各浏览器的软件作者尽快更新此类功能了。所幸的是截至截稿时候为止,天缘所使用的GreatNews RSS浏览器已经加上了弹出窗口屏蔽地功能。  

2.象牛皮藓一样的漂浮广告在RSS时代是否终结了呢?  


漂浮的广告总是在我们浏览网页的时候,阻挡着我们的视线,曾经在RSS初出的时候,我们认为找到了救星,那么是否在RSS里,漂浮的广告就会消失掉呢? 试一下以下的代码吧:  

<?xml version="1.0" encoding="gb2312" ?>  
<rss version="2.0">  
<channel>  
 <title>伊人有约 喜欢稀饭BBS</title>  
 <link>http://skylove.study-area.org/bbs/thread.php?fid=18</link>  
 <description>拒绝浮躁,让我们沉寂下来认真学习</description>  
 <copyright>Copyright(C)喜欢稀饭BBS</copyright>  
 <managingEditor />  
 <language>zh-cn</language>  
 <ttl>10</ttl>  
 <generator>喜欢稀饭BBS</generator>  
 <item>  
<title>  
<![CDATA[ test ]]>  
 </title>  
<description>  
<![CDATA[   
<script language="JavaScript" type="text/JavaScript">  
<!--  
function MM_reloadPage(init) { //reloads the window if Nav4 resized  
 if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {  
  document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}  
 else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();  
}  
MM_reloadPage(true);  

function MM_timelinePlay(tmLnName, myID) { //v1.2  
 //Copyright 1997, 2000 Macromedia, Inc. All rights reserved.  
 var i,j,tmLn,props,keyFrm,sprite,numKeyFr,firstKeyFr,propNum,theObj,firstTime=false;  
 if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time  
 tmLn = document.MM_Time[tmLnName];  
 if (myID == null) { myID = ++tmLn.ID; firstTime=true;}//if new call, incr ID  
 if (myID == tmLn.ID) { //if Im newest  
  setTimeout(’MM_timelinePlay("’+tmLnName+’",’+myID+’)’,tmLn.delay);  
  fNew = ++tmLn.curFrame;  
  for (i=0; i<tmLn.length; i++) {  
   sprite = tmLn;  
   if (sprite.charAt(0) == ’s’) {  
    if (sprite.obj) {  
     numKeyFr = sprite.keyFrames.length; firstKeyFr = sprite.keyFrames[0];  
     if (fNew >= firstKeyFr && fNew <= sprite.keyFrames[numKeyFr-1]) {//in range  
      keyFrm=1;  
      for (j=0; j<sprite.values.length; j++) {  
       props = sprite.values[j];  
       if (numKeyFr != props.length) {  
        if (props.prop2 == null) sprite.obj[props.prop] = props[fNew-firstKeyFr];  
        else    sprite.obj[props.prop2][props.prop] = props[fNew-firstKeyFr];  
       } else {  
        while (keyFrm<numKeyFr && fNew>=sprite.keyFrames[keyFrm]) keyFrm++;  
        if (firstTime || fNew==sprite.keyFrames[keyFrm-1]) {  
         if (props.prop2 == null) sprite.obj[props.prop] = props[keyFrm-1];  
         else    sprite.obj[props.prop2][props.prop] = props[keyFrm-1];  
    } } } } }  
   } else if (sprite.charAt(0)==’b’ && fNew == sprite.frame) eval(sprite.value);  
   if (fNew > tmLn.lastFrame) tmLn.ID = 0;  
 } }  
}  

function MM_initTimelines() { //v4.0  
  //MM_initTimelines() Copyright 1997 Macromedia, Inc. All rights reserved.  
  var ns = navigator.appName == "Netscape";  
  var ns4 = (ns && parseInt(navigator.appVersion) == 4);  
  var ns5 = (ns && parseInt(navigator.appVersion) > 4);  
  document.MM_Time = new Array(1);  
  document.MM_Time[0] = new Array(1);  
document.MM_Time["Timeline1"] = document.MM_Time[0];  
  document.MM_Time[0].MM_Name = "Timeline1";  
  document.MM_Time[0].fps = 15;  
  document.MM_Time[0][0] = new String("sprite");  
  document.MM_Time[0][0].slot = 1;  
  if (ns4)  
    document.MM_Time[0][0].obj = document["Layer1"];  
  else if (ns5)  
    document.MM_Time[0][0].obj = document.getElementById("Layer1");  
  else  
    document.MM_Time[0][0].obj = document.all ? document.all["Layer1"] : null;  
  document.MM_Time[0][0].keyFrames = new Array(1, 15);  
  document.MM_Time[0][0].values = new Array(2);  
  if (ns5)  
    document.MM_Time[0][0].values[0] = new Array("30px", "34px", "39px", "43px", "47px", "52px", "56px", "61px", "65px", "69px",  
"74px", "78px", "82px", "87px", "91px");  
  else  
    document.MM_Time[0][0].values[0] = new Array(30,34,39,43,47,52,56,61,65,69,74,78,82,87,91);  
  document.MM_Time[0][0].values[0].prop = "left";  
  if (ns

[1] [2] [3] 下一页

广告位