使用虚拟URI+域名秘匙技术进行防盗链

  目前互联网上被广泛采用的防盗链技术有三类:

  1.  判断访问请求的 Referer 是否合法
    该技术防盗链效果比较差,下载软件很容易通过伪造 Referer 突破防线。并且不适合授权多个请求来源,比如 Yo2 上的绑定域名用户 a.com ,页面上包含了 image-001.yo2cdn.com/a.jpg ,而验证 Referer 的关键就是要知道 a.com 是可正常获取内容的域名,但 Yo2 上绑定的域名非常多哦,不可能把它们都写到 Referer 的配置列表上吧 :)
  2. 使用 Cookie 或 session 验证
    该技术的防盗链效果非常好,目前 Blogbus 就是采用该技术。但难以给外界网站设置访问授权,比如需要允许来自 FeedSky 页面可以显示图片,我们就需要 FeedSky 的页面可以在客户浏览器给 blogbus.com 域名下添加验证 cookie ,并且 feedsky.com 是无法跨域名写入 blogbus.com 的 cookie 哦,这个很重要。目前 Blogbus 是给 feedsky 提供 feedsky.blogbus.com 来实现验证 cookie 的。但如果要给多个网站提供访问授权,会很累哈 :)
  3. 使用访问记录数据库验证
    该技术实现防盗链效果最好,也是无法破解的。用户访问一个网页页面,就会记录在一个数据库中,当访问页面上的附件时(如图片),服务器会判断 Referer 地址是否在访问记录的数据库里,如果没有对应的访问记录,就会返回错误的页面了。当然还可以添加 cookie 进一步阻挡非法的请求。但该技术只适合一个网站使用,很难给外界网站进行访问授权。并且还要维护一个庞大的访问记录表,不适合大型网站使用。

综上所述,未找到适合 Yo2 使用的技术,所以我在第一种技术方式的基础上进行加强,实现虚拟URI+域名秘匙的防盗链技术。详细描述如下:

  目前我们的页面 http://oneoo.com/ 上包含一个图片 http://image-001.yo2cdn.com/picture.png。我们在页面的输出过程中加入过滤器,过滤器根据页面所在域名 oneoo.com 生成域名秘匙: ocm (生成秘匙的规则请自行定义),并把 http://image-001.yo2cdn.com/picture.png 替换为 http://image-001.yo2cdn.com/ocm/picture.png,这样服务器上收到图片访问的请求时,就会根据 Referer 的域名生成一个 Key,并把这个 Key 与访问 URI 上的域名秘匙进行对比,就可以起到防盗链的作用。当然我们还可以给 feedsky.com 等网站进行授权,下载软件使用图片所在域名作为 Referer 也是无法突破的,并且域名秘匙是经过加密的,也不能轻易伪造出来。

  我们的服务器端 yo2cache 在做防盗链判断后,会对合法的访问请求进行 uri 改写 ,http://image-001.yo2cdn.com/ocm/picture.png 自动改回真实地址 http://image-001.yo2cdn.com/picture.png,返回正确的内容。

  该防盗链技术适合有能力改造或自行编写 web server 的网站使用,效果不错 :)