×

防盗链

96
zhllsr
2016.05.09 18:21* 字数 777

  • 什么是盗链
    客户端向服务器请求资源时,为了减少网络带宽,提升响应时间,服务器一般不会一次将所有 资源完整地传回给客户端。比如在请求一个网页时,首先会传回该网页的文本内容,当客户端 浏览器在解析文本的过程中发现有图片存在时,会再次向服务器发起对该图片资源的请求,服 务器将存储的图片资源再发送给客户端。在这个过程中,如果该服务器上只包含了网页的文本 内容,并没有存储相关的图片资源,而是将图片资源链接到其他站点的服务器上,就形成了盗 链行为

  • referer
    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。通过该头域的值,我们可以检测到访问目标资源的源地址

  • 对象存储中防盗链

    • 对于私有的bucket,因为访问控制的原因,基本不存在大规模盗链的可能性,对于公开空间,因为没有访问权限控制,需要进行防盗链设置
  • 友商防盗链做法

    • 七牛
      七牛对于公开空间的防盗链做法主要是通过设置白名单、黑名单和空referer是否可以访问来实现的
      设置选项(白名单和黑名单不会同时生效)有:白名单、黑名单、关闭三个选项

      七牛防盗链.png

      七牛采用三个参数来实现防盗链:
      <RefererType>: 防盗链类型:黑名单(black)|白名单(white)
      <RefererValue>: 防盗链黑白名单列表:以逗号(,)分割
      <NullReferer>:是否允许空referer

    • AWS
      AWS也是通过bucket的访问控制来实现防盗链的
      AWS通过bucket Policy中的condition来先设置不同请求的权限

    上面的例子就是说,允许匹配的域名和ip拥有bucket:mybucket GetObject的权限


    AWS_bucket_policy.png
  • 初步设想

    • 采用类似七牛的方式设置白名单、黑名单来实现防盗链
    • 通过http请求中的referer确定请求的来源,如果http请求中没有referer为空,这里对于referer为空是否允许访问也可以设置
    • 在我们bucket访问控制中加入字段
      <referer类型>: 防盗链类型:白名单 | 黑名单 | 关闭
      <白名单列表> 域名(ip)匹配,以逗号隔开
      <黑名单列表> 域名(ip)匹配,以逗号隔开
      <NullRefere> 是否支持空referer
    • 第一个版本先不支持共同支持白名单和黑名单同时设置,这个接口要留下
日记本
Web note ad 1