HTTP方法的安全性和幂等性

原创 2017年10月13日 10:27:22

 

HTTP方法的安全性和幂等性

Http协议规定了不同方法的安全特性和幂等特性,作为服务提供者的服务器必需为客户端提供这些特性。安全性,仅指该方法的多次调用不会产生副作用,不涉及传统意义上的安全,这里的副作用是指资源状态。即,安全的方法不会修改资源状态,尽管多次调用的返回值可能不一样(被其他非安全方法修改过)。幂等性,是指该方法多次调用返回的效果(形式)一致,客户端可以重复调用并且期望同样的结果。幂等的含义类似于编程语言中的setter方法[1],一次调用和多次调用产生的效果是一致的,都是对一个变量进行赋值。安全性和幂等性含义有些接近,容易搞混。

HTTP方法的安全性和幂等性见下表:

方法名

安全性

幂等性

 

GET

请求指定的页面信息,并返回实体主体

HEAD

只请求页面的首部

OPTIONS

允许客户端查看服务器的性能

DELETE

请求服务器删除指定的页面

PUT

从客户端向服务器传送的数据取代指定的文档的内容

POST

请求服务器接受所指定的文档作为对所标识的URI的新的从属实体

 

1安全的意味着该操作用于获取信息而非修改信息。换句话说,请求一般不应产生副作用。

2幂等的意味着对同一 URL 的多个请求应该返回同样的结果。

DELETE方法的语义表示删除服务器上的一个资源,第一次删除成功后该资源就不存在了,资源状态改变了,所以DELETE方法不具备安全特性。然而HTTP协议规定DELETE方法是幂等的,每次删除该资源都要返回状态码200 OK,服务器端要实现幂等的DELETE方法,必须记录所有已删除资源的元数据(Metadata),否则,第二次删除后返回的响应码就会类似404 Not Found了。

可以认为安全的方法都是只读的方法(GET, HEAD, OPTIONS),不会改变资源状态,显然,这三个方法也是幂等的。

PUTPOST方法语义中都有修改资源状态的意思,因此都不是安全的。但是PUT方法是幂等的,POST方法不是幂等的,这么设计的理由是:

HTTP协议规定,POST方法修改资源状态时,URL指示的是该资源的父级资源,待修改资源的ID信息在请求体中携带[2]。而PUT方法修改资源状态时,URL直接指示待修改资源[2]。因此,同样是创建资源,重复提交POST请求可能产生两个不同的资源,而重复提交PUT请求只会对其URL中指定的资源起作用,也就是只会创建一个资源。

References:
[1] Subbu Allamaraju, 丁雪丰等译. RESTful Web Services Cookbook中文版. 电子工业出版社.
[2] Hypertext Transfer Protocol — HTTP/1.1. Method Definitions: POST [1]
[3] Hypertext Transfer Protocol — HTTP/1.1. Method Definitions: PUT [2]

–EOF–

HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。 比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解); 

在表单里使用”post””get”有什么区别 
FORM提交的时候,如果不指定Method,则默认为GET请 求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为 该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中; 
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。   

Form里面,可以使用post也可以使用get。它们都是method的合法取值。但是,postget方法在使用上至少有两点不同: 
1Get方法通过URL请求来传递用户的输入。Post方法通过另外的形式。 
2Get方式的提交你需要用Request.QueryString来取得变量的值,而Post方式提交时,你必须通过Request.Form来访问提交的内容。 

 

当服务器响应时,其状态行的信息为HTTP的版本号,状态码,及解释状态码的简单说明。现将5类状态码详细列出: 
① 客户方错误 
100  继续 
101  交换协议 
② 成功 
200  OK 
201  已创建 
202  接收 
203  非认证信息 
204  无内容 
205  重置内容 
206  部分内容 
③ 重定向 
300  多路选择 
301  永久转移 
302  暂时转移 
303  参见其它 
304  未修改(Not Modified) 
305  使用代理 
④ 客户方错误 
400  错误请求(Bad Request) 
401  未认证 
402  需要付费 
403  禁止(Forbidden) 
404  未找到(Not Found) 
405  方法不允许 
406  不接受 
407  需要代理认证 
408  请求超时 
409  冲突 
410  失败 
411  需要长度 
412  条件失败 
413  请求实体太大 
414  请求URI太长 
415  不支持媒体类型 
⑤ 服务器错误 
500  服务器内部错误 
501  未实现(Not Implemented) 
502  网关失败 
504  网关超时 
505 HTTP版本不支持 


文章参考:http://www.cnblogs.com/jinks/p/3511282.html

  http://ymiter.iteye.com/blog/1922464    

版权声明:本文为博主原创文章,未经博主允许不得转载。

http的安全方法和幂等性

理解HTTP幂等性 转自: 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的W...

转载--http的安全方法和幂等性

最近在研究http,看到http的安全方法和幂等性部分,不太明白,尤其是“post方法是非幂等的”不理解,进过查资料,找到以下两篇有价值的文章,特转过来! 理解HTTP幂等性 转自:http:...
  • cwscwj
  • cwscwj
  • 2014年08月13日 11:50
  • 423

http的安全方法和幂等性

Todd.log - a place to keep my thoughts on programming 理解HTTP幂等性 基于HTTP协议的Web API是时下最...

理解HTTP幂等性

  • 2015年07月06日 14:50
  • 99KB
  • 下载

HTTP幂等性概念和应用

http://coolshell.cn/articles/4787.html 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,...

Http的幂等性

理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web AP...

理解http幂等性

理解HTTP幂等性基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么W...

HTTP 幂等性(Idempotence)的概念和应用

原文出自酷壳:http://coolshell.cn/articles/4787.html 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级...

【技术晨读】HTTP幂等性

基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流...

javaweb中HTTP协议的幂等性

理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web ...
  • HCYUN
  • HCYUN
  • 2016年10月30日 16:33
  • 149
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTTP方法的安全性和幂等性
举报原因:
原因补充:

(最多只允许输入30个字)