GET 与 POST比较
发起 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
get一般不安全,都是post