网站首页 > 精选教程 正文
很多站长都会遇到一个很头疼的问题,那就是自己网站的资源经常被盗用,有文字、图片、视频、和二进制或压缩文件,这些资源被盗用后除了导致网站流量丢失之外、还会带来一些经济上的损失。
除了相关法律,例如《中华人民共和国著作权法》可以使版权或著作权所有者通过法律途径来约束和限制一些未经授权非法使用网站多媒体资源,我们还可以通过一些技术手段来约束访问者,使其无法随意盗取相关资源,下面我们就介绍下网站常用的防盗措施和其优势和劣势。
1. User-agent 防盗
User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。不同的浏览器客户端都会携带自己的 user-agent,例如 Chrome 浏览器的 user-agent 是:
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
在比如 curl 命令去访问一个 url,其带的 user-agent 如下:
User-Agent: curl/7.54.0
亦或者使用一些编程语言的库,例如 Python 的 request 库,其 user-agent 为:
r.request.headers {'User-Agent': 'python-requests/2.18.4',……}
既然如此,我们可以限制一些 user-agent 的请求,以 nginx 为例,我们判断 httpuseragent 来禁止其访问资源。例如下面的,如果 user-agent 等于 Java|python-urllib 等就返回 403,从而来拒绝这些客户端访问资源。
if ($http_user_agent ~ "Mozilla/4.0$|Mozilla/5.0$|Java|ApacheBench|Python-urllib|^$") { return 403; }
但是这种办法并不能完全禁止掉一些请求,因为 user-agent 是客户定义的,以 curl 为例,如下所示。通过 -H 指定 user-agent 的请求头信息,如果对方恰好指定你的黑名单规则,则可以很轻松的绕过限制。
curl -H "User-Agent:xxxx"
2. referer 防盗链
Referer 首部包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。如下所示的 request headers 中,其 referer 为https://www.google.com/ 则说明其来源是谷歌。
:authority: developer.mozilla.org :method: GET :path: /zh-CN/docs/Web/HTTP/Headers/Referer :scheme: https accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9,en;q=0.8 cookie: dwf_sg_task_completion=False dnt: 1 referer: https://www.google.com/ upgrade-insecure-requests: 1 user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36
以 nginx 为例,我们可以对指定域名的 referer 进行限制:
if ($http_referer ~* www. xxx.com ) { return 403; }
但是这种办法也并不能完全禁止掉一些域名请求,因为 referer 客户也是可以自定义的。以 curl 为例,如下所示,通过 -H 指定 referer:XXXXX 的请求头信息,就可以很轻松的绕过限制。
curl -H "referer:http://www.baidu.com"
3. IP 防盗链
顾名思义,即对指定 IP 或 IP 段进行限制访问。例如一些爬虫经常频繁爬取网站资源,我们可以对其 IP 进行限制。
以 nginx 为例,nginx 的ngxhttpaccess_module 模块可以用来设置允许/禁止哪些IP或IP段访问:
allow 1.1.1.1/24 # 允许IP段访问deny all # 禁止所有 IP 访问
4. token 防盗链
上述的三种原生 HTTP 首部字段都能防止用户随意盗取资源,但是其劣势相当明显,比如都极容易被伪造。
以 nginx 为例安装secure_link模块,默认是没有安装的,要使用这个模块必须在编译时指定下列编译参数:
--with-http_secure_link_module
secure link 防盗链原理:
- 用户访问资源;
- 服务器根据secret密钥、过期时间、文件uri生成加密串;
- 将加密串与过期时间作为参数跟到文件下载地址的后面;
- nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串;
- 将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致403。
具体的配置和使用可以参考 https://nginx.org/en/docs/http/ngxhttpsecurelinkmodule.html。
当然除了这种方式,你也可以使用 nginx lua 来自行实现一些自定义的防盗链措施。
猜你喜欢
- 2024-09-24 面试收到offer 就靠它了 做运维可以检验自己 答案在整理中...
- 2024-09-24 分布式大全:反向代理/Redis/中间件/MySQL/消息,挑战阿里P7必备
- 2024-09-24 Nginx 配置的基本语法,以及防盗链配置
- 2024-09-24 SpringBoot集成FastDFS+Nginx整合基于Token的防盗链
- 2024-09-24 nginx会话保持与防盗链
- 2024-09-24 Nginx中简单有效的防盗链手段-referer模块
- 2024-09-24 nginx防盗链,nginx访问控制,nginx代理
- 2024-09-24 nginx——配置 Nginx 防盗链
- 2024-09-24 nginx——防盗链功能
- 2024-09-24 Nginx+keepalived 实现高可用,防盗链及动静分离配置详解
你 发表评论:
欢迎- 最近发表
-
- java 服务之间调用(rpc)(java实现服务器)
- Java机器学习库(Java ML)(二、聚类)
- 「Java库」如何使用优秀的加密库Jasypt来保护你的敏感信息?
- GitHub精选 | 轻量级Android和Java日志库
- Java面试官:MySQL binlog 有什么作用?主从延迟的了解么?
- Excel函数核武器库:50个高频场景公式——第二弹
- Excel函数核武器库:50个高频场景公式——第一弹
- Spring Cache高性能缓存库 - Caffeine简介
- Java通过Kafka Streams库来实现数据流处理
- 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)