2023年11月25日发(作者:)
迅雷下载连接识别的方法与限制的实现
迅雷下载连接识别的方法与限制的实现
摘要
随着迅雷支持的下载协议的增加,有越来越多的网民使用迅
雷作为自己的下载工具。但迅雷使用率的增长也给不同的网站造
成了不同程度的影响,带宽有限的小型网站受到的影响较为严重。
本文通过介绍和提出几个方法来限制迅雷对网站资源的大量占
用,以帮助小型网站不再因迅雷的盗链致使流量被大量占用。
关键词
迅雷下载流量限制
第一章前言
1.必要性
小型网站一般所占有的网络带宽和服务器资源有限,不足以提供
较大流量的下载服务。但一般小型网站也会根据自身的内容,提供一
些相关的下载,其中有可能有较大的文件。因为小型网站的访问量不
高,因此通过正常途径获取下载地址的用户进行的下载一般不会对小
型网站造成太大影响。但小型网站所提供的下载地址一旦被迅雷收
录,就有可能造成大量与此网站无关的用户直接下载这些小型网站的
资源,超出了小型网站所能承受的流量,这就会对小型网站的正常运
-1-
迅雷下载连接识别的方法与限制的实现
行造成严重影响。
2.预期目的
通过使用本文介绍和提出的一系列技术手段,希望能识别部分由
迅雷发起的HTTP请求,并对其实行拒绝或抛弃处理,同时尽量避免
对正常用户的浏览和下载造成影响,以达到限制迅雷对网站资源的下
载,减少由迅雷引起的网络带宽和服务器资源的浪费,保证网站稳定
运行的目的。
第二章技术分析
1.请求识别
迅雷是一种不通过网页浏览这一环节就直接请求下载资源的下
载工具。由于其跳过了网页浏览这一行环节,我们就可以通过一些手
段将其与对网页进行过浏览操作的普通用户区分开来,从而识别出迅
雷的请求。
另一方面,截止到5.7.3.389版本为止,迅雷所发送的用户代理
(User-Agent)字符串一直没有变化,而这个用户代理字符串是一个
干净的WindowsXP系统所特有的。通过对每个请求所发送的用户代
理字符串进行分析,也可以在一定的误差程度内识别出由迅雷发起的
请求。
在FTP协议下,迅雷的表现方式也与其他FTP客户端有所不同,
通过这些差别就可以识别出迅雷发起的FTP连接并拒绝。
-2-
迅雷下载连接识别的方法与限制的实现
2.限制请求
通过识别出迅雷的请求,就可以对该请求执行抛弃或拒绝操作,
以限制迅雷对网站资源的下载。一般来说,对于通过程序读取保存在
磁盘上的文件以后转发到客户端的下载方法,可以在程序中容易地实
现对请求的限制。对于地址是直接公开的方法,也可以通过在更低的
层次上编写服务器端扩展来对请求进行限制。
第三章
HTTP方式下的具体实现
1.方法介绍及使用
这里介绍了几种在HTTP服务上防止迅雷下载的方法,并重点介
绍用户代理判断方法。
1.
用户代理判断方法
原理说明
对于每一个HTTP请求,客户端都会发送自己的用户代理,用户
代理中一般包括了操作系统信息、浏览器信息以及其他的一些信息。
由于不同的操作系统和浏览器版本的不同,不同的浏览器发送的用户
代理也不尽相同。但是下载工具并不是浏览器,因此没有自己的浏览
器信息。目前使用较为广泛的下载工具都默认发送了已经预定好的用
户代理,这个用户代理一般仅带有操作系统和浏览器信息(多为IE),
迅雷也是使用了这样的方法。
-3-
迅雷下载连接识别的方法与限制的实现
用户在使用电脑的过程中,常常会往电脑内安装一些软件或使用
不同的浏览器,这样就有可能改变用户经常使用的浏览器所发送的用
户代理。而与此同时,下载工具所发送的用户代理是不会变化的,这
就造成了迅雷发送的用户代理的特殊性。
因为迅雷的用户代理是特殊的,我们就可以将其与其他软件发送
的用户代理区分出来。通过观察,我们发现迅雷不同的版本最常使用
的是以下4个用户代理(截止到2008年4月8日观察到的数据):
用户代理()版本
User-Agent
Mozilla/4.0(compatible;MSIE6.0;Windows+NT5.1)XunleiV5.7.3.389或更早
Mozilla/4.0(compatible;MSIE6.0;Windows+NT5.0)
Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;)XunleiV5.7.9.466之后(含)
Mozilla/5.0(compatible;MSIE6.0;Windows+NT5.0)WebXunlei
XunleiV5.7.7.441或到
XunleiV5.7.9.466之前(不含)
表3-1不同版本的迅雷发送的用户代理
通过服务器端的编程,我们可以很容易地获取用户代理,将获得
的用户代理与以上4个用户代理进行对比,就可以识别出迅雷的链
接。
识别后的处理方法
在确定一个连接是由迅雷发起的以后,我们可以采取这样一些措
施。
断开此连接
断开此连接,并将其IP屏蔽一段时间
重定向到提示页面
-4-
迅雷下载连接识别的方法与限制的实现
第一种方法是比较直接的,也是较为简单的。但如果迅雷不断地
进行连接,对于一些下载量较大的资源来说,也会对服务器造成一定
的压力。如果是这种情况,可以考虑使用第二种方法。
如果你还有别的考虑,也可以考虑使用第三种方法,或者是其他
的这里没有提及的方法。
对正常用户的影响
虽然使用用户代理判断方法可以较为简单地识别出迅雷发起的
连接,但这种方法存在的最大问题是会给小部分正常用户的正常访问
操作造成影响。在这里说明了影响产生的原因,并结合实际分析影响
的范围。
造成影响的原因
不排除有这样一些正常用户,他们使用的浏览器发送的用户代理
和迅雷发送的用户代理相同。在这种情况下,使用这样一种方法来限
制迅雷就会给这些用户带来影响。这种影响是无法完全避免的,但可
以通过一些方法来减小对这些用户的影响。
影响范围
分析网站的访问日志,可以看到每一个HTTP请求所请求的文件
和客户端发送的用户代理。通过分析网站的访问日志,就可以得出一
个大概的影响范围。
-5-
迅雷下载连接识别的方法与限制的实现
这里采用的方法是,筛选出使用了与迅雷发送的用户代理一致的
请求,根据这些请求所请求的文件进行判断。若请求的是大型文件,
则认为是迅雷,否则认为是正常用户。
下面的数据给出了小樱之町论坛(/)从2007年8
月14日到2008年3月2日的访问记录分析结果。
XunleiXunlei
V5.7.3.389V5.7.7.441合计
或更早或更晚
用户代理异于迅雷的正常用户78008344700112533
日志文件总大小(不区分迅雷)8613569
用户代理与迅雷相同的正常用
户占总数的比例
0.906%0.400%01.306%
Web
Xunlei
表3-2与迅雷发送相同的用户代理的访问分布
正常用户的数据是根据合计数据减去所有迅雷的数据得到的。在
统计的时候日志文件总大小的数据已被人为缩小(2008年3月的数
据没有统计),但用户代理与迅雷相同的正常用户的统计数据样本来
源没有缩小,因此实际上使用和迅雷相同的正常用户的比例会更小。
统计数据以KB为单位进行计算,这不会对结果造成不可忽略的
影响。
若请求的文件扩展名为“zip”、“rar”或“mp3”则认为是大型文
件。
减小影响的方法
普通用户的大部分操作是浏览网页而不是进行下载,而迅雷的主
要操作是下载而不是浏览网页。因此,我们可以加上这样一个判断:
-6-
迅雷下载连接识别的方法与限制的实现
若一个疑为迅雷的连接请求的不是下载文件,则允许此连接,否则断
开。加上这个判断以后,我们可以保证这部分用户除了下载文件以外,
可以正常地使用网站所提供的其他服务。
考虑到迅雷连接到其他索引时绝大部分都是进行续传请求(即带
Range的HTTP请求),我们可以仅限制疑为迅雷的连接的续传请求。
这样可以保证普通用户正常进行无断点续传支持的下载操作,而限制
迅雷通过索引链接进行的大部分下载。
应用举例
服务端编程的方法很多,可以利用动态网页技术,也可以使用
HTTP服务程序所提供的接口。以下以Apace、PHP和ISAPI进行简
单的举例。
使用Apache的mod_rewrite进行限制
mod_rewrite是ApacheHTTPServer的扩展模块。提供格式化的
重写引擎对用户请求的资源地址的重写,可以使用多种环境变量。在
这里,我们就使用HTTP_USER_AGENT这一环境变量并结合正则表
达式来进行判断。
Apache配置代码
RewriteCond%{HTTP_USER_AGENT}^Mozilla/4.0(compatible;MSIE6.0;
WindowsNT5.1)$[NC,OR]
RewriteCond%{HTTP_USER_AGENT}^Mozilla/4.0(compatible;MSIE6.0;
WindowsNT5.0)$[NC,OR]
RewriteCond%{HTTP_USER_AGENT}^Mozilla/4.0(compatible;MSIE6.0;
WindowsNT5.0)$[NC]
RewriteCond%{HTTP_USER_AGENT}^Mozilla/4.0(compatible;MSIE6.0;
WindowsNT5.1;)$[NC]
-7-
迅雷下载连接识别的方法与限制的实现
RewriteRule^/download/.*/
[NC,F]
代码3-1使用重写模块通过用户代理识别并限制迅雷下载文件
给Apache应用这段设置以后,Apache会将发送了迅雷的用户代
理的连接重定向到非下载目录,从而阻止迅雷进行下载服务器上的资
源。
使用PHP进行限制
在PHP中,我们可以直接在程序中读取文件,然后通过程序发
送到客户端,同时不公开文件的URL。这样我们就可以对用户隐藏
文件的地址,用户必须通过PHP来下载文件,而不能直接向服务器
请求。在PHP中我们只要验证用户是否使用了迅雷,如果是,则断
开链接,不是,则返回文件数据到客户端。
代码的实现很简单,首先是判断用户代理,接着根据判断结果决
定是否允许用户下载。
PHP代码
//如果是迅雷则退出 if(isThunder()){ forbiddenThunder(); } //下载主程序 /*函数定义*/ //发送HTTP403错误并给出提示,退出程序 functionforbiddenThunder(){ header('HTTP/1.1403Forbidden'); header('Tip:PleaseDONOTdownloadVIAThunder'); exit; } //根据UserAgent判断是否为迅雷 functionisThunder(){ -8- 迅雷下载连接识别的方法与限制的实现 $ua=trim($_SERVER['HTTP_USER_AGENT']); return$ua=='Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)'|| $ua=='Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0)'|| $ua=='Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;)'|| $ua=='Mozilla/5.0(compatible;MSIE6.0;WindowsNT5.0)'; } ?> 代码3-2使用PHP通过用户代理识别并限制迅雷下载文件 在用户试图下载资源时,先由PHP程序通过用户代理判断这是 否是由迅雷发起的连接。如果判断结果为该连接可能是迅雷,则返回 HTTP403错误;如果不是迅雷发起的连接,则继续往下执行,返回 文件的二进制流。 使用ISAPIFilter进行限制 ISAPIFilter(以下简称ISAPI)是可以应用于InternetInformation Service(万维网信息服务,以下简称IIS)的服务器端扩展。用户请 求到达IIS之后,ISAPI都会有机会处理这个请求。利用ISAPI我们 就可以在IIS确定处理用户的请求之前识别出迅雷发起的连接并断 开。 在ISAPI的OnPreprocHeaders事件里我们可以获得此连接发送的 用户代理,在这里我们就可以将其与迅雷的用户代理进行对比,并 据定是否断开此连接。 C++代码 DWORDCXBFilter::OnPreprocHeaders(CHttpFilterContext*pCtxt, PHTTP_FILTER_PREPROC_HEADERSpHeaderInfo){ //……变量定义省略 pCtxt->GetServerVariable("HTTP_USER_AGENT",UserAgent,&BufSizeUA); //屏蔽迅雷,若符合迅雷的用户代理且有Range请求,或者请求了一个音乐或压缩包之 类的可能会很大的文件,返回给它 -9- 迅雷下载连接识别的方法与限制的实现 bIsThunder= !strcmp(UserAgent,"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)") ||!strcmp(UserAgent,"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.0)") ||!strcmp(UserAgent,"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;)") ||!strcmp(UserAgent,"Mozilla/5.0(compatible;MSIE6.0;WindowsNT5.0)"); if(bIsThunder) { //这里就是屏蔽了,返回一个提示给它,然后结束连接 pCtxt->AddResponseHeaders("Tip:请不要使用迅雷进行下载rn",0); pCtxt->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER,"403 Forbidden",NULL,NULL);//设置HTTP头 returnSF_STATUS_REQ_FINISHED;//返回结束连接的状态码 } //返回正常的状态码 returnSF_STATUS_REQ_NEXT_NOTIFICATION; } 代码3-3使用ISAPI通过用户代理识别并限制迅雷 这段代码的作用是,在请求交由IIS正式处理之前,先有ISAPI 对用户代理进行识别,如果发现此连接是由迅雷发起的话,就结束连 接,否则交由IIS继续处理。 2. 链接定期更换方法 原理说明 在某一个人使用迅雷下载了服务器上的资源以后,迅雷就会把这 个资源的地址索引到迅雷的索引数据库里。在这以后,从其他地方下 载同一个资源的用户就会从迅雷的索引服务器上得到该资源在你服 务器上的地址。也就是说,迅雷收录的是用户从你的服务器上下载这 个资源时使用的链接,其他的没有经过你的下载页的用户也只能是获 得这一个链接。如果这时候我们将下载链接进行更改,在没有用户使 -10- 迅雷下载连接识别的方法与限制的实现 用迅雷通过修改后的链接下载资源之前,迅雷索引的就会保持为先前 的链接。这样,迅雷用户通过迅雷获得的下载链接实际上已经成为一 个无效地址,也就无法从你的服务器上下载资源了。 可能造成的影响 如果一个资源文件大小很大,使用速度较低网络的用户可能就不 能在一个下载目录重命名周期内完成下载。虽然用户也许可以通过修 改下载地址继续下载,但并不是所有的用户都会进行这样的操作,且 这样操作也会给用户带来麻烦。 3.网页Cookies判断方法 原理说明 在用户访问浏览网站的普通网页时,可以给用户写入一个 Cookies,以记录该用户曾经访问过我们的网站。同时,当一个连接 请求下载的时候,检查此连接的客户端有没有标识用户曾经访问过网 站的Cookies,如果有,则允许下载,否则拒绝下载。 可能造成的影响 部分用户可能已经通过正常途径访问了网页,并得到了一个标识 已访问过网页的Cookies。但这些用户下载时使用的下载工具没有向 服务器发送Cookies,这时用户就不能正常下载到资源。 -11- 迅雷下载连接识别的方法与限制的实现 绑定方法 原理说明 针对每一个用户,根据其IP给出不同的下载地址,并将IP地址 和下载地址绑定。每一个用户访问下载页面的时候,动态地根据用户 的IP生成一个下载地址。接收到下载请求的时候,检查其请求的下 载地址是否对应其IP,对应则允许下载,否则拒绝下载。 可能造成的影响 部分用户的IP变动极快,可能每几分钟IP就会变动一次。这样 的用户在IP地址改变以后,他的IP地址就和他所得到的下载地址失 去对应,因而无法正常下载。对于普通的PPPoE拨号用户,一般他 们的IP在计算机重新启动之后都会改变,如果这些用户在下载过程 中重新启动了计算机,他们就必须重新下载。这对用户来说是很不方 便的。 第四章FTP方式下的具体实现 指令序列识别方法 名词定义 FTP指令序列 在本文中,FTP指令序列指一个FTP连接从连接建立到开始接 -12- 迅雷下载连接识别的方法与限制的实现 收首个下载文件的区间内,所发送的FTP指令中指令名部分所组成 的队列。 原理说明 任何一个FTP连接需要下载文件,从该连接建立开始,都要通 过一系列FTP指令向服务器发送请求,才能完成期望的操作。我们 注意到,几乎每一种FTP客户端都有自己独特的FTP指令序列,迅 雷也不例外。 从理论上来说,对于大部分FTP客户端发起的连接,即使某一 个连接没有通过CLNT指令发送客户端信息,我们也可以通过该连接 的指令序列来确定其客户端。 对于迅雷来说,我们可以实现截获其FTP指令序列,并在服务 器端进行相应的设置。在迅雷试图从FTP服务器下载资源时,服务 器就可以通过指令序列识别出迅雷的连接,从而阻止下载。 具体实现 迅雷的FTP指令序列 截止到2008年4月8日,我们观察到的迅雷FTP指令序列有如 下4种: 下载文件位于根目录,直接下载 USERPASSTYPESIZEPASVRETR -13- 迅雷下载连接识别的方法与限制的实现 下载文件位于根目录,续传下载 USERPASSTYPESIZEPASVRESTRETR 下载文件位于非根目录,直接下载 USERPASSCWDTYPESIZEPASVRETR 下载文件位于非根目录,续传下载 USERPASSCWDTYPESIZEPASVRESTRETR 具体实现方法 对于不同的FTP服务端软件,有不同的设置方法。具体可以参 考FTP服务端软件的用户手册。这里仅简单介绍Serv-U的方法。 对于Serv-U,可以借助其开发的插件接口来开发相应的插件。 Serv-U开放了截获每一个指令事件的接口,通过这个接口,我们可以 截获每一个连接的FTP指令序列。在某一个连接请求下载时,将此 连接的指令序列与已知的迅雷的FTP指令序列进行对比,如果相同, 则可以认为该连接是由迅雷发起的,这时就可以不响应此连接的下载 请求,还可以根据情况屏蔽此IP。 可能造成的影响 造成影响的原因 无法确定所有的FTP客户端的指令序列都是唯一的,因此有可 能存在与迅雷的FTP指令序列相同的FTP客户端。若这种客户端存 -14- 迅雷下载连接识别的方法与限制的实现 在,那么在我们限制迅雷下载的时候,这种客户端也会被错误地限制。 已发现的影响 截止到2008年4月8日为止,我们只发现了一个这样的影响。 快车V2.0Beta6版本的FTP指令序列与迅雷在下载FTP根目录时发 送的FTP指令序列相同。这意味着,如果不加处理,在限制迅雷的 同时快车2.0Beta6也会被错误地限制。 解决方法 我们可以仅限制迅雷下载非FTP根目录下的文件来消除这个影 响。同时为了到达完全限制迅雷的目的,可以不在FTP根目录存放 任何文件。这样处理以后,就可以限制迅雷而不给快车造成影响。 第五章其他 一些离题的问题 有人说,使用上面的方法对迅雷进行限制以后,虽然迅雷已经不 能下载我的资源了,但是我的服务器还是收到了很多迅雷的请求,虽 然都被一一拒绝,但请求数量之大,已经和分布式拒绝服务攻击或者 CC攻击没有什么不同了。对于这种情况,我们认为,这都是过去没 有限制迅雷下载的时候,某人通过迅雷成功地下载了你的服务器上的 资源,迅雷才索引到了你的资源。从限制迅雷下载开始,你的服务器 上新增的资源就不会被迅雷成功下载,也就不会被索引了。也许过一 -15- 迅雷下载连接识别的方法与限制的实现 段时间以后,迅雷长期不能从你的服务器上下载资源,就会把你从索 引中删除的。如果实在等不了这么长的时间,那么可以尝试修改HTTP 下载为非标准HTTP端口,FTP端口也修改为非标准的。比如把HTTP 下载的端口改成2081,FTP端口改成2021。 致谢 HTTP请求识别的用户代理方法是在互联网上看到的(原文: apache防迅雷下载/盗链,作者:est),在此特别感谢。 另外感谢以下人员对反迅雷研究的支持: 江苏南京白水山言 广东广州包子研究员 作者信息 网络称呼:greensea 城市:广西百色 电子邮件:dengyi910@ 个人主页:/ 结语 其实文中提到的很多方法都是很容易被迅雷绕过的。但是,迅雷 的下载方式毕竟是和普通的下载方式不同的,既然不同就一定会有差 异之处,只要能找到这个差异,就可以识别出迅雷。这世上有很多问 -16- 迅雷下载连接识别的方法与限制的实现 题都是看似不可能,但只要用心去想,未必不会有解决方法。其实在 开始写这篇文章的时候,FTP指令序列识别的方法我还没有想出来, 当时也是认为在FTP上是没有办法识别出迅雷的。可现在呢,竟然 想出了这样一个FTP指令序列识别的方法,当时我也是比较吃惊的, 没想到在FTP上竟然也能较为准确地识别出迅雷。所以说,这世上 没有一开始做不到的事情,只有你没有认真努力去做的事情。 在写下这段文字的时候,我已经开发出了Serv-U和ISAPI的反 迅雷插件,它们分别名为GSSXI和GSIXI,其中的GS就是我的名字 的缩写,中间的S和I,S是Serv-U的意思,I是ISAPI的意思,后 面两个字母XI是XunleiImmune的意思。Gene6的插件也现在也已 经有人开发出来了。关于这几个插件的信息,都可以在我的主页上找 到。直接地址是:/gs/fanxunlei/。 最后谢谢你能看完这篇文章,希望本文能对你有用。另外,我没 有仔细地检查文中的错字和其他可能的错误,如果有错还请原谅。 相信你能做到,你就一定能做到。不尝试的话,怎么能断言做不 到呢?愿你能发现更好的识别迅雷的方法,与大家交流,碰撞出思想 的火花(如果迅雷依然我行我素的话)。 -17-


发布评论