一,为什么要做防盗链?

1,什么是盗链?

比如某人有一个A网站,

他不愿自己存储图片,(因为磁盘和带宽都有成本)

就在自己A网站的页面上直接插入B网站的图片,

从而为自己吸引流量,这就是盗链

2,为什么需要防盗链?

盗链静态文件会浪费网站的带宽及服务器的计算能力

这些都是网站运行的成本,

而且会影响网站合法用户的正常访问体验

所以我们要禁止盗链网站的图片和视频等静态文件

3,防盗链的原理:

根据请求头中referer属性得到网页来源,从而实现访问控制。

禁止非法使用本站的图片。

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: [email protected]

二,防盗链的例子

1,盗链的效果

假设盗链的网站是:www.lhdtest.com,被盗链的图片来自file.laoliu.net

它的index.html页面内容:

<html>
<head>
<title>
invalid images
</title>
</head>
<body>
welcome to www.lhdtest.com<br/>
<img src="http://file.laoliu.net/image/mid/1/348_8d72a999aa1d5800.gif" style="width:260px;" />
</body>
</html>

效果图:

nginx安全:配置网站图片防盗链-LMLPHP

2,防盗链的配置

我们在file.laoliu.net的虚拟主机上添加配置:

    location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
valid_referers none blocked *.laoliu.net;
if ($invalid_referer){
return 403;
}
expires 30d;
}

各项指令的说明:

valid_referers: 用来定义合法访问的一个白名单

none:            通过浏览器直接打开图片的url,这种情况没有referer,

通常我们允许这种访问

blocked:        referer不为空,但它的内容被防火墙或者代理服务器删除掉了

这种访问也可以允许

*.laoliu.net:   这个是被允许的域名,可以使用通配符

$invalid_referer:    是一个变量,用来判断valid_referers的结果是否非法

return 403:          返回403,403是HTTP 403 Forbidden的状态码,表示禁止访问

重启nginx生效后我们查看效果

nginx安全:配置网站图片防盗链-LMLPHP

说明:*.laoliu.net 这个域下面的页面仍然可以正常访问这些图片,

在浏览器地址栏直接输入地址也可以访问

3,遇到盗链时也可以跳转到一个提示当前被盗链的图片

例:

    location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
valid_referers none blocked *.laoliu.net;
if ($invalid_referer){
rewrite ^/ http://img4.sycdn.imooc.com/5eaa360d00017ef904930247.jpg;
}
expires 30d;
}

查看效果:

nginx安全:配置网站图片防盗链-LMLPHP

三,仅判断referer并不可靠

因为referer是可以伪造的,所以这里的防盗链还不是百分百的安全,

更严格的需求可以用nginx的第三方模块http_accesskey_module模块或lua脚本实现

四,查看nginx的版本

[root@centos8 conf.d]# /usr/local/soft/nginx-1.18.0/sbin/nginx -v
nginx version: nginx/1.18.0
05-11 13:24