- UID
- 5906
- 帖子
- 3127
- 精华
- 0
- 贡献
- 18
- 推广
- 1
- 有效BUG
- 0
- 来自
- 上海
- 注册时间
- 2005-12-8
|
很多情况下,广告使用iframe或script的形式嵌入页面,所以一般过滤掉相应的iframe或script代码即可。
iframe标签有明确的界限,比较容易过滤,但对于script来说却比较麻烦,因为这是比较多变且不易控制的。
网站可以使用<script src="/xxx/yyy/zzz.js"></script>这种中规中矩的手法,虽然这对于他们来说更换广告比较容易,但对于写规则的人来说更容易了,直接将xxx\/yyy\/zzz\.js过滤即可。
但另一些如下面的代码:- <script language="javascript">
- <!--
- var scriptcode;
- //-->
- </script>
复制代码 这种情况,过滤就比较麻烦了,不仅需要[\s\S]*?或.*?等,还需要其他的关键字。
其实我们都走入了一个误区,我们何必一定要过滤得干干净净呢?只要这段代码对访客浏览体验无害,那么就可以了。我们可以破坏代码,在不引发IE报错的情况下使之失效即可,譬如滤掉变量、参数、函数,只要让代码失效,我们的工作边完成了,我们的目的就达到了。
且看这一例,这段代码来自17173新年改版之后,万恶的iCast页面播放器的相关代码就在这里。- <script language=javascript>
- if(typeof(_iCast_Controller_init_com)!="object"){
- var _iCast_Controller_init_com = {};
- }
- _iCast_Controller_init_com[959] = function(){
- document.getElementById('shuizhi3pleft').onmouseover = document.getElementById('shuizhi3pright').onmouseover = _doMouseMoveHandle;
- document.getElementById('shuizhi3pleft').onclick = document.getElementById('shuizhi3pright').onclick = _doMouseClickHandle;
- _doMouseClickHandle.d = _iCast_Controller_init;
- }
- function _doMouseMoveHandle(){
- command = "replay";
- var command_wrap = "on" + command;
- window.iCast2.aa(command, "");
- window.iCast2.dq[_doMouseMoveHandle.p].bF["0"].ao(command_wrap);
- }
- function _doMouseClickHandle(){
- var d = _doMouseClickHandle.d;
- var img = new Image();
- img.src = d[3]+"?html&site_id="+Math.abs(d[0])+"&mission_id="+d[1]+"&click1=1&"+parseInt(Math.random()*100000);
- }
- if(typeof(window.iCast2)=="undefined"){
- _doMouseMoveHandle.p=0;
- }else{
- _doMouseMoveHandle.p=window.iCast2.dq.length;
- }
- var icast_channel_ID = 959;
- document.write('<scr'+'ipt language=javascript src="'">http://js.icast.cn/a/4/5/7/2/3/959.js"></scr'+'ipt>');
- </script><!--SmartCreative Begin:-->
- <SCRIPT LANGUAGE="JavaScript">
- var sc_203 = new Object(), _203=1,_f_203=1,_sh_203=1,_smid=203;
- function FQT_main(o){window.focus();_203=2;sc_203=o;_f_203=2;}
- if(_203 == 1)
- {
- try{AD=new ADM("FQT",1);AddSchedule(AD);}catch(e){}
- }
- </SCRIPT>
- <SCRIPT type="text/javascript" SRC="http://smcreative.allyes.com/smcreative/flash_fx.js"></SCRIPT>
- <SCRIPT type="text/javascript" SRC="http://sohusc.allyes.com/main/adfshow?user=sohusc|17173homepage|mercuryzt0924&db=sohusc&border=0&local=yes&js=ie" charset="GBK"></SCRIPT>
- <img src="http://secure-cn.imrworldwide.com/cgi-bin/m?ci=cn-allyes&cg=0&si=sohusc_1C6P203/_5h115t413" alt="" style="display:none">
- <!--SmartCreative End--><script language=javascript>
- var VideoPlay={videoTime:15,adjustTime:60,cookieName:"videoplayed",callParam:"",appendJs:false,setCookie:function(value,second){var nextTime=new Date();nextTime.setTime(nextTime.getTime()+1000*second);var domain_split=document.domain.split(".");var domain_split_length=domain_split.length;var domain=document.domain.substring(domain_split_length+1);document.cookie=this.cookieName+"="+escape(value)+"; expires="+nextTime.toGMTString()+"; path=/; domain="+domain},getCookie:function(Name){var search=Name+"=";if(document.cookie.length>0){offset=document.cookie.indexOf(search);if(offset!=-1){offset+=search.length;end=document.cookie.indexOf(";",offset);if(end==-1)end=document.cookie.length;return unescape(document.cookie.substring(offset,end))}}},watch:function(callMethod){if("enter"==callMethod){this.enterCall(this.callParam)}},enterCall:function(videoEnterCall){if(this.getCookie(this.cookieName)=="playing"){this.callParam=videoEnterCall;setTimeout("VideoPlay.watch(\"enter\")",2000)}else{this.setCookie("playing",this.videoTime+this.adjustTime);videoEnterCall()}},playDone:function(){this.setCookie("playdone",0)}}
- VideoPlay.adjustTime = 8;
- </script>
- <script language=javascript>
- var icast_channel_ID = 887;
- iCast_Start_Enabled_887 = false;
- document.write('<scr'+'ipt language=javascript src="'">http://js.icast.cn/a/4/5/7/3/2/887.js"></scr'+'ipt>');
- </script>
- <script type="text/javascript">
- AD=new ADM("VIDEOPLAY",5);
- AddSchedule(AD);
- var _VIDEOPLAY_5;
- var _iCast_TIMER_5;
- function VIDEOPLAY_main(o){
- _VIDEOPLAY_5=o;
- VideoPlay.enterCall(startPlay);
- _iCast_TIMER_5 = setTimeout("_VIDEOPLAY_5.s=2", 15000);
- }
- function startPlay(){
- iCast_Start_Enabled_887 = true;
- }
- </script>
复制代码 我们可以发现许多关键字,如iCast或更加明显的HTML注释<!--SmartCreative Begin:-->、><!--SmartCreative end -->等关键字或字符串来实现过滤,如:
- #exd#*17173.com*#<!--SmartCreative Begin:-->[\s\S]*?<!--SmartCreative end -->###
复制代码
但这些工作量过于庞大且效率低下。我们可以通过破坏代码的方式达到目的,何必一定要拘泥于<script>标签呢?抛弃他们,直接对脚本代码下手吧。
我们可以通过分析和整理,得到有关iCast的一些有趣的事实:
_iCast_
var _iCast_
iCast
iCast_
var iCast_
.iCast2
(TW不区分大小写,这大大降低了我们的工作量)
通过分析可知,有关于iCast的变化有6种;
然后继续整理其他的相关变量,如videoplay,他就有:
var VideoPlay
function VIDEOPLAY_
VideoPlay.
var _VIDEOPLAY_
_VIDEOPLAY_
等5种变化。
所以我们可以使用如下的规则进行一网打尽- (?:var |_|function)?(?videoplay_?|_?iCast_?)
复制代码 为什么我们忽略了var _videoplay_ 这个变化呢?因为我们的目的不是完整过滤脚本,而是破坏脚本使之无效。
这仅是开始,我们有了规则的开始部分,但这还远远不够,因为我们需要规则的结尾部分,这样规则才能正常生效。我们重新返回上面的广告例子,将function、var统统抛到脑后吧,我们只需搜寻videoplay和icast这两个关键字的结尾部分。
javascript脚本代码和C一样,每一句句字节数必须要有分号;,所以分号;是一个非常优良的结束字符。但我们通过分析可知,并不是每一行的最右端都是分号;,但如果使用[\s\S]*?来跨行搜寻分号;则需要牺牲一定的时间(诸如17173这类变态网站其实还有很多,广告超多意味着过滤广告需要一定的时间,效率下降并且让浏览器的假死率增高),所以我们避免在这里使用[\s\S]*?,而是使用[^\n]*?,单行搜索。
通过统计,我们可以得到videoplay和icast但行最后一个字符有【分号;】、【开门大括号{】、【关门大括号}】等,所以我们使用下面的代码可以实现一网打尽:为了保证分号和大括号是位于那一行的最后,我们在最后放了一个$,表示以此字符为结束者匹配。
于是我们将这两段连起来,得到了这段规则:- (?:var |_|function)?(?:videoplay_?|_?iCast_?)[^\n]*?(?:;|{|})$
复制代码 分析整段广告示例,我们可以得到sc_203、command_wrap、startPlay等关键字,这里需要提醒一点,不可随意寻找关键字,因为你得保证这些关键字只会出现在广告相关的脚本代码里。如果出现在正常的脚本代码里,那么将会严重影响你的正常浏览体验。
最后,我得到了这段规则:- #exd#*17173.com*#(?:function |var |_)?(?:sogou_|sc_203|command_wrap|duilian\d|FQT_main|doMouse|startPlay|videoplay_?|_?iCast_?)[^\n]*?(?:;|'|}|o|{)$###
复制代码 输入TW黑名单,配合通用规则后实现破坏脚本代码的目的,iCast广告不再出现,同时你也能在较快的时间里得到你所要的东西——色彩斑斓的页面。
下面是启用了这句规则过滤之后剩下的“无害残留物”:- <script language=javascript>
- if(typeof(
-
- }
- document.getElementById('shuizhi3pleft').onmouseover = document.getElementById('shuizhi3pright').onmouseover =
- document.getElementById('shuizhi3pleft').onclick = document.getElementById('shuizhi3pright').onclick =
-
- }
- function
- command = "replay";
-
- window.
- window.
- }
- function
- var d =
- var img = new Image();
- img.src = d[3]+"?html&site_id="+Math.abs(d[0])+"&mission_id="+d[1]+"&click1=1&"+parseInt(Math.random()*100000);
- }
- if(typeof(window.
-
- }else{
-
- }
- document.write('<scr'+'ipt language=javascript src="http://js.
- </script><!--SmartCreative Begin:-->
- <SCRIPT LANGUAGE="JavaScript">
- if(_203 == 1)
- {
- try{AD=new ADM("FQT",1);AddSchedule(AD);}catch(e){}
- }
- </SCRIPT>
- <img src="http://secure-cn.imrworldwide.com/cgi-bin/m?ci=cn-allyes&cg=0&si=sohusc_1C6P203/_5h115t413" alt="" style="display:none">
- <!--SmartCreative End--><script language=javascript>
- </script>
- <script language=javascript>
- document.write('<scr'+'ipt language=javascript src="http://js.
- </script>
- <script type="text/javascript">
- AD=new ADM("
- AddSchedule(AD);
- var
- }
- }
- </script>
复制代码 所有影响浏览体验的东西都没了,效率比整段过滤快了许多吧?
现在,让我们回过头,看看本文最前面的思考吧:<script src="/xxx/yyy/zzz.js"></script>该如何过滤?现在,我们多了一种办法:破坏,破坏,破坏~
- #exd#*17173.com*#(?:zzz)\.js###<!--如有其它相同的需要过滤的js文件,可放在zzz右侧,并用|分割,如(?:zzz|yours)-->
复制代码
尝试一下自己DIY吧,然后将你的规则拿出来分享,让更多的用户知道,TW的过滤规则比MX的先进一代半。
[ 本帖最后由 285900537 于 2008-1-4 21:10 编辑 ] |
|