浏览器输入URL后会发生什么

Reference

[1] http://weibo.com/p/1001603820890600125943

Overview

1. 客户端本地向DNS服务器请求把URL转换为IP地址
2. 从客户端到服务器IP建立一个TCP连接
3. 若需要加密,则需要SSL/TLS握手,其中涉及到CA
4. 由客户端向服务器发起HTTP请求
5. 服务器dump出内容,及HTTP response发送回客户端

Details

服务器
1. reverse proxy: 
  • act as load balancer; 
  • it will be placed to be closed to clients to reduce the latency
  • it will more I/O consuming, not CPU consuming
2. 前端服务器
  • 用来跑网页中的一小部分
  • 前面那层前端一般用来组合这些pagelets
  • 目的: 快!
3. 后端
  • 用户数据
  • 缓存,memcached, not persistent, fast!
4. CDN
  • 用来存储图片,视频等大量资源
  • 需要靠用户近,以此提速
  • 著名CDN:Akamai

反盗链 (Anti-Leech)

Reference
[1] Apache 防盗链(Apache Anti-Leech)技术的简单实现
[2]web网站防盗链技术_八种常见的防盗链方法总结

1. 判断引用地址

  • 使用 rewrite 技术实现 Apache 防盗链
  • 通过refer变量的值,判断图片或者资源是否合法
    • 缺点: refer可以被伪造

2. 使用cookie

  • 其实这种方法原理上跟方法2差不多。就是在显示“下载”链接的页面里产生一个动态值的cookie,然后在处理资源下载请求时先判断cookie里有没有正确的cookie,如果没有则返回错误提示信息。至于这个动态值如何产生,只要能逆向判断动态值是否合法的都可以,例如将当前的时间去除秒数取哈希值(也叫散列值)。如果网页程序是asp.net则更简单,可以往Session里随便存一个字符串或数字,然后在处理下载请求时先检查Session里是否存在这个字符串或数字。
    • 缺点
      • 无法使用下载工具

3. 使用动态文件名
  • 也叫动态钥匙法,当用户点击一个下载链接时,先在程序端计算一个Key(使用一定规律产生的Key,最好不要使用随机字符串例如GUID,并且这个Key必须有一定时效的),然后在数据库或Cache里记录这个Key以及它所对应的资源ID或文件名,最后让网页重定向一个新的URL地址,这个新URL地址里需要包含这个Key。当浏览器或下载工具发出下载请求时,程序先检测这个Key是否存在,如果存在则返回对应的资源数据。
  • 使用这个方法的好处是下载工具也可以下载,并且在Key失效前可以断点续传,并且可以通过Key来控制下载的线程数。
  • 使用这个方法(包括以上所有支持下载工具的方法)的缺点是:当任意一个用户下载成功之后,你的资源就会被一些下载工具列入“资源候选名单”,以后其他人在其他地方下载同样的文件时,下载工具会不断连接你的服务器,即使你的文件已经删除或者Key已经失效了,
    • 这样会造成类DDos攻击的后果,下面再介绍两个即可以让下载工具下载,又可以防止盗链的方法。

4. 擅改资源的内容

  • 一般热门的资源都是电影、mp3、较大的压缩包等,这些文件都是有很多可以插入数据的地方的,例如mp3有一个tag区,rar/zip有一个备注区,电影的内容随便一个地方,只要在下载过程当中,动态地往这些地方注入一些随机的字节(几个字节即可),就可以达到让整个文件的哈希值(即散列值、指纹值)发生改变,让从你网站下载的文件的哈希值跟别人的不一样,就可以防止下载工具主动找上门了。用这个方法配合方法6,可以达到较好的防盗链的效果。缺点是,虽然文件被修改的部分不会被“看”、“听”出来,不过多多少少让知道的人觉得不爽。另外就是如果别人把从你网站下载的文件放到其他网站,那么仍然存在下载工具主动找上门的情况(虽然实际上它下载不了内容)。