防盗链简述
防盗链是一种保护网络资源所有者权益的技术手段,旨在防止未经授权的用户或网站通过直接链接的方式盗用资源,以下是关于防盗链的简述:
原理
- 基于请求头验证:服务器通过检查请求头中的特定字段,如
Referer
字段,来判断请求是否来自合法的来源。如果Referer
的值表明请求是从授权的域名发起的,服务器就允许访问资源;否则,服务器可以拒绝提供资源或返回错误信息。 - 加密与签名:对资源的链接进行加密或添加签名,使合法的请求能够正确解析和访问资源,而非法盗链的请求由于无法获取正确的加密信息或签名,无法正常访问。例如,生成包含资源路径、访问时间等信息的签名,服务器验证签名的有效性来确定请求是否合法。
常用方法
- 设置
Referer
检查:服务器端配置允许访问的域名列表,只有当Referer
头中的域名在列表中时,才允许访问资源。如在 Nginx 中,可通过valid_referers
指令配置合法的Referer
来源。 - 使用 Token 验证:为每个合法的资源请求生成一个唯一的令牌(Token),客户端在请求资源时需要携带该令牌。服务器验证令牌的有效性,以确定是否允许访问。这种方法通常用于更严格的访问控制场景,如 API 接口的防盗链。
- IP 限制:根据客户端的 IP 地址来限制对资源的访问。服务器可以配置允许访问的 IP 地址范围,只有来自这些 IP 地址的请求才能访问资源。但 IP 限制可能存在局限性,因为 IP 地址可能被伪造或动态分配。
作用
- 保护资源所有者权益:防止他人未经授权使用资源,避免因盗链导致的带宽浪费、存储成本增加以及潜在的商业利益损失。例如,视频网站的视频资源若被大量盗链,会导致网站自身用户体验下降,同时影响广告收入等商业利益。
- 维护网站性能和稳定性:减少因非法盗链带来的额外负载,确保服务器能够稳定地为合法用户提供服务。如果大量盗链请求占用了服务器带宽和资源,可能会导致网站运行缓慢甚至崩溃,影响正常用户的访问。
防盗链配置方法
防盗链的配置方法有多种,以下是一些常见服务器环境下的防盗链配置示例:
Nginx 服务器
- 基于 Referer 验证
- 首先在 Nginx 配置文件中,找到对应的
server
块或location
块,添加valid_referers
指令来指定合法的 Referer 来源。例如:
- 首先在 Nginx 配置文件中,找到对应的
nginx
server {
listen 80;
server_name example.com;
location / {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
}
-
上述配置中,
valid_referers
指定了允许的 Referer 来源,包括空 Referer、被截断的 Referer 以及来自example.com
及其子域名的 Referer。如果Referer
不合法,if
条件判断会返回403 Forbidden
错误。 -
使用加密链接
- 可以使用第三方模块如
ngx_http_auth_request_module
来实现加密链接防盗链。首先需要安装该模块,然后配置如下:
- 可以使用第三方模块如
nginx
server {
listen 80;
server_name example.com;
location /protected_resource {
auth_request /auth;
# 其他配置
}
location /auth {
internal;
# 这里可以配置与认证服务器的交互逻辑,例如验证加密令牌等
# 假设使用Lua脚本进行令牌验证
content_by_lua_block {
local token = ngx.var.http_token
if token == "valid_token" then
ngx.status = ngx.HTTP_OK
ngx.exit(ngx.HTTP_OK)
else
ngx.status = ngx.HTTP_FORBIDDEN
ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
}
}
- 上述配置中,
/protected_resource
是需要保护的资源路径,通过auth_request
指令将请求转发到/auth
进行认证。在/auth
location 中,使用 Lua 脚本验证请求头中携带的加密令牌token
,如果令牌有效则返回200 OK
,允许访问资源,否则返回403 Forbidden
。
Apache 服务器
- 基于 Referer 验证
- 在 Apache 的配置文件(通常是
httpd.conf
或相关的虚拟主机配置文件)中,使用mod_rewrite
模块来实现基于 Referer 的防盗链。例如:
- 在 Apache 的配置文件(通常是
apache
<VirtualHost *:80>
ServerName example.com
<Directory /var/www/html>
RewriteEngine On
# 允许来自example.com及其子域名的Referer
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]
# 对于不合法的Referer,返回403错误
RewriteRule .* - [F]
</Directory>
</VirtualHost>
-
上述配置中,
RewriteEngine On
开启了重写引擎,RewriteCond
指令设置了两个条件,第一个条件允许来自example.com
及其子域名的 Referer,第二个条件排除了特定的不允许的路径。如果 Referer 不满足条件,RewriteRule
会返回403 Forbidden
错误。 -
使用.htaccess 文件
- 也可以在网站的根目录下创建
.htaccess
文件来配置防盗链。例如:
- 也可以在网站的根目录下创建
apache
RewriteEngine On
# 允许来自example.com及其子域名的Referer
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]
# 对于不合法的Referer,返回403错误
RewriteRule .* - [F]
- 这种方式与在配置文件中配置类似,只是
.htaccess
文件可以更灵活地针对特定目录进行配置,而无需修改全局的 Apache 配置文件。
IIS 服务器
- 基于 URL 重写模块
- 首先需要在 IIS 服务器上安装 URL 重写模块。然后在网站的
web.config
文件中进行配置,例如:
- 首先需要在 IIS 服务器上安装 URL 重写模块。然后在网站的
- 上述配置中,
rewrite
节点下的rule
定义了防盗链规则。match
元素匹配所有的 URL,conditions
元素设置了允许的 Referer 条件,与 Apache 的配置类似。如果 Referer 不满足条件,action
元素会终止请求,返回403 Forbidden
错误。
这些只是基本的防盗链配置方法,实际应用中可以根据具体需求进行调整和扩展。同时,防盗链技术也在不断发展,还可以结合其他安全措施来提高资源的安全性。
一、防盗链配置通过文件进行限制(限制域名、IP)
实现思路:访问http://192.168.72.130:9999/a.html 链接,a.html中配置有http://192.168.72.130:8888/aa.webp访问aa.webp图片的访问链接,通过配置防盗链来实现房屋内控制。
步骤一:配置a.html内容
通过a.html文件里的页面跳转链接进行访问,已经配置了跨域,详见上一篇文章:Nginx — 跨域问题演示以及解决方法-CSDN博客
<html>
<head>
<meta charset="utf-8">
<title>跨域问题演示</title>
<script src="jquery.js"></script>
<script>
$(function(){
$("#btn").click(function(){
$.get('http://192.168.72.130:8888/getUser',function(data){
alert(JSON.stringify(data));
});
});
});
</script>
</head>
<body>
<input type="button" value="获取数据" id="btn"/>
<img src="http://192.168.72.130:8888/aa.webp" /><br/>
</body>
</html>
步骤二:配置访问到a.html资源的nginx配置
server {
listen 9999;
server_name localhost;
gzip on;
root /opt/nginx;
location / {
index a.html;
}
}
步骤三:配置aa.webp图片资源访问防盗链
1、将aa.webp图片上传到/opt/nginx/image目录下,按照如下配置nginx。
server {
listen 8888;
server_name localhost;
gzip on;
location ~*\.(png|jpg|gif|webp){
valid_referers none blocked www.baidu.com;
if ($invalid_referer){
return 403;
}
root /opt/nginx/image;
}
}
2、进行访问测试
浏览器输入:http://192.168.72.130:8888/aa.webp
能正常进行访问
步骤三:通过a.html链接跳转进行访问
浏览器输入:http://192.168.72.130:9999/
因为配置了防盗链,所以访问失败!!
步骤四:将网段放行
1、修改nginx配置
server {
listen 8888;
server_name localhost;
gzip on;
location ~*\.(png|jpg|gif|webp){
#配置接收来自192.168.72网段的访问
valid_referers none blocked www.baidu.com 192.168.72.*;
if ($invalid_referer){
return 403;
}
root /opt/nginx/image;
}
}
2、进行访问测试
浏览器输出:http://192.168.72.130:9999/
访问成功!!
二、防盗链配置通过目录进行限制(限制域名、IP)
步骤一:修改nginx的配置
server {
listen 8888;
server_name localhost;
gzip on;
location /image {
valid_referers none blocked www.baidu.com 192.168.72.*;
if ($invalid_referer){
return 403;
}
root /opt/nginx;
}
}
浏览器输出:http://192.168.72.130:8888/image/aa.webp
访问成功!!
步骤二:修改a.html中的链接
1、修改a.html中的配置
<html>
<head>
<meta charset="utf-8">
<title>跨域问题演示</title>
<script src="jquery.js"></script>
<script>
$(function(){
$("#btn").click(function(){
$.get('http://192.168.72.130:8888/getUser',function(data){
alert(JSON.stringify(data));
});
});
});
</script>
</head>
<body>
<input type="button" value="获取数据" id="btn"/>
<img src="http://192.168.72.130:8888/image/aa.webp" /><br/>
<a href="http://192.168.72.130:8888/image/centen.html">点击这里访问页面</a><br/>
</body>
</html>
2、在/opt/nginx/image目录下添加centen.html文件
步骤三:访问测试
浏览器输出:http://192.168.72.130:9999/
总结:
通过目录访问限制的方法可以将不同的资源放到对应的目录下这样可以实现对资源的控制统一控制。
三、第三方模块ngx_http_accesskey_module 补充?