1、什么是盗链和防盗链
现在服务器的价格并不贵,各种网站层出不穷,有不少人在网站建设上投入了不少精力,网站内容上投入了不少优质的资源,比如精美的图片,动感的视频,好听的音乐等等,这些资源都对应有一个 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 决定防止别人盗取自己的资源链接。这就要配置防盗链。
WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测,如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能
2、盗链产生原因及分类
- 网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益。
- 早期的盗链一般是一些比较小的网站盗取一些有实力的大网站的地址,盗链的目标比较有针对性
- 现如今,一些大型的网站也已经开始把盗链的目光锁定在了整个互联网上,窃取整个互联网上的其它机器的带宽
常见的盗链有以下几种:图片盗链、音频盗链、视频盗链、文件盗链
(1)盗链产生的原因
一般被访问浏览的页面并不是一次全部传送到客户端的:
如果客户请求的是一个带有许多图片和其它信息的页面,那么最先的一个HTTP 请求被传送回来的是这个页面的HTML文本
客户端浏览器对这段文本解释执行后,发现其中还有其它文件,客户端浏览器会再发送一条或者更多HTTP请求
当这些请求被处理后其它文件才被传送到客户端,然后浏览器将这些文件放到页面的正确位置
一个完整的页面要经过发送多条HTTP 请求才能够被完整地显示
基于这样的机制,盗链就成为可能,服务提供商完全可以在自己的页面中嵌入别人的链接,显示在自己的页面上,以达到盗链的目的。
(2)盗链的分类
根据盗链的形式的不同,可以简单地把盗链分成两类:常规盗链和分布式盗
常规盗链比较初级,同时也比较常见,具有一定的针对性,只盗用某个或某些网站的链接
技术含量不高,实现也比较简单,只需要在自己的页面嵌入别人的链接即可
分布式盗链是盗链的一种新的形式,系统设计复杂,难度相对较大
这种盗链一般不针对某一个网站,互联网上任何一台机器都可能成为盗链的对象
服务提供商一般会在后台设置专门程序(Spider)在Internet上抓取有用的链接, 然后存储到自己的数据库中
而对于最终用户的每次访问,都将其转化为对已有数据库的查询,被查询到的URL 就是被盗链的对象
由于对文件的访问已经被浏览器屏蔽掉了,所以最终用户感觉不到所访问的链接是被盗取的链接。(鄙人直呼牛逼)
3、防盗链方法
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 攻击的后果。
4、防盗链之nginx的配置关于nginx服务中的可添加模块详情文档
第一步:实验环境配置,关闭selinux,开启nginx服务
192.168.13.134 | 被盗链服务器 |
---|---|
192.168.13.129 | 盗链服务器 |
192.168.13.125 | 访问端 |
第二步:模拟偷盗链一端环境布置
[root@server1 mnt]# yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm
[root@server1 mnt]# tar -zxf nginx-1.18.0.tar.gz
[root@server1 mnt]# cd nginx-1.18.0/
[root@server1 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx