欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

NGINX中浏览器的盗链与防止被盗的实现

2025年07月15日 Mysql
1、盗链的实现(本项目仅供参考,在局域网内实现,请遵守相关法律)1.1 准备操作我们需要两台主机,一台为ubuntu,作为偷盗机,一台centos作为被盗机,具体配置以及ip地址如下表:名称ip地址c

1、盗链的实现(本项目仅供参考,在局域网内实现,请遵守相关法律)

1.1 准备操作

我们需要两台主机,一台为ubuntu,作为偷盗机,一台centos作为被盗机,具体配置以及ip地址如下表:

名称ip地址cpu内存nginx安装方式
centos192.168.107.19022编译安装
ubuntu192.168.107.18022apt安装

1.2 nginx的安装

nginx的安装在此就不再赘述

见如下状态

#centos
[root@localhost ~]# systemctl start nginx.service 
[root@localhost ~]# systemctl status nginx.service 
● nginx.service - nginx - high performance web server
   loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   active: active (running) since 三 2025-05-07 19:40:01 cst; 24s ago
     docs: http://nginx.org/en/docs/
  process: 1958 execstart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf (code=exited, status=0/success)
 main pid: 1961 (nginx)
   cgroup: /system.slice/nginx.service
           ├─1961 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
           ├─1962 nginx: worker process
           └─1963 nginx: worker process

5月 07 19:40:01 localhost.localdomain systemd[1]: starting nginx - high performance web server...
5月 07 19:40:01 localhost.localdomain systemd[1]: started nginx - high performance web server.
[root@localhost ~]# 

#ubnutu
root@ubuntu:~# systemctl start nginx
root@ubuntu:~# systemctl status nginx
● nginx.service - a high performance web server and a reverse proxy server
     loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     active: active (running) since wed 2025-05-07 11:22:53 utc; 17min ago
       docs: man:nginx(8)
    process: 958 execstartpre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/success)
    process: 966 execstart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/success)
   main pid: 967 (nginx)
      tasks: 3 (limit: 4519)
     memory: 9.1m
        cpu: 158ms
     cgroup: /system.slice/nginx.service
             ├─967 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             ├─968 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             └─969 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

may 07 11:22:53 ubuntu systemd[1]: starting a high performance web server and a reverse proxy server...
may 07 11:22:53 ubuntu systemd[1]: started a high performance web server and a reverse proxy server.
root@ubuntu:~# 

1.3 实现盗链

ubuntu操作

root@ubuntu:~# cd /var/www/html/
root@ubuntu:/var/www/html# ls
index.html  index.html.bak
root@ubuntu:/var/www/html# vim index.html
root@ubuntu:/var/www/html# 
#index.html文件内容如下
<html>
<body>
<h1>this is ailun-yegeyu  </h1>
<img src="http://192.168.107.190/a.jpg"/>
</body>
</html>
~        

centos操作

[root@localhost data]# cd /apps/nginx/conf.d/
[root@localhost conf.d]# ls
ailun.conf
[root@localhost conf.d]# vim ailun.conf

主站点目录为根目录下的data文件夹

我们在站点目录下拖入一张a.jpg

[root@localhost ~]# cd /data/
[root@localhost data]# ls
a.jpg  index.html  main  test

网站测试
http://192.168.107.180/index.html

2、防盗链的实现

配置文件如下

server{
listen 80;
server_name www.ailun.com;
root /data/;

location ~* \.(jpg|gif|swf|png)$ {
         valid_referers none 192.168.107.190;
         if ( $invalid_referer ) {
           return  403;
           #rewrite ^/ http://192.168.107.190/error.png;
           }
        }


}

这段代码是 nginx 的配置文件片段,主要作用是配置一个虚拟主机,并且对特定类型的文件进行防盗链处理。下面是对代码各部分的详细解释:

1. 服务器监听配置

listen 80;
server_name www.ailun.com;
root /data/;
  • listen 80;:指定 nginx 监听 80 端口,这是 http 协议的默认端口。也就是说,当有客户端通过 80 端口发起 http 请求时,nginx 会对其进行处理。
  • server_name www.ailun.com;:定义了该虚拟主机的域名。当客户端访问 www.ailun.com 时,nginx 会使用这个配置块来处理请求。
  • root /data/;:设置该虚拟主机的根目录为 /data/。当客户端请求一个文件时,nginx 会在 /data/ 目录下查找对应的文件。

2. 特定文件类型的位置块配置

location ~* \.(jpg|gif|swf|png)$ {
  • location 是 nginx 中用于匹配请求 uri 的指令。
  • ~* 表示使用不区分大小写的正则表达式进行匹配。
  • \.(jpg|gif|swf|png)$ 是一个正则表达式,用于匹配以 .jpg.gif.swf.png 结尾的请求 uri。也就是说,当客户端请求这些类型的文件时,会进入这个 location 块进行处理。

3. 防盗链配置

valid_referers none 192.168.107.190;
  • valid_referers 指令用于指定合法的 referer 头部值。referer 头部会在浏览器请求资源时携带,用于表示请求是从哪个页面发起的。
  • none 表示允许没有 referer 头部的请求,也就是直接在浏览器地址栏输入资源链接的请求。
  • 192.168.107.190 表示允许从 ip 地址为 192.168.107.190 的页面发起的请求。

4. 非法引用处理

if ( $invalid_referer ) {
    return  403;
    #rewrite ^/ http://192.168.107.190/error.png;
}
  • $invalid_referer 是 nginx 的一个内置变量,如果请求的 referer 头部值不在 valid_referers 指定的列表中,这个变量的值为 1,否则为 0
  • if ( $invalid_referer ) 表示如果 referer 头部值不合法,则执行 if 块内的代码。
  • return 403; 表示返回 403 状态码,即禁止访问。客户端会收到一个“禁止访问”的错误页面。
  • #rewrite ^/ http://192.168.107.190/error.png; 这行代码被注释掉了。如果取消注释,当 referer 头部值不合法时,会将请求重定向到 http://192.168.107.190/error.png

3、验证

经过笔者的多次验证,我们在原先的浏览器上仍然可以访问到这张图片

我们只能将这种原因归结于浏览器的缓存问题

我们选择换几个浏览器测试

在另一台centos的火狐浏览器上

在windows10浏览器中

我们可以观察到页面已经变成了403,防盗链实验成功

到此这篇关于nginx中浏览器的盗链与防止被盗的实现的文章就介绍到这了,更多相关nginx 浏览器盗链与防止被盗内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!