1

GET 与 POST比较

Posted by 撒得一地 on 2016年5月9日 in 杂谈

发起 HTTP 请求有四种基本方法:PUT、DELETE、POST 和 GET,通俗讲可以认为对应于增删改查四个方面。根据 HTTP 规范,GET 请求用于获取信息,是安全和幂等的,这里的安全并不代表不会泄露信息,而是说它用来获取信息,查询数据库,不会影响数据库的数据,也不会影响资源的状态;POST 请求则有可能会修改服务器上数据库的数据和资源的状态。

对于 <form></form> 标签,其 action 属性的默认值是 GET,可以修改为 POST。使用 GET 时,表单数据中的数据会被转义并以查询字符串的形式追加到 URL 的尾部;使用 POST 时,表单数据会依附请求体发送给服务器。

下面的表格从多方面比较了两者的差异:

维度 GET(HTTP) POST(HTTP)
历史记录 由于数据被添加到了 URL 中,所以会保留在浏览器的历史记录之中 数据不会保留在浏览器的历史记录之中
书签 可收藏为书签 不可收藏为书签
后退和重新提交 如果 HTML 被浏览器缓存了,则重新执行 GET 请求可能不会向服务器重新提交数据 浏览器应该提醒用户:数据需要重新提交
编码格式 “application/x-www-form-urlencoded” “multipart/form-data”(主要用于二进制数据)或 “application/x-www-form-urlencoded”
参数 长度受限于 URL 的长度,通常在 2K 以内,具体长度取决于浏览器和服务器 可发送参数,包括上传的文件等
是否可以修改 可被脚本修改 比较难修改
数据类型是否有限制 只接受 ASCII 字符,其他字符会被转义 无限制,可接收二进制数据
安全性 GET 相比于 POST 的安全性低,因为发送的数据在 URL 中可见,且可以被浏览器历史记录、服务器日志记录 POST 的参数不会被浏览器历史记录和服务器日记记录
数据长度限制 受限于 URL 的长度,通常小于 2K,具体限制取决于浏览器和服务器 无限制,实际上也受限于服务器,但相比 GET 要长很多
可用性 GET 请求不应该用于发送密码等私密信息 POST 请求可用于发送密码等私密信息
可见性 GET 请求对任何人都可见并且有长度限制 POST 请求的数据不会显示在 URL 中
缓存 可被缓存 不可被缓存

优点和缺点

当使用 GET 请求发送表单数据时:

  • 表单数据只能是 ASCII 字符,其他字符需要被转义为 ASCII 格式,但 POST 请求可以处理二进制数据、图片和其他文件
  • 所有的表单数据对于 URL 都是可见的,而且会被缓存在浏览器的历史记录中,降低了安全性
  • GET 请求的一个优势是表单数据可以被收藏为书签,也可以直接用于填充表单数据
  • 表单数据的长度会受到 URL 长度的限制
  • 易于遭受脚本攻击

服务器端

由于 GET 和 POST 对数据的编码方式不同,所以在服务端解码数据的方式也不同。在 ASP 中,服务端使用 Request.QueryString 获取 GET 请求参数,使用 Request.Form 获取 POST 请求参数。

HTTPS

使用 HTTPS 发起 GET 请求是否会更安全些呢?我们就做如下的请求来回答这一问题:

GET https://www.example.com/login.php?user=mickey&passwd=mini

假设有人监视了这一 GET 请求,那么他只会看到如下信息:

  • 这是一个 HTTPS 链接
  • 域名 www.example.com
  • 请求的长度
  • 响应的长度

URL 路径以及查询字符串都是不可见的。由此可见,在这些方面,GET 请求和 POST 请求的安全性相同。但是,浏览器仍然会记录 URL,所以无论是 HTTP 还是 HTTPS,使用 GET 发送敏感信息仍是不安全的。

原文:http://pinggod.com/2016/GET-vs-POST/

上一篇:

下一篇:

相关推荐

1 Comment

Comments are closed. Would you like to contact the author directly?
网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.