Nginx 防盗链

nginx防盗链问题

盗链:

就是a网站有一张照片,b网站引用了a网站的照片 。

防盗链:

a网站通过设置禁止b网站引用a网站的照片。

nginx防止网站资源被盗用模块

ngx_http_referer_module

如何区分哪些是不正常的用户?

HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.

比如在<www.google.com> 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com

防盗链配置要点

复制代码
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
# 日志格式添加"$http_referer"
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';
# valid_referers 使用方式                         
Syntax: 	valid_referers none | blocked | server_names | string ...;
Default: 	---
Context: server, location

盗链实验:

准备俩台服务器,a服务器用做网站正版发布照片,b服务器用作引用a服务器的图片信息的服务器。

a服务器IP:192.168.231.171

b服务器IP:192.168.231.173

在a服务器的配置文件内

复制代码
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 

server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
     index  1.jpg;
}
}
   

更改完配置文件 记得重启
[root@localhost ~]# nginx -s reload


#网站默认发布页面的路径
[root@localhost ~]# cd /usr/share/nginx/html/ 
[root@localhost html]# ls
1.jpg  50x.html  index.html

正常访问a网站

b服务器,配置nginx访问页面

复制代码
由于b服务器也是yum安装的nginx
因此b服务器的nginx默认发布页面路径在 /usr/local/nginx/html/下
[root@daili ~]# cd /usr/share/nginx/html/
[root@daili html]# ls
50x.html  index.html


vim index.html

<html>
<head>
    <meta charset="utf-8">     #用老做实验  红色的底
    <title>qf.com</title>
</head>
<body style="background-color:red;">
    <img src="http://192.168.231.171/1.jpg"/>    #盗用171IP的1.jpg这个图片
</body>
</html>

此时访问b网站,由于它盗用了a网站的图片,因此

观察a服务器的日志

这就做成了盗链实验

防盗链实验

实验机器

a服务器IP:192.168.231.174 真正提供照片的服务器

b服务器IP:192.168.231.173

1.防盗链的操作得在真正发布这张图片的服务器修改配置文件

复制代码
a服务器
 #vim /etc/nginx/conf.d/default.conf 

server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
     index  1.jpg;
valid_referers server_names  192.168.231.173;   
#server_names 只允许指定ip域名来访问资源

if ($invalid_referer) {
 return 502;     #其他ip或者域名来访问a服务器,返回502
}

}
}

重启服务
nginx -s reload

这样就相当于将173这个ip添加到白名单中,只有192.168.231.173可以访问a服务器的资源。

复制代码
通过百度来访问a服务器
[root@daili ~]# curl -e "www.baidu.com" -Ik 192.168.231.173
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 11:29:07 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive


#由于在a服务器的配置文件设置只能IP为192.168.231.173的来访问,因此其他ip来访问返回502

平时我们都是通过本机电脑的ip来访问b服务器,而curl -e "ip/域名" -Ik 要访问的ip

这条命令是我们通过此ip来访问另一个ip。

curl -e "www.baidu.com" -Ik 192.168.231.173

我们通过百度来访问173IP,相当于我们此时的电脑本机变成了百度。

相同的是,我们设置为只有百度可以访问a服务器,那么b服务器上的图片就会失真打不开

复制代码
a服务器
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf 

server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
     index  1.jpg;
valid_referers server_names  www.baidu.com;
if ($invalid_referer) {
 return 502;
}
}
}

重启服务
nginx -s reload

访问b服务器的网站

三个要素:

  • none : 允许没有http_refer的请求访问资源;

  • blocked : 允许不是http://开头的,不带协议的请求访问资源;

  • server_names : 只允许指定ip/域名来的请求访问资源(白名单);

加none

复制代码
真正有图片的a服务器
server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
    valid_referers none  192.168.231.173;
     index  1.jpg;
}
}

浏览查看a服务器的发布页面

查看日志

复制代码
tailf /var/log/nginx/access.log

通过百度来访问a服务器

复制代码
[root@localhost ~]# curl -e "www.baidu,com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:07:27 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

不加none

复制代码
a服务器的配置文件
/etc/nginx/conf.d/default.conf

server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
index  1.jpg;

valid_referers blocked   www.jd.com;
if ($invalid_referer) {
  return 502;
   }
}
}

访问a服务器的网站

因此

none只是决定能不能访问a服务器本身,加none可以访问a服务器本身,不加none不可以访问a服务器本身。

blocked

本身含义是允许开头不带http的访问成功,那就意味着 带http的访问不成功

复制代码
配置a服务器的配置文件
server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
index  1.jpg;

valid_referers blocked   192.168.231.174;
if ($invalid_referer) {
  return 502;
   }
}
}

访问www与http://www 后者就不可以访问

复制代码
[root@daili ~]# curl -e "http://www.jd.com"  -Ik 192.168.231.171
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 13:02:34 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive

[root@daili ~]# curl -e "www.jd.com"  -Ik 192.168.231.171
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 13:02:37 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

情况2 加*.jd.com

复制代码
server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
    valid_referers none blocked *.jd.com    ;
     index  1.jpg;
}
}

[root@daili ~]# curl -e "http://www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:31:52 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

[root@daili ~]# curl -e "www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:32:00 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

这里虽然配置文件里面写了blocked,但是白名单里面定义的是*.jd.com,因此他有俩个 一个是www开头,一个是http:// 因此访问http://jd.com 可以访问

复制代码
server {
    listen  80;
    server_name  localhost;
    location /{
    root  /usr/share/nginx/html;
    valid_referers none blocked www.jd.com    ;
     index  1.jpg;
}
}

[root@daili ~]# curl -e "www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:35:17 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

[root@daili ~]# curl -e "http://www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:35:19 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

这里尽管定义配置的是www.jd.com 按道理输入http://jd.com 是访问不了的,但是在配置文件里面location是在server下的,而server是在http下面的,因此输入http://jd.com 也是可以访问的。

相同那么加了blocked 由于 白名单里面没有baidu.com 因此 访问www.baidu.com可以访问,访问http://www.baidu.com 就不可以访问。

复制代码
[root@localhost conf.d]# curl -e "www.baidu.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:57:27 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes

[root@localhost conf.d]# curl -e "http://www.baidu.com" -Ik 192.168.231.174
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:57:32 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive
相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜5 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB6 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220708 天前
如何搭建本地yum源(上)
运维
ping某9 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8811 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql