HTTP-Get和HTTP-POST之间有什么区别?为什么HTTP-POST在安全性方面较弱

时间:2010-01-17 11:55:29

标签: rest

任何人都可以解释HTTP-GET和HTTP-POST之间的区别吗?为什么人们说HTTP-POST在安全性方面较弱?

5 个答案:

答案 0 :(得分:71)

在HTTP GET请求中,键/值对在URL中指定:

http://server/something?value1=foo&value2=bar

在HTTP POST请求中,键/值对作为标头之后的HTTP请求的一部分发送。例如:

 POST /something HTTP/1.1
 Host: server
 Content-Length: 21
 Content-Type: application/x-www-form-urlencoded

 value1=foo&value2=bar

很难真正描述一个比另一个更安全或更不安全,但HTTP POST数据在URL中不可见,并且在向网站提交数据时,HTTP POST通常只能由于用户交互(例如点击“提交”按钮)。

这意味着用户不能被诱骗访问http://server/update_profile?name=I_suck之类的网址,并且敏感数据不会在网址中公开。

您还可以使用nonces和其他带有html表单的防伪令牌(使用POST)来阻止其他形式的跨站请求伪造。

通常,POST应该用于可能修改服务器状态的请求,而GET应该用于只读操作。

答案 1 :(得分:61)

HTTP specification根据其意图区分POST和GET:

GET是幂等的:它用于获取资源,而无需更改服务器上的任何内容。因此,重新提交GET请求应该是完全安全的。

POST不是:它用于更新服务器上的信息。因此,不能假设重新提交请求是安全的,这就是大多数浏览器在POST请求时点击刷新时要求确认的原因。

在安全性方面,没有区别。 POST可能更加模糊,但这是一个非常不同的事情。需要在另一层添加安全性,例如SSL。

答案 2 :(得分:31)

关于GET请求的一些注意事项:

  1. 可以缓存GET请求
  2. GET请求保留在浏览器历史记录中
  3. GET请求可以加入书签
  4. 处理敏感数据时绝不应使用GET请求
  5. GET请求有长度限制
  6. GET请求只应用于检索数据
  7. 有关POST请求的一些注意事项:

    1. POST请求永远不会被缓存
    2. POST请求不会保留在浏览器历史记录中
    3. POST请求无法加入书签
    4. POST请求对数据长度没有限制
    5. (来源:W3学校)

答案 3 :(得分:16)

我不会比GET更安全地调用POST。不可否认,当使用GET时,参数显示为URL的一部分,因此任何敏感数据都将立即对用户可见。但是,查看甚至更改HTTP请求的任何部分都是微不足道的,因此,仅仅因为POST不通过URL传递数据,它仍然可以轻松读取。除非您使用HTTPS,否则GET和POST都会以易于访问的形式传输数据。

答案 4 :(得分:9)

GET method仅用于数据检索和should not have any side-effects。但是POST是出于特定目的:改变服务器端的数据。

只需在页面上放置一个图像就可以很容易地获得GET请求(参见Cross-Site Request Forgery),同时伪造POST请求并不容易(这也是您应该只允许授权的POST请求的原因)。 / p>