概叙
盗链攻击是一种常见的网络安全威胁,不仅侵犯了内容创作者的版权,还可能会给原网站带来严重的损失。
了解盗链攻击的原理和类型,采取有效的防范措施,是保护网站和服务的重要手段。
通过技术和法律手段的结合,可以有效地防止和减轻盗链攻击的影响。
随着技术的发展,防盗链的方法也需要不断更新和完善,以应对新的挑战。
同时,广大网站管理员也要提高法律意识,尊重他人的知识产权,共同维护网络环境的健康发展。
什么是盗链
盗链是指在一个网站上直接链接到另一个网站服务器上的文件的行为。
简单来说,是指一个网站直接引用了其他网站上的资源(如图片、视频、文档等),而用户在访问这个网站时,实际上是在消耗被盗链网站的带宽和资源,但这些资源的流量和价值却归属到了盗链网站上。
例如,网站 A 的管理员发现网站 B 有一张很好的图片,他不将图片下载后上传到自己的服务器,而是在自己的网页代码中直接引用网站 B 的图片 URL。
这样,每当有人访问网站 A 的这个页面,图片都是从网站 B 的服务器上加载的。
盗链原理
盗链攻击的原理其实很简单,就是利用了 HTTP 协议的 referer 机制。
当用户访问一个网站时,浏览器会自动将当前页面的 URL 作为 referer 信息发送给服务器。
服务器根据 referer 信息判断请求是否合法,如果合法,则返回相应的资源;否则,拒绝请求。
攻击者通过篡改 referer 信息,使得服务器误以为请求是合法的,从而实现盗链。
盗链类型
根据攻击手段和目的的不同,盗链攻击可以分为以下几种类型:
- 直接盗链:攻击者直接将目标网站的资源链接嵌入到自己的网站中,用户访问时,资源请求会发送到目标网站服务器。
- 代理盗链:攻击者搭建一个代理服务器,将目标网站的资源通过代理服务器转发给用户,从而隐藏真实的 referer 信息。
- iframe 盗链:攻击者通过 iframe 标签将目标网站嵌入到自己的网页中,用户访问时,实际上是访问了目标网站。
- 图片盗链:攻击者将目标网站的图片资源嵌入到自己的网站中,用户访问时,图片请求会发送到目标网站服务器。
- 音频/视频盗链:攻击者将目标网站的音频或视频资源嵌入到自己的网站中,用户访问时,音频或视频请求会发送到目标网站服务器。
盗链的危害
- 攻击者通过盗链,将目标网站的服务器资源用于自己的网站,导致目标网站服务器负载增加,影响正常用户访问。
- 攻击者通过盗链,占用目标网站的带宽资源,导致目标网站带宽不足,影响正常用户访问速度。
- 网站的资源被攻击者非法使用,版权受侵犯。
- 盗链可能导致原网站的资源被用于非法或不当的内容展示,损害品牌形象和信誉。
- 网站的访问数据可能因被盗链而失真,影响数据分析和决策。
如何发现盗链
- 通过服务器日志分析,查看服务器日志,找出引用文件但来源网页非本站的请求。
- 通过带宽使用情况监控,异常的带宽使用可能是盗链造成的。
- 使用三方在线服务,使用第三方在线服务检测网站上的资源是否被盗链。
盗链防范措施
为了防范盗链攻击,可以采取以下措施(但不仅限于以下措施):
- 定期修改文件名和目录名,使得攻击者无法通过固定的 URL 访问到资源。
- 验证 Header 中 Referer 字段信息,判断请求是否来自合法的源网站。如果不是,则拒绝请求。这是最常见的防盗链方法,但也有局限性,如用户禁用 Referer 或黑客伪造 Referer。
- 验证 User-Agent客户端信息,防止爬虫,同时限定客户端,也能起到有一定的防盗链功能。但也有局限性,如黑客伪造 User-Agent。
- 为资源 URL 添加动态生成的签名参数,只有签名正确的请求才能访问资源,增加盗链的难度。
- 使用加密技术,对资源进行加密,使得攻击者无法直接访问到原始资源。
- 对于频繁访问的 IP 地址,可以采取限制请求频率的措施,防止攻击者大量盗链。或者根据请求的来源 IP 地址决定是否提供服务,只允许特定 IP 或 IP 段访问。
- 将资源部署到 CDN 节点上,减轻服务器负载,提高访问速度。大多数 CDN 服务商也提供内置的防盗链功能。
- 在图片或视频上添加水印,即使被盗链也能标示出原始来源。
法律法规与应对策略
针对盗链行为,《中华人民共和国著作权法》、《信息网络传播权保护条例》等法律文件都对网络作品的版权保护做出了明确规定,盗链行为可能构成侵犯信息网络传播权,需承担相应的法律责任,包括停止侵害、消除影响、赔礼道歉、赔偿损失等。
在遭遇盗链时,可以通过以下途径应对:
- 法律途径:收集证据,包括盗链的时间、方式、造成的损失等,向法院提起诉讼,维护自身权益。
- 技术反制:结合上述提到的技术手段,及时采取措施阻止盗链行为。
- 通知与协商:尝试与盗链网站沟通,要求其停止盗链行为,有时通过友好协商即可解决问题。
- 行业合作:加入行业协会或联盟,共享防盗链技术和经验,共同维护行业的健康发展。
Nginx 防止网络盗链的方法
从上面“盗链防范措施”可知,Nginx要完成防盗链,有两种方式:
- 验证 Header 中 Referer 字段信息,判断请求是否来自合法的源网站。
- 验证 User-Agent客户端信息,防止爬虫,同时限定客户端,也能起到有一定的防盗链功能。
- 在图片或视频上添加水印,即使被盗链也能标示出原始来源。
- 对于频繁访问的 IP 地址,可以采取限制请求频率的措施,防止攻击者大量盗链。
Nginx 防止网络盗链的方法一:验证Referer
1、Nginx Referer模块
nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求。当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。构造Referer的请求很容易实现,所以使用这个模块并不能100%的阻止这些请求。
2、valid_referers 指令
语法: valid_referers none | blocked | server_names | string … ;
配置段: server, location
指定合法的来源'referer', 他决定了内置变量$invalid_referer的值,如果referer头部包含在这个合法网址里面,这个变量被设置为0,否则设置为1. 需要注意的是:这里并不区分大小写的.
参数说明:
none:请求头缺少Referer字段,即空Referer
blocked:请求头Referer字段不为空(即存在Referer),但是值被代理或者防火墙删除了,这些值不以“http://”或“https://”开头,通俗点说就是允许“http://”或"https//"以外的请求。
server_names:Referer请求头白名单。
arbitrary string:任意字符串,定义服务器名称或可选的URI前缀,主机名可以使用*号开头或结尾,Referer字段中的服务器端口将被忽略掉。
regular expression:正则表达式,以“~”开头,在“http://”或"https://"之后的文本匹配。
Nginx提供了几种方法来防止盗链:
-
使用
valid_referers
指令来定义合法的引用来源。 -
使用
if
指令和return
指令来拒绝非法请求。
下面是一个简单的例子,展示了如何在Nginx配置中设置盗链防护:
server {
listen 80;
server_name example.com;
location /images/ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
root /path/to/your/images;
}
}
valid_referers
指令定义了哪些引用者是被允许的。none
和bloc用者是被允许的。
none和
blocked`是默认的合法引。
Nginx 防止网络盗链的方法二:限定User-Agent
Nginx 有许多内置变量,其中的 $http_user_agent 代表客户端浏览器的 UA ( User Agent) 信息。
Nginx 配置中可以通过检查 User-Agent
字段来阻止盗链。以下是一个简单的例子,展示了如何在 Nginx 配置中设置规则来阻止盗链。
server {
listen 80;
server_name example.com;
location / {
# 正常的配置 ...
# 拦截盗链并返回403禁止访问
if ($http_user_agent ~* (baidu|googlebot|bing|yandex)) {
return 403;
}
}
}
上面配置中,我们使用了正则表达式匹配 User-Agent
字符串中的搜索引擎名称。
如果 User-Agent
字段包含这些名称,则请求会被拦截并返回 HTTP 403 状态码。这是一个简单的防盗链示例,实际情况可能需要更复杂的规则来处理各种情况。
一些常用user_agent的匹配规则
nginx判断是否手机访问
if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle|MicroMessenger |iPad)" )
{
rewrite ^/(.*)$ https://要跳转的域名$uri redirect;
}
如果只想匹配手机 不想匹配平板
if ( $http_user_agent ~* "(Android.*Mobile|iPhone|Windows Phone|UC|Kindle|MicroMessenger)" )
如果只想匹配pc和mac
if ( $http_user_agent ~* "(Windows NT | Macintosh |Intel Mac OS.*)" )
User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
以下是一些常见的各种浏览器的User-Agent:
1) Chrome(谷歌)
Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1
Win10:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
Chrome 17.0 – MAC
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11
2) Firefox(火狐)
Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
Firefox 4.0.1 – MAC
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
3) Safari(Safari是苹果计算机的操作系统Mac OS中的浏览器)
safari 5.1 – MAC
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
safari 5.1 – Windows
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
4) Opera(欧朋浏览器可以在Windows、Mac和Linux三个操作系统平台上运行)
Opera 11.11 – MAC
User-Agent:Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11
Opera 11.11 – Windows
User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11
5) IE
IE 11
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
IE 9.0
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;
IE 8.0
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
IE 7.0
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
IE 6.0
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
WinXP+ie8:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)
WinXP+ie7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
WinXP+ie6:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
6) 傲游
傲游(Maxthon)
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)
7) 搜狗
搜狗浏览器 1.x
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)
8) 360
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)
9) QQ浏览器
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)
Nginx 防止网络盗链的方法三:加水印
Nginx官网:ngx_http_addition_module模块
ngx_http_addition_module
是一个过滤模块,它可以在回复正文前后加上内容。
这个模块默认不会编译进去,若要开启需加上编译选项:--with-http_addition_module
。
location / { add_before_body /before_action; add_after_body /after_action; }
语法: | add_before_body |
默认值: | — |
上下文: | location |
在回复正文之前加入一段文字,nginx会发起一个子请求去获取这些文字。
语法: | add_after_body |
默认值: | — |
上下文: | location |
在回复正文之后加入一段文字,nginx会发起一个子请求去获取这些文字。
语法: | addition_types |
默认值: | addition_types text/html; |
上下文: | http , server , location |
这个指令出现在版本 0.7.9.
指定生效的回复MIME类型,默认始终包含“text/html
”。 如果设置类型为“*
”,就会匹配任何类型的回复(0.8.29)。
要在Nginx中实现水印和盗链接的防护,你可以使用Nginx的模块,如ngx_http_addition_module模块来添加水印,以及ngx_http_referer_module模块来阻止盗链。
以下是一个简单的配置示例,它将添加一个水印图像,并阻止非正确Referer头的请求。
server {
listen 80;
server_name example.com;
# 正常的网站根目录
root /var/www/html;
# 添加水印图像
location / {
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'";
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Permissions-Policy "geolocation=(self), microphone=()";
# 添加水印,假设水印图像为 /watermark.png
# 确保你的图片格式支持透明度混合
add_header X-Watermark "url(http://example.com/watermark.png) bottom right no-repeat";
}
# 拦截盗链
location ~* \.(gif|jpg|jpeg|png)$ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
# 正常处理图片请求
}
}
在这个配置中,对于gif、jpg、jpeg和png等文件类型的请求,我们检查Referer头。如果Referer头不是none
(直接访问)、blocked
(有Referer但被阻止)或者*.example.com
(从允许的服务器名访问),则返回403状态码。
请注意,这只是一个简单的示例,你可能需要根据你的实际需求进行调整。例如,你可能需要更复杂的水印逻辑,或者针对不同文件类型的特定处理。此外,这个配置假设你已经有一个水印图像,并且你的服务器支持透明度混合的图片格式。
Nginx 防止网络盗链的方法四:ip白名单(geo)
Nginx官网:ngx_http_geoip_module 模块
GeoIP官网:https://www.maxmind.com/en/home
Nginx通过GeoIP模块获取IP所在地理位置 Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。
GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲、经纬度、国家、省市、ASN 等信息。 GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本,一个免费版(GeoLite2),一个收费版本(GeoIP2, 200$起步)。
收费版本的准确率稍高一些,更新频率为每周二更新一次, 免费版是每月第一个周二更新一次。
nginx默认不编译这个模块,需要开启--with-http_geoip_module
编译选项。
Nginx的Geo模块用于自动定义一个变量的值,该变量可以基于客户端IP地址的位置。
Geo模块可以用来进行一些特定的配置,比如基于用户的地理位置来分配不同的内容或配置。
以下是一个简单的例子,展示了如何使用Nginx的Geo模块和if指令来阻止盗链:
http {
geo $bad_referer {
default 0;
# 假设你要阻止的盗链来源有一个常见的反向代理IP
# 这里的IP地址应该替换为实际的盗链来源IP地址
10.0.0.1 1;
# 如果需要,可以添加更多的IP地址
}
server {
listen 80;
server_name example.com;
location / {
# 如果$bad_referer变量为1,说明访问来自于代理服务器
# 如果$http_referer不是从自己的服务器来,也可能是盗链
if ($bad_referer = 1) {
return 403;
}
# 如果referer头部不是从自己的服务器来,可以在这里处理
if ($http_referer !~* "^http://example.com/") {
return 403;
}
# 正常的处理逻辑
}
}
}
在这个配置中,我们定义了一个名为$bad_referer
的变量,然后在server
块中的location
块里使用了if
指令来判断是否要阻止请求。如果请求来自于列表中定义的代理服务器IP或者referer头部不是从自己的服务器来,就返回403状态码。这样可以在一定程度上阻止盗链。
请注意,这个配置只是一个基本的示例,实际使用时可能需要根据具体情况调整。例如,你可能需要根据实际情况调整$bad_referer变量的值,或者添加更多的if指令来满足特定的需求。
其他防盗链对比
建议:上面Nginx四种防盗链的方法,并不是只能单独配置一种,可以根据实际情况,同时配置这四种防盗链的方法,增加防盗链的复杂度。
方法1:使用valid_referers
指令
Nginx的valid_referers
指令允许您定义允许的引用来源,从而限制资源的访问。以下是一个示例配置:
代码语言:javascript
复制
server {
listen 80;
server_name yourwebsite.com;
location /images {
valid_referers none blocked yourwebsite.com;
if ($invalid_referer) {
return 403;
}
# 处理图片请求的配置
}
# 其他站点配置...
}
在这个配置中,我们设置了valid_referers
,指定了允许的引用来源。如果请求的引用来源不在允许的列表中,Nginx将返回403禁止访问的错误。
方法2:使用geo
模块
Nginx的geo
模块允许您基于客户端的IP地址进行访问控制。以下是一个示例配置:
代码语言:javascript
复制
http {
geo $allowed_ips {
default 0; # 默认情况下,禁止所有请求
192.168.1.0/24 1; # 允许的IP地址范围
10.0.0.0/8 1; # 更多允许的IP地址范围
# 可以添加更多的条件
}
}
server {
listen 80;
server_name yourwebsite.com;
location /protected {
if ($allowed_ips = 0) {
return 403;
}
# 处理受保护资源的配置
}
# 其他站点配置...
}
使用geo
模块,我们可以配置一个$allowed_ips
变量,用于存储允许的IP地址或其他条件。然后,在location
块中,我们使用if
指令检查这个变量。如果IP地址不在允许的列表中,Nginx将返回403错误。
方法3:使用Token或密钥
生成随机的令牌或密钥,并要求客户端在每个请求中包含有效的令牌或密钥。服务器验证这些令牌或密钥来确认请求的合法性。这种方法提供了更高的安全性,因为令牌或密钥不容易被伪造。
方法4:HTTP鉴权
使用HTTP鉴权机制(如基本认证)来要求客户端提供用户名和密码,以验证其对资源的访问权限。
方法5:使用CDN
使用内容分发网络(CDN)可以帮助防止盗链,因为CDN通常提供了一些防盗链功能,如设置白名单和黑名单。
方法6:加密和数字签名
对资源进行加密并使用数字签名来验证其完整性和合法性。这提供了最高级别的安全性,但也需要更复杂的实现。
方法7:防盗链工具
有一些专门的防盗链工具和服务可供使用,它们提供了各种防盗链保护选项,并使配置更加容易。
方法8:视频和图片加水印
Nginx实现:Nginx的ngx_http_addition_module模块来添加水印
应用程序实现:全站图片和视频都加上本站水印。
优缺点对比
以下是各种Nginx防盗链方法的优缺点对比:
方法 | 优点 | 缺点 |
---|---|---|
使用valid_referers指令 | - 简单易用- 不需要额外的计算资源 | - 依赖于请求中的Referer字段,不够安全- 不能提供更复杂的访问控制选项 |
使用geo模块 | - 允许基于客户端的IP地址进行访问控制,提供更高的安全性- 可以设置复杂的条件 | - 使用if指令可能会消耗一些额外的计算资源- 配置相对复杂,特别是对于大量IP地址 |
使用Token或密钥 | - 提供了高级的安全性,不容易被伪造- 灵活控制哪些客户端有权访问资源 | - 需要额外的逻辑来生成和验证令牌或密钥- 客户端需要在每个请求中包含令牌或密钥 |
HTTP鉴权 | - 提供了一定的安全性,要求客户端提供用户名和密码 | - 需要客户端提供用户名和密码,可能不太方便- 需要管理用户凭据,可能增加管理成本 |
使用CDN | - CDN通常提供了防盗链功能,易于配置- 全球分发能力 | - 需要额外的CDN成本- 不适用于不使用CDN的情况 |
加密和数字签名 | - 提供了最高级别的安全性,资源完全加密和签名 | - 配置和维护复杂- 可能会增加服务器负载 |
防盗链工具 | - 提供了各种防盗链保护选项,易于使用- 可能具有用户友好的界面 | - 部分防盗链工具可能需要付费- 可能涉及第三方服务的使用 |
图片/视频加水印 | 图片和视频都带有唯一标识 | 影响用户体验 |