关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

针对特定网站的规则分享、讨论

Moderator: phoenix

Post Reply
天堂之门
Posts: 17
Joined: Nov 27 2008, 10:50

关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by 天堂之门 »

一般过滤 JS 弹窗都是采用直接匹配头尾相应的标签来完全过滤。

但是遇到比较长的 JS 内容,这样过滤明显加重了 Proxomitron 的负担,理论上也会拖慢网页加载速度。

所以使用帮助中技巧篇提到的“Quick and Dirty”这种摧残式的过滤手法是比较好的选择。

现在来看下磬灵风软论坛 BT 发布页的一段网页源代码:

Code: Select all

<script type="text/javascript">
var isAD = false;
var timeOutID = null;
function sAD()
{
	rAD();
	var popupAD = $("popupADDiv");
	popupAD.style.display = "block";
	popupAD.style.left = document.body.scrollLeft + (document.body.clientWidth - popupAD.clientWidth)/2;
	var _w = window.pageXOffset || document.documentElement.scrollTop;
	popupAD.style.top = _w + 120;
	popupAD.focus();
	mAD(50, 0, 1);
}
function hAD()
{
	if (isAD)
	{
		var popupAD = $("popupADDiv");
		popupAD.style.display = "none";
		rAD();
		isAD=false;
	}
}
function mAD(interval, start, step)
{
	var popupAD = $("popupADDiv");
	var pBar = $("processBar");
	pBar.innerHTML = "<table bgcolor='#6AAAE2' width='"+(popupAD.clientWidth*start/100)+"' height='10' border='0' cellpadding='0' cellspacing='0'>
<tr><td></td></tr></table>";
	if (start < 100)
	{
		timeOutID = setTimeout("mAD("+interval+", "+(start+step)+", "+step+")", interval);
	}
	else
	{
		timeOutID = null;
	}
}
function rAD()
{
	if (timeOutID != null)
	{
		clearTimeout(timeOutID);
		timeOutID = null;
	}
}
</script>
也不知道是谁创建了这段“经典”的 JS 代码,由于在别人点击下载链接的同时,它会调用事先准备好的某个广告,弹出来给你额外“享用”,所以在伊甸园的 BT 发布页的那些下载页面里也能找到相同的代码……

统计下,有 1093 字节长……

显然又长又臭,但是直接整个替换似乎费时费力,但是同时,我们可以注意到网页源代码下面还有一段有关联:

Code: Select all

<div id="popupADDiv" onfocusout="hAD()" onmouseenter="isAD=false;this.focus()" onmouseleave="isAD=true">
<div><script type='text/javascript'> 
cpro_client='bdwxl_8642ahm_cpr';
cpro_at='text_image'; 
cpro_161=4; 
cpro_flush=4; 
cpro_uap=1; 
cpro_w=360; 
cpro_h=300; 
cpro_template='text_default_360_300'; 
cpro_cbd='#trans'; 
cpro_cbg='#trans'; 
cpro_ctitle='#0000ff'; 
cpro_cdesc='#444444'; 
cpro_curl='#008000'; 
cpro_cflush='#e10900'; 
</script>

<script language='JavaScript' type='text/javascript' src='http://cpro.baidu.com/cpro/ui/cp.js'></script>
</div>
<div id="processBar" style="background:#EEEEEE;"></div>
</div>
关联词就是里面的“popupADDiv”,属于 Div 标签。

我们把这个标签单独列出来看下:

Code: Select all

<div id="popupADDiv" onfocusout="hAD()" onmouseenter="isAD=false;this.focus()" onmouseleave="isAD=true">
...
</div>
这个标签里有个 onmouseenter="isAD=false;this.focus()" 属性引起了我的足够重视,查了下,是指在鼠标指针进入这个区域时触发。

所以说这才是一个导火线……因此我们找到要摧残的对象后,就直接爽快地把这些 DIV 标签的属性清除就好了。

用下面一个网页过滤规则来做:

Code: Select all

[Patterns]
Name = "33_1000fr2_DIVruin"
Active = TRUE
URL = "bt.1000fr.com/"
Bounds = "<div\s*>"
Limit = 104
Match = "*id="popupADDiv"*"
Replace = "<div>"
这个规则直接把 <div id="popupADDiv" onfocusout="hAD()" onmouseenter="isAD=false;this.focus()" onmouseleave="isAD=true"> 替换成了光秃秃的 <div>

这样就让 JS 弹窗脚本失效了,但是下面的那个百度文字广告也出来了,可以自己再过滤下。
天堂之门
Posts: 17
Joined: Nov 27 2008, 10:50

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by 天堂之门 »

:o 相当奇怪,居然不能编辑自己的帖子了……

只好写这里了……

关于去掉 DIV 标签的属性这里,还可以延伸下,可以加入一个 style 变成

<div style="display: none">

这样整个 DIV 标签就隐藏了!这个利用了 CSS 的 display 属性。

包括 Tablet 标签、Script 标签以及 Anchor 标签等,都可以用这个 style="display: none" 属性来隐藏。非常棒!特别是对于大段的源代码来说。

这样,这个 DIV 下面的百度文字广告也不用过滤了,已经连带被隐藏 :)
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by phoenix »

设置了只能在10分钟内编辑自己的帖子。

关于用CSS来隐藏广告的方式,我个人并不喜欢用,因为它没有阻止实际的广告内容被下载。以你给出的例子来说,下面的代码仍然被执行了。

Code: Select all

