阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx设置图片防盗链(白名单与黑名单)

257次阅读
没有评论

共计 1883 个字符,预计需要花费 5 分钟才能阅读完成。




某些时候可能您会发现,别人网站直接将您的网站图片拿过去使用,导致额外消耗服务器流量和带宽,如果本身服务器带宽和流量就比较小,被人盗链后势必会造成一定影响。这篇文章分享下如何通过 Nginx 来设置防盗链,禁止其它网站盗用图片。

防盗链原理

防盗链的原理其实很简单,目前比较流行的做法就是通过 Referer 来进行判断和限制,Referer 的解释说明如下:

HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。——引用自百度百科

简单来说,假如我博客域名是 xiaoz.me,我在 nginx 中设置,只允许 Referer 为*.xiaoz.me 的来源请求图片,其它网站来的一律禁止。这里我们需要用到 ngx_http_referer_module 模块和 $invalid_referer 变量,请看下面进一步解释。

ngx_http_referer_module 模块

ngx_http_referer_module模块用于阻止对“Referer”头字段中具有无效值的请求访问站点。应该记住,使用适当的“Referer”字段值来构造请求非常容易,因此本模块的预期目的不是要彻底阻止此类请求,而是阻止常规浏览器发送的请求的大量流量。还应该考虑到,即使对于有效请求,常规浏览器也可能不发送“Referer”字段。

  • 语法:valid_referers none | blocked | server_names | string …;
  • 可用于:server,location

可以看到 valid_referers 指令中存在一些参数,比如 none|blocked,含义如下:

  • none:请求标头中缺少“Referer”字段,也就是说 Referer 为空,浏览器直接访问的时候 Referer 一般为空。
  • blocked:Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除; 这些值是不以“http://”或“https://”开头的字符串;
  • server_names:服务器名称,也就是域名列表。

$invalid_referer 变量

我们设置 valid_referers 指令后,会将其结果传递给一个变量$invalid_referer,其值为 0 或 1,可以使用这个指令来实现防盗链功能,如果 valid_referers 列表中没有包含 Referer 头的值,$invalid_referer 将被设置为 1。

设置防盗链白名单

白名单就是只允许白名单内的域名访问,其余一律禁止。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ {
    valid_referers none blocked *.xiaoz.me *.xiaoz.top;
    if ($invalid_referer) {return 403;}
}

上面的配置含义是先用 location 匹配出需要的格式(图片和视频),然后用 valid_referers 指令设置允许的域名,其它域名没有包含在 valid_referers 列表中,$invalid_referer 变量返回的值为 1,最终返回 403,禁止访问。以上就是防盗链白名单的设置。

防盗链黑名单

黑名单与白名单正好相反,就是只禁止黑名单中的域名请求,其余一律放行,相比白名单,黑名单的限制更加宽松。网上大部分教程只提到了防盗链白名单的设置,了解原理后黑名单的设置方法也差不多。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico|webp)$ {
    valid_referers *.baidu.com;
    if ($invalid_referer = 0) {return 403;}
}

上面的配置中我们用 valid_referers 指令设置黑名单域名 *.baidu.com,获取到指定的 Referer 头之后,$invalid_referer 返回值为 0,最终返回 403,禁止百度的域名来访问。

总结

以上就是 Nginx 防盗链(黑白名单)的设置,了解原理后其实非常简单,但由于 Referer 可以任意伪造,上述方法无法拦截伪造的 Referer 请求,不过大部分常见的场景还是有作用的。如果您服务器带宽和流量本身就比较小,建议加上防盗链设置。

如果您有兴趣,还可以了解我的另一篇文章《Nginx 常用屏蔽规则,让网站更安全

此文部分内容参考了:

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计1883字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中