update 2016-11-10

  • post2次tcp请求, get一次tcp请求*

复习功课

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。

URL全称是资源描述符,一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

问题来了

1、为什么是一般用于, 比如我全站都是GET或POST来处理,也能正常跑起来啊?

2、目前对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE?

3、为什么我要用多种,增加程序猿沟通交流成本,如果全站是POST那多好?

分析

GET - 从指定的资源请求数据 POST - 向指定的资源提交要被处理的数据

GET 方法的查询字符串是在 GET 请求的 URL 中发送的,常见的场景是地址栏请求和超链接。

Get请求常见于如下场景中

  • 浏览器地址栏中可见,会被别人看到
  • 浏览器历史记录
  • 被云加速的cdn服务商收集,proxy
  • 被运营商或网络设备收集重放
  • 在不安全的网络环境中被网络嗅探
  • 用户的收藏夹
  • http的header的referrer字段中
  • web服务器日志、应用日志
  • 被搜索引擎爬到,或者被客户端软件不规范收集
  • 被用户邮件或微信分享出去
  • 各种可能的地方,甚至山岗上田野上(一个黑客盗取了你的get请求后,路过一个山岗时,被大灰狼吃掉了,U盘掉在了山岗上)

Get请求的风险

根据HTTP规范,GET用于信息获取,是安全的和幂等的。安全的意思是get请求不会让服务端的资源或状态改变。幂等的意思是无论请求多少次,返回的结果都一样,都不会对服务端资源有任何副作用。

所以从被设计和现实中被使用的场景来看,get请求有如下特性

  • 因为是获取资源的请求,所以会在客户端、缓存端和服务器端等地方到处出现,容易泄露被第三方获得

  • 因为是安全和幂等的,所以各环节重放get请求时不用顾忌,不用提示用户。重放post有时浏览器会提示用户是否确定要重新发送数据 所以get请求的使用应该遵循

  • 不应有增删改的操作
  • 不应包含敏感信息

当你的实现不符合别人对你的预期,就可能产生漏洞,如

  • 隐私泄露
  • 敏感信息泄露
  • 被csrf漏洞利用
  • 认证信息,账号被盗

若你非要用get实现增删改

会被重放,导致服务端资源状态发生改变

  • 浏览器的重新打开可能会重放请求,而不会提示用户
  • 爬虫或安全扫描会重放你的请求
  • 获取到你get请求的各种势力可能会重放此请求,如安全厂商,搜索引擎,神秘力量(除了山岗上那个黑客,因为他已经被大灰狼吃掉了)

get操作的csrf防护很难实施,因为get没有防伪造的需求,它的场景不一定配合你的防护。referrer信任可能被利用,token可能被偷。举个例子,一个塑料盒子,它本就不是被设计用来存钱的,你若非要用它存钱,并还要加上一把锁,效果肯定不会好

见下面例子:

  • 网站允许用户发表第三方链接、图片等,那么用户构造的csrf请求的referrer是可信域的url,可以绕过referrer的防护
  • 存在js端的跳转漏洞跳到第三方,同理可以绕过referrer
  • Get请求中防护的token容易被偷,原理同上,后面的章节会细讲

常见的场景:一些使用了mvc框架的程序,直接用urlrewrite后的url来实现了增删改等操作

摘抄了一些内容摘抄了一些内容

总结

遵守HTTP准则,更利于网站健康

要做好通行证的防护,请看下面文章http://drops.wooyun.org/web/12695