<script language='JavaScript' type='text/javascript' src='http://cpro.baidu.com/cpro/ui/cp.js'></script>
天堂之门
Posts: 17
Joined: Nov 27 2008, 10:50

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by 天堂之门 »

干么就只能在十分钟内编辑自己的帖子……无语……

对于你的想法我不赞同。广告永远都在,你如果交给 PN 过滤一大段内容的话,还不如直接给它通过,只要不显示出来就好了。对于一些大段的内容,这样显然更合理。

至于你说的百度文字广告,我2楼的方法已经隐藏了啊,要过滤也可以通过限制 Header out 来 Kill 掉么。自己写个网页过滤规则干掉 Script 标签也可以……
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by ddbb »

就过滤的方便性来说 我同意这种 Quick and Dirty 的方法......

用相对简单的语句能达到效果........

但是就速度方面来说的话 我还是倾向于完全过滤的这种形式......

当访问一个网站 所有的代码都会扔到PROX那 然后过滤一遍.....不管多少.....这个时间几乎都是很快的.....就像用了sidki之后 几乎每个页面都有那么十几 几十个过滤.....可是速度上好像几乎没有什么变化的.....大约全部的速度也就是0.几秒.......

实际上看一个网页 主要的是时间是浪费在浏览器的引擎渲染上的.....这个过程一般情况下都是在1秒以上的.......当把不在页面上显示的代码也扔给浏览器的话 他也会进行渲染......只不过不显示........这个才是浪费时间.......还不如直接过滤掉他......把他加上前面的0.几秒里....然后不让浏览器渲染这些东西........反正也不显示 渲染他干嘛呢...........
天堂之门
Posts: 17
Joined: Nov 27 2008, 10:50

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by 天堂之门 »

既然讨论到效率问题。那么总结一下就两个大的疑问吧:

一、对浏览器来说:源代码用 CSS 的 display 属性隐藏与否的差异?

二、对 Proxomitron 来说:匹配替换不同长度的源代码的差异?

这两个问题,我都不知道答案。

PN 的帮助里好像也没有明确说到过匹配替换不同长度的源代码的差异……
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by ddbb »

我专门做了TEST......

首先先分析打开一个网页时的流程

用了PROX之后 网页的代码是先下载到PROX端 然后分析之后再把过滤后的代码传到浏览器

也就是 第1步代码无所谓 主要是后面传到浏览器 如果过滤的彻底就会少传一些.....至于说多过滤的时间长还是传这些的时间长 这个倒是想不出研究的方法......(毕竟是本地服务器 传送的速度很快....)

然后再说浏览器这边的显示

关于CSS隐藏 如果不显示的是文本的话 浏览器端确实有明显的提高..........几乎和源代码里没有这些代码的时候速度差不多......具体的话 速度太接近 无法知道......

如果隐藏的是JS文的话 有一些JS代码是只要读取到就会运行的......所以对速度有影响 即使把调用的地方给删掉.....比如你的这段......

Code: Select all

<script type="text/javascript">
var isAD = false;
var timeOutID = null;
这两句是会被执行的.....对速度有影响....

Code: Select all

function sAD()
{
   rAD();
   var popupAD = $("popupADDiv");
   popupAD.style.display = "block";
   popupAD.style.left = document.body.scrollLeft + (document.body.clientWidth - popupAD.clientWidth)/2;
   var _w = window.pageXOffset || document.documentElement.scrollTop;
   popupAD.style.top = _w + 120;
   popupAD.focus();
   mAD(50, 0, 1);
}
这一种的对速度的影响不大 或者说没有影响.....感觉不出来.......

然后就是PROX的过滤......这个我试下来......只要是用了PROX ......BYPASS的打开和关闭的情况下....页面的速度几乎一样......

不过在有上面的第一段JS的情况下 速度有很大的影响........

P.S:我是在local.ptron下放了一个html来测的
nepter
Posts: 30
Joined: Jan 14 2009, 15:36

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by nepter »

个人认为
1.网页显示的主要瓶颈是网速。拿512k网速来说,一个内容丰富的网页容量有500k-1m,第一次打开完全显示需要十秒,即使以后打开也需要1,2秒。对于pm来说,再复杂的筛选比如google,1秒足够了。现在网页渲染速度已经很快了,多数情况都在2秒之内,而且渲染是和加载网页元素一起进行的,而显然网速是一大瓶颈。所以时间不是最重要的考虑因素。
2.如果用css控制网页,如display:none,打开时还是会被加载的。虽然有时网页很快就出来了,但一些图片js还在不断的下载。我不要的东西为什么还要占用我的内存,总让人觉得很不爽。
3.其他要考虑的因素还有cpu。sidki的编写方法是可取的,cpu占用永远不会超过20%,而且相当平稳。
所以我也倾向于在pm的时候就把事情都做了,该删的就要删。当然如何删就是另外一回事了。象sidki这种高度整合集成的高质量代码我们很难模仿的,但其中还是有很多技巧可寻的。review了sidki后发现,它对有js生成的网页元素控制办法不多,可能是由于网页太复杂缺乏统一的方法。因而只能具体问题具体分析了。
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 关于磬灵风软和伊甸园论坛的 BT 发布页的 JavaScript 弹窗广告的摧残过滤手法

Post by ddbb »

关于2. 这个是和浏览器的引擎有关的....IE没有研究过.....不过我用的opera 图片在不显示也就是display:none的情况下是不下载的..... JS是下载的....(因为JS本身就是不显示的....显示与否和他下载与否无关) 关于JS上面已经说过了....
Post Reply