Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

前端之GET/POST #18

Open
jyzwf opened this issue Aug 2, 2017 · 0 comments
Open

前端之GET/POST #18

jyzwf opened this issue Aug 2, 2017 · 0 comments

Comments

@jyzwf
Copy link
Owner

jyzwf commented Aug 2, 2017

原文翻译于 GET vs. POST

HTTP POST 请求在消息正文中将客户端(浏览器)中的附加数据提供给的服务器。相反,GET 请求在 URL 中包含所有的请求数据。HTML中的表单均可以使用两者,只要在 <form> 标签里指明 method="POST" 或者 method="GET" (默认值) 即可。指定的方法决定了表单数据如何提交给服务器。当请求方法是 GET 时,所有表单数据将被编码到 URL 中,作为查询字符串参数附加到 action 的 URL`中。当使用 POST 时,表单数据出现在 HTTP 请求的消息体中。

下面是两个方法的比较:

GET POST
历史记录 参数保留在浏览器的历史记录中,因为他们是 URL 的一部分 参数不保留在 URL 中
书签 可以加为书签 不能加为书签
BACK按钮/重新提交行为(刷新) GET 请求将重新执行,但是不一定重新提交到服务器,如果HTML存在浏览器的缓存中 浏览器经常弹出一个警告框,告诉用户数据将被重新提交
编码类型 application/x-www-form-urlencoded multipart/form-data 或者 application/x-www-form-urlencoded。为二进制数据使用多重编码
参数 能被发送,但是参数的长度不能超过 URL 的最大长度,最安全的是使用不到 2K 的参数,一些服务器能达到 64K 能发送数据,包括文件给服务器
被攻击的可能性 很容易被黑客通过脚本攻击 比较难
数据类型的限制 只允许 ASCII 字符 没限制,二进制也可以
安全性 GET 的安全性比 POST 低,因为,被发送的数据是 URL 的一部分。所以它将以明文的形式保存在浏览器的历史记录和服务器日志中 POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
表单数据长度的限制 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(一个安全的URL 的最大长度是 2048 个字符)。不过因浏览器和 web 服务器会有些许区别 没限制
可用性 GET 方法不应该被使用当发送密码或者其他敏感数据的时候 POST 方法可以使用与发送密码或者敏感数据
可见性 数据在 URL 中对所有人都是可见的并且信息的长度被限制 数据不会显示在 URL 中
缓存 能被缓存 不能被缓存

内容上比较

1. 在表单提交中的不同

基本的不同是 它们对应于不同的HTTP请求,如HTTP规范中所定义一样。两者在提交的过程中都以相同的方式开始---- 一个 表单数据集由浏览器构建,然后以 enctype 属性指定的编码方式进行编码。对于 METHOD="POST" ,enctype 属性可以是 multipart/form-data 或者 application/x-www-form-urlencoded 。 而对于METHOD ="GET",只允许 application/x-www-form-urlencoded。然后将该表单数据集发送到服务器。

对于使用 GET 的提交,浏览器通过获取 action 属性的值来构造一个 URL ,添加一个 ?在 URL 后面,然后添加 表单数据集在问号后面。接着,浏览器处理这个 URL,就好像跟随一个链接(或者就像用户自己直接输入了 URL一样)。浏览器将 URL 划分为不同部分,并识别主机,然后向该主机发送一个 GET 请求,其余的 URL 作为参数。注意:此过程意味着表单数据仅限于 ASCII 代码。

POST 请求将使用 action属性值和根据 enctype 属性指定的内容类型来创建发送消息以发送 POST 请求

来个视频解解闷Differences Between Get and Post - Web Development

2. 服务器端处理的差异

由于数据以不同的方式编码,因此需要不同的解码机制。因此,一般来说,更改提交方法,可能需要更改处理提交的脚本。例如当使用 CGI 接口时,脚本会在使用 GET 时,在环境变量(QUERYSTRING)中接收数据,但是当使用POST时,表单数据在标准输入流(stdin)中传递,并且要读取的字节数由Content-length头指定。

3. 推荐使用

在提交 "幂等" 表单时,建议使用 GET --仅涉及数据库查询的表单。另外一个观点是,几个 幂等的查询和单个查询有着相同的效果。如果数据库更新,或者其他操作例如触发了电子邮件等,建议使用 POST

幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
  幂等有一下几种定义:
  对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a)=abs(abs(a))。
  对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。

来自 Dropbox developer blog:

浏览器不知道特定的 HTML 表单是什么,但是,如果表单通过 GET 发送,那么浏览器知道如果出现网络错误,可以重新尝试自动提交是安全的。而对于 POST 来说,重新提交可能不安全,所以浏览器会首先对用户进行确认。

GET 经常会缓存,而 POST 几乎不。对于查询系统来说,这可能产生相当大的效率影响,特别是如果查询字符串很简单,因为缓存可能会提供最常见的查询

在某些情况下,即使使用幂等查询也建议使用 POST:

  • 如果表单数据包含非 ASCII 字符
  • 表单数据很大
  • 安全性

4. HTTPS呢?

POST 提供更高的安全性吗?这是一个有趣的问题。我们来看看一个 GET 请求

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

设想你的网络连接被监视,那么请求的哪些信息将提供给窥探者呢?如果使用 POST ,并且用户和密码数据包含在 POST 的变量中,那么在HTTPS连接的情况下会更安全吗?

答案是 no ,如果你使用 GET 请求,只有以下信息才能被攻击者知道:

  1. 事实上你做了一个HTTPS连接
  2. 主机名 - www.example.com
  3. 请求的总长度
  4. 响应的总长度

URL的路径部分 -- 即请求的实际页面以及查询字符串 --- 是被保护的(加密的),而它们是 在线的,即在到达目的服务器的途中传输。POST 请求的情况也是完全一样

当然,web服务器往往会在访问日志中以纯文本的格式记录整个 URL;所以通过 GET 请求发送敏感信息也不是一个好主意。无论 HTTP 或 HTTPS 都适用

引用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant