HackPig520's Blog
你好啊朋友~

阅读本文大概需要 3 分钟。

现在服务器的价格并不贵,各种网站层出不穷,有不少人在网站建设上投入了不少精力,网站内容上投入了不少优质的资源,比如精美的图片,动感的视频,好听的音乐等等,这些资源都对应有一个 url ,当然网站也有一个 url。正常情况下是这样的:比如网站 A的 url 是 https://somesite.com 里面的动感视频的 url 是 https://somesite.com/video/xxx.mp4 。这些优质的目的是吸引用户,增加流量,而流量最终通过广告或者带货,都可以变为钱。

但另外一些网站也为了吸引用户,也建立了网站 B: https://anothersite.com/ 也想提升访问量,但没有优质的资源,于是就在视频区域内指向别人的视频链接:https://somesite.com/video/xxx.mp4 ,这样,在访问 https://anothersite.com/ 时就可以看到动感的视频,网站 B 就盗取了别人的链接,这就叫盗链。

B 盗取了 A 的视频链接,B 的访问量增加,而 A 网站的访问量并未增加,却白白为 B 贡献了服务器资源,这是无法让 A 忍受的。于是 A 决定防止别人盗取自己的资源链接。其实这有点像反爬虫。

其实一切的网络请求都限定 HTTP 协议的范围内,熟悉了 HTTP 协议,任何 http 请求相关的问题都可以解决。

常见的防盗链方法:

1、判断请求资源的来源是否是本网站的域名。这种方法也是最简单最常用的,因为浏览器在发起下次请求时会把本次的链接放在 HTTP 请求头的 Referer 字段,如下图所示,服务器判断这个 Referer 字段的值是否在本网站的域名之下即可。

2、使用登录验证。这个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证,如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。

不过这种方法有两种缺点:一是正常访客无法匿名下载,会减少不想注册的访客的流量,二是登陆的访客无法使用下载工具下载。

理由:登录状态依赖于会话 id,而会话 id 往往储存于 http 请求的 cookie 字段里,下载工具一般没法获得浏览器的 cookie 字段,所以这些资源往往无法使用下载工具来下载,给正常合法用户带来诸多不便(因为大部分网民的系统都安装了下载工具,一点击下载链接一般会被下载工具拦截,导致无法使用浏览器本身的下载功能)。

这种情况的简单的解决方法是将这个 session id 放到 URL 中,而不放在 cookie 中。

3、使用 cookie 。其实这种方法原理上跟方法 2 差不多。就是在显示“下载”链接的页面里产生一个动态值的 cookie,然后在处理资源下载请求时先判断 cookie 里有没有正确的 cookie,如果没有则返回错误提示信息。至于这个动态值如何产生,只要能逆向判断动态值是否合法的都可以,例如将当前的时间去除秒数取哈希值(也叫散列值)。

4、使用 POST 。客户端浏览器请求资源都是使用 HTTP 的 GET 方法,其实使用POST方法也可以往客户端返回数据。所以可以将下载链接换成一个表单(Form)和一个按钮 (Submit),将待下载的文件的名称或id放到表单的一个隐藏文本框(Input)里,当用户点击提交按钮时,服务程序先判断请求是否为 POST 方式,如果是则读取目标资源的二进制数据并写入响应对象。

使用这个方法的缺点同样是无法使用下载工具,更没法实现断点续传。不过比方法 2,3 好一点的是,下载工具不会拦截你的下载动作,所以正常用户还是比较顺畅地下载到文件。这个方法比较适合小文件的下载。

5、使用验证码。这个原理不多说,缺点也是有的,给正常用户带来不便。

6、使用动态文件名,或者动态的 url 链接。当用户点击一个下载链接时,先在程序端计算一个Key(使用一定规律产生的 Key,最好不要使用随机字符串例如 GUID,并且这个 Key 必须有一定时效的),然后在数据库或 Cache 里记录这个 Key 以及它所对应的资源 ID 或文件名,最后让网页重定向一个新的 URL 地址,这个新 URL 地址里需要包含这个 Key。当浏览器或下载工具发出下载请求时,程序先检测这个 Key 是否存在,如果存在则返回对应的资源数据。

使用这个方法的好处是下载工具也可以下载,并且在 Key 失效前可以断点续传,并且可以通过 Key 来控制下载的线程数。

使用这个方法坏处是:当任意一个用户下载成功之后,你的资源就会被一些下载工具列入“资源候选名单”,以后其他人在其他地方下载同样的文件时,下载工具会不断连接你的服务器,即使你的文件已经删除或者 Key已经失效了,这样会造成类 DDos 攻击的后果。

盗链的方法

我劝你善良。盗链者一般都是直接把别人资源的 url 放在自己的网站上,以上的防盗链方法在应付这种足足有余。想用简单的方法盗链还是放弃吧。如果你不嫌麻烦,可以将别人的资源手工下载后放在自己的网站上,这样做有引起版权纠纷的风险。

posted on 2020-07-05 12:42  HackPig520  阅读(180)  评论(0编辑  收藏  举报