盗链

      盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频、软件等),对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器——典型的白嫖
      譬如以前我们可以将自己的图片上传至微博,将微博作为图床使用,这就是一种盗链。

防盗链

      防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。
      如下图所示即为网易做的防盗链:
201005131273762387591.bmp

防盗链原理

      在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。
refer.jpg

防盗链配置

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

配置格式

语  法:valid_referers none | blocked | server_names | string ...;
默  认:——
上下文:server,location

      指定"Refer"字段值,这些值将导致$invalid_referer变量为空字符串。否则,变量将被设置为"1"。搜索匹配不区分大小写。
      参数如下所示:

  • none:请求标头中缺少"Referer"字段;
  • blocked:请求标头中存在"Referer"字段,但其值已被防火墙或代理服务器删除; 这些值是不以"http://"或"https://"开头的字符串;
    server_names:"Referer"请求标头字段包含服务器名称之一;
  • 任意字符串:定义服务器名称和可选的URI前缀。服务器名称的开头或结尾可以带有"*"。在检查过程中,"Referer"字段中的服务器端口将被忽略;
  • 正则表达式:第一个符号应为"~"。应该注意的是,表达式将与"http://"或"https://"之后的文本匹配。

示例

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    valid_referers none blocked 123.56.45.209;
    if ($invalid_referer){
        return 403;
    }
}

测试Html:

<h1>Refer Test</h1>
<img src="http://123.56.45.209/refer.jpg" alt="refer.jpg" />

before.jpg

配置防盗链后,图片无法展示了:

after.jpg

查看状态码:

after-resp.jpg

Last modification:December 22nd, 2020 at 03:35 pm
如果觉得我的文章对你有用,请随意赞赏