nginx防盗链

sisophon 2019-10-04 PM 21℃ 0条

ngx_http_referer_module模块用于在“Referer”标题字段中阻止对具有无效值的请求访问站点。应该记住,制作具有适当“Referer”字段值的请求非常容易,因此本模块的预期目
的不是彻底屏蔽这些请求,而是阻止常规浏览器发送的大量请求。还应该考虑到即使对于有效请求,常规浏览器也不能发送“Referer”字段。

1.解释

备好虚拟机:

A站:test.cn
B站:www.typee.net
如果B站想使用A站上的一个图片,可以直接使用一段代码:

    <img src="http://test.cn/12.jpg" />

如果访问B站,显示图片会增加了A站网站流量,如果B站访问量大的话,将会消耗更多A站的流量,为了防止盗链,需要以下设置。

2.nginx配置防盗链

Referer是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含Referer 。

3.示例配置

      valid_referers none blocked server_names    *.example.com example.* www.example.org/galleries/     ~\.google\.;
      if ($invalid_referer) {
               return 403;
       }

4.指令

(1).referer_hash_bucket_size
介绍:设置有效查阅者散列表的存储桶大小。设置散列表的细节在单独的文档中提供。
句法:referer_hash_bucket_size size
默认:2048
语境:server location
(2)referer_hash_max_size
介绍:设置有效的引用器散列表的最大大小。 设置散列表的细节在单独的文档中提供。
句法:referer_hash_max_size size
语境:server location
(3)valid_referers
句法: valid_referers none | blocked | server_names | string ...;
语境:server location
参数:
none:请求标头中缺少"Referer"字段,也就是空Referer

blocked:"Referer"字段出现在请求标头中,但其值已被防火墙或代理服务器删除;这些值是不以"http://"或"https://"开头的字符串

server_names:允许某个域名通过如sisophon.cn

arbitrary string:定义服务器名称和可选的URI前缀。服务器名称的开头或结尾可以包含“*”。在检查期间,“Referer”字段中的服务器端口被忽略

regular expression:第一个符号应为“~”。应该注意的是,表达式将与“http://”或“https://”之后的文本匹配

栗子:

location ~ .*\.(jpg|gif|png)$ {
    valid_referers none blocked  test.cn *.test.cn;
    if ($invalid_referer) {
        return 403;
        #rewrite ^/ http://www.baidu.com/images/404.jpg
    }    
}

除了返回403数字等,也可以自己设置跳转的网址,就不要往自己站跳了,也可以配置目录规则,具体看自己的需求,当然
这种方式不是一劳永逸的,可以伪造referer进行操作破解,不是真正意义上的防盗。
可以这样写:

valid_referers   test.cn *.test.cn;

把其中的none blocked去掉,用地址访问图片的时候不会显示图片,右键保存下载图片的时候也不会生效。
修改完成之后执行测试和重载文件配置:

nginx -t
nginx -s reload

B站使用A站图片:
403.png
A站图片:
200.png

标签: PHP, NGINX

非特殊说明,本博所有文章均为博主原创。

评论啦~