什么是防盗链
防盗链不是一根链条,正确的停顿应该是防·盗链——防止其他网站盗用我的链接。
如何实现防盗链
IP黑白名单直接配置请求者的IP黑白名单。这个方法虽然有效,但必须要知道请求者的具体IP信息,可适用的场景比较有限。
实现方式以nginx为例
nginx allow & deny https://zhuanlan.zhihu.com/p/378026632
1、allow 和 deny 指令在 ngx_http_access_module 模块中。
2、两个指令分别表示允许或禁止源 IP 访问,用于对源 IP 做访问控制。
3、nginx 是按照自上而下的顺序进行匹配,匹配到一个就不往下继续了
4、遇到 return 指令时 return 指令还是会生效
# ngx_http_access_moduleserver { listen 8080; server_name _; charset "utf-8"; location / { deny all; allow 192.168.135.1; #default_type text/plain; #return 200 "$remote_addr 正常访问 3"; #echo "$remote_addr 正常访问 5"; }}
Referer 防盗链
Referer 代表请求来源。当客户端向服务器发送请求时,一般都会携带 Referer 头,告知服务器该请求是从哪个页面链接过来的。当请求发送到 CDN 节点后,CDN 节点检查请求头中所携带的 Referer 字段的信息,然后禁止或者允许符合特定规则(支持正则匹配)的 Referer 请求。
示例: gitee 使用了此种方式。
有两种情况,Referer不会被发送:
来源页面采用的协议为表示本地文件的“file”或者“data”URL。当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(Https)。Referer很容易伪造,所以Referer防盗链安全性较低。
User-Agent 防盗链
当你的网站是提供一些文件下载的业务,你有自己的客户端,并且只希望用户从你的客户端去下载,而不希望文件被用户通过迅雷或其他下载工具下载时,此时适合使用User-Agent 防盗链
User Agent 中文名为用户代理,简称 UA,它是一个特殊字符串头,能够让服务器识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等信息。它和 Referer 防盗链类似,在开启后 CDN 会针对 HTTP 请求头中的 User-Agent 信息,禁止或者允许符合特定 User-Agent 规则的请求。
每一个客户端都拥有自己的专属 User-Agent,我们可以抓包请求头查询到 User-Agent ,然后将自己的 User-Agent 加入白名单,或者将其他想要禁止的客户端 User-Agent 加入黑名单,从而保证用户只从自己允许的客户端下载内容。
Token 防盗链(时间戳防盗链)
时间戳防盗链可以通过对时间有关的字符串进行签名,将时间、签名信息通过一定的方式传递给CDN边缘节点服务器进行鉴权,从而正确响应合法请求、拒绝非法请求。相比referer防盗链,时间戳防盗链的安全性更强。
原理
时间戳防盗链的目的是使的每个请求的url都具有一定的是“时效性”,所以url本身需要携带过期时间的相关信息,同时还需要确保这个过期时间不能被恶意修改。因此采用md5算法, 将key、过期时间、文件路径等信息进行加密得到签名加入url,并在CDN节点进行验证,当 CDN 节点在验证请求时,除了验证过期时间,同时还会验证该 md5 值是否匹配,对于不匹配的 md5,说明 URL 被篡改,即使请求未过期也会禁止服务。
举例
/test.ts?key=68ddbe535557d6630a19cebde0cb9252&t=1481106349
适用场景
适用于对url有一定时效性的场景。如果盗链者定期的更新url,这种方法也会失效。回源鉴权防盗链
回源鉴权是一种高级的防盗链方式,需要在源站配置一台鉴权服务器,并设置鉴权方式。之后 CDN 边缘节点每次接受到请求之后,都会回用户源站的鉴权服务器进行验证,验证通过之后才认为是合法请求,CDN 才会继续提供服务。
适用于:
客户技术实力较强,又不希望第三方公司知悉其防盗链原理。CDN无法满足客户特殊的防盗链需求时,可使用回源鉴权防盗链。