关于网易flash无法显示的分析
近日发现一个非常奇怪的问题,我的浏览器无法正常打开网易,打开后发现很多位置都显示为红X,貌似是网易出现问题,但是使用同一台路由器的其他电脑访问却能显示正常,貌似该位置是图片位,但是右击这个图片位可看见该位置引入的确是.swf文件,使用IE8、遨游都有这个问题,但是换用搜狗浏览器的IE内核模式却正常,百思不得其解,近日解剖了这段代码,终于发现其中的奥秘。如图:
首先在网易首页的大代码中找到对应位置:
<div class="gg">
<iframe id="iframe_banner1" name="iframe_banner1" src="http://g.163.com/r?site=netease&affiliate=homepage&cat=homepage&type=column750x120&location=2" width="750" height="120" frameborder="0" border="0" marginwidth="0" marginheight="0" scrolling="no" ></iframe>
</div>
这就是广告位置,网易使用iframe嵌入了一个广告页面,地址为:http://g.163.com/r?site=netease&affiliate=homepage&cat=homepage&type=column750x120&location=2
接着用浏览器打开这个广告地址页面,读出里面的源代码,原来他没有直接加载flash控件,而是先使用Java语言进行了判断:(我用红色文字来标注里面的代码注释)
<!-- Sniffer Code for Flash version=80 -->
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<SCRIPT LANGUAGE=JavaScript>
<!--//首先在这里设置了一个变量,点击后打开的网址
var swf_click = "http://g.163.com/c?AID=2992&FlightID=43&Values=1733808501&Redirect=http://click.mediav.com/c?type=2&db=mediav&pub=118_3755_30343&cus=6_48_1089_1145_1072&url=http://www.masamaso.com/interface.php?id=102769&url=http://www.masamaso.com/index.php?from=wy_gd_sy4t&_mvsrc=118_3755_30343&_mvcam=6_48_1089_1145_1072&_mven=31635b322a";
//escape 函数是一个顶级 JavaScript 函数,并不与任何对象关联。使用 escape 和 unescape 函数可以将属性值手工添加到 URL 中。
//函数编码指定字符串中的特定字符,并返回新字符串。它编码空格、标点符号及其它不位于 ASCII 字母表的字符var dcswf_click = escape(swf_click);
var ShockMode = 0;
var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;//判断是否有插件,有则返回插件类型,无则返回0
//执行一个简单的“if...else”语句。
//enabledPlugin 为特定的 MIME 类型配置好的 Plugin 对象。如果该 MIME 类型没有配置插件,则 enabledPlugin 为空if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-2)) >= 8)
{
ShockMode = 1;
}//在这里用 navigator.userAgent.indexOf 来判断浏览器类型
else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0
&& navigator.userAgent.indexOf("Opera")<0) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.8")))\n');
document.write('<\/SCRIPT\> \n');
}//这里是正常的flash播放器代码,可以正常显示.swf文件
if ( ShockMode ) {
document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
document.write(' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"');
document.write(' ID=flashad WIDTH=750 HEIGHT=120>');
document.write(' <PARAM NAME=movie VALUE="http://img1.126.net/channel5/006860/fz_750120_100520.swf?clickTag='+dcswf_click+'"> ');
document.write(' <PARAM NAME=quality VALUE=autohigh> ');
document.write(' <PARAM NAME=wmode VALUE=opaque> ');
document.write(' <EMBED SRC="http://img1.126.net/channel5/006860/fz_750120_100520.swf?clickTag='+dcswf_click+'" QUALITY=autohigh wmode=opaque');
document.write(' NAME=flashad swLiveConnect=TRUE WIDTH=750 HEIGHT=120');
document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">');
document.write('</EMBED>');
document.write('</OBJECT>');//else if,如果判断如果不符合为Netscape浏览器,并且版本大于2,那么用<img src="*****.swf">的方式来载入flash, 此种方式明显不能正常加载flash,故显示为红X
// (Because Netscape 2 will display the IMG tag below so don't write an extra one)
} else if (!(navigator.appName && navigator.appName.indexOf("Netscape")>=0 && navigator.appVersion.indexOf("2.")>=0)){
document.write('<A HREF="http://g.163.com/c?AID=2992&FlightID=43&Values=1733808501&Redirect=http://click.mediav.com/c?type=2&db=mediav&pub=118_3755_30343&cus=6_48_1089_1145_1072&url=http://www.masamaso.com/interface.php?id=102769&url=http://www.masamaso.com/index.php?from=wy_gd_sy4t&_mvsrc=118_3755_30343&_mvcam=6_48_1089_1145_1072&_mven=31635b322a" target="_blank"><IMG SRC="http://img1.126.net/channel5/006860/fz_750120_100520.swf" WIDTH=750 HEIGHT=120 BORDER=0></A>');
}
//-->
</SCRIPT><!--由于某些原因嵌入的多媒体元素无法加载,则显示的内容-->
<NOEMBED>
<A HREF="http://g.163.com/c?AID=2992&FlightID=43&Values=1733808501&Redirect=http://click.mediav.com/c?type=2&db=mediav&pub=118_3755_30343&cus=6_48_1089_1145_1072&url=http://www.masamaso.com/interface.php?id=102769&url=http://www.masamaso.com/index.php?from=wy_gd_sy4t&_mvsrc=118_3755_30343&_mvcam=6_48_1089_1145_1072&_mven=31635b322a" target="_blank"><IMG SRC="http://img1.126.net/channel5/006860/fz_750120_100520.swf" WIDTH=750 HEIGHT=120 BORDER=0></A>
</NOEMBED>
<!--指定在不支持脚本的浏览器中显示的 HTML-->
<NOSCRIPT>
<A HREF="http://g.163.com/c?AID=2992&FlightID=43&Values=1733808501&Redirect=http://click.mediav.com/c?type=2&db=mediav&pub=118_3755_30343&cus=6_48_1089_1145_1072&url=http://www.masamaso.com/interface.php?id=102769&url=http://www.masamaso.com/index.php?from=wy_gd_sy4t&_mvsrc=118_3755_30343&_mvcam=6_48_1089_1145_1072&_mven=31635b322a" target="_blank"><IMG SRC="http://img1.126.net/channel5/006860/fz_750120_100520.swf" WIDTH=750 HEIGHT=120 BORDER=0></A>
</NOSCRIPT>
问题原因:
进过调试发现,问题出现在CreateObject的时候出错,IsObject 的返回为0,而在另一台机器上则可以返回 True,看来是我的浏览器设置有误?无法进行CreateObject,换用遨游,问题依旧,但是换搜狗浏览器,就算启用IE内核模式,也正常。由于问题是近两天出现的,所以先卸掉了这两天的所有软件,问题依旧,而由于最近windows没有发布补丁更新,排开此种可能性,最后定位到防护软件升级。经过试验,在卸载掉微点主动防御后,问题居然得到了解决。为了进一步证实,我在另外一台未安装微点的电脑上测试,安装前Flash显示正常,但安装后出现了同样的问题,而卸载掉后问题得到解决。我会将本文提交给微点官方寻求解决。
我们再来看一段代码:
<OBJECT CLASSID="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
CODEBASE="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0"
WIDTH="855" HEIGHT="600" ID="heying" wmode="window">
<PARAM NAME="movie" VALUE="movies/heying.swf"><PARAM NAME="quality" VALUE="autohigh">
<PARAM NAME="Loop" VALUE="true">
<script language='javascript'>
var ShockMode = 0;
if (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] && navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){
//...write out the following <EMBED> tag into the document.同样是引入了Flash,再次之前判断是否已经安装了Flash插件
if (navigator.plugins && navigator.plugins["Shockwave Flash"])
{
ShockMode = 1;
}
if (ShockMode)//判断成功,载入flash
{
document.write('<EMBED SRC="movies/heying.swf" swLiveConnect=FALSE WIDTH="855" HEIGHT="600" LOOP="true" QUALITY="high">');
document.write('</EMBED>');
}
}//Otherwise,...否则,使用另一个图片代替
else
{
//...write out the following <IMG> tag into the document. The image need not be the same size as the Flash movie, but it may help you lay out the
//page if you can predict the size of the object reliably.
document.write('<IMG SRC="welcome.gif" WIDTH="360" HEIGHT="500" ALT="Non-Shockwave Welcome">');
}
//Done hiding from old browsers. -->
</SCRIPT><!-- Close the OBJECT tag. -->
</OBJECT>
这段代码似乎简洁明了的判断了用户浏览器是否支持flash插件,如果有则播放flash,反之用其他元素代替。本文未完,困扰我两天的问题,已确认问题源自微点主动防御软件,目前正向微点官方寻求解决。本文由欧阳工作室原创发表,转载请注明出处。
这段程序的源代码下载:201005221613383312.rar