示意图:
防盗链
防盗链(Anti-leeching)是一种用于保护网站资源不被其他非授权网站盗用的技术手段。盗链是指其他网站在未经允许的情况下直接引用了目标网站的资源,比如图片、视频、音频等,从而消耗了目标网站的流量和带宽资源。防盗链技术旨在阻止这种非法盗用行为,保护网站的资源安全和带宽消耗。
浏览器可以通过发送 HTTP 请求时的 Referer 头字段来实现防盗链。Referer 是一种 HTTP 头字段,它包含了当前请求的来源页面的地址。在防盗链中,服务器可以检查 Referer 头字段,以确定请求资源的来源。当资源位于网站 A 上时,如果网站 B 直接链接到了网站 A 上的资源,当浏览器向网站 A 发送请求时,会在 HTTP 请求中包含 Referer 头字段,其值为网站 B 的地址。网站 A 可以通过检查这个 Referer 头字段来确定请求的来源,并据此判断是否允许访问资源。
Nginx的防盗链
在Nginx中,可以通过配置防盗链规则来限制只有来自特定网站的请求(referers为指定网址)才能访问资源,其他来源的请求将被拒绝。
格式:
valid_referers [指令参数];
- 如果请求中的引用页面不在valid_referers列表中,$invalid_referer将为真。
- 指令参数:
- none:表示不允许任何 Referer,允许缺失 referer 头部的请求访问,有referer就赋invalid_referer值为真。
- blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。
- 当请求通过防火墙或代理服务器时,有些安全设置会剔除或修改 Referer 头域,以保护用户的隐私或增强安全性。因此,当使用 blocked 时,Nginx 将考虑到这种情况,并允许这些请求通过防盗链验证。
- server_names:表示使用配置中的 server_name 作为 Referer 的白名单。
- 如*.example.com: 允许来自 example.com 域名的请求。
- example.com www.example.com: 允许来自 example.com 和 www.example.com 域名的请求。
- string:表示其他指定的 Referer。
if ($invalid_referer) {
return 403;
}
出现盗用则返回403错误。
(注意:Referer 头域容易被伪造或篡改,因此仅依赖 Referer 头域来验证请求的安全性可能并不可靠。最佳实践是结合其他安全措施,如使用身份验证或访问令牌等机制,以确保应用的安全性,更多内容请自行了解。)
举例
nginx.conf配置文件为:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 150.158.51.21;
location / {
root html;
index index.html index.htm;
}
location /img {
valid_referers 150.158.51.21;
if ($invalid_referer){
return 403;
}
alias img;
index index.html index.htm;
}
error_page 403 /StealChain.html;
location = /StealChain.html{
root html;
}
}
}
功能:直接访问ip,会返回index.html;index.html会再次访问静态资源图片(携带referers),然后将在主页显示图片;直接访问ip/img/图片名,会进入/img的location块,进而判断referers是否为150.158.51.21,如果为空,则报错403,返回错误显示页面StealChain.html。
目录结构:
效果:
- 访问ip:
- 直接访问图片URL: