使用GET
或POST
方法有什么区别?哪个更安全?他们每个人的(缺点)优点是什么?
(类似问题)
这不是安全问题。HTTP 协议将 GET 类型的请求定义为幂等,而 POST 可能有副作用。用简单的英语来说,这意味着 GET 用于查看某些内容,而不更改它,而 POST 用于更改某些内容。例如,搜索页面应使用 GET,而更改密码的表单应使用 POST。
另外,请注意 PHP 有点混淆了这些概念。POST 请求从查询字符串和请求正文中获取输入。GET 请求只是从查询字符串中获取输入。所以 POST 请求是 GET 请求的超集;您可以$_GET
在 POST 请求中使用,并且在其中包含具有相同名称的参数甚至可能是有意义的$_POST
,$_GET
这意味着不同的东西。
例如,假设您有一个用于编辑文章的表单。article-id 可能在查询字符串中(因此,可以通过 获得$_GET['id']
),但假设您要更改 article-id。然后新的 id 可能会出现在请求正文 ( $_POST['id']
) 中。好吧,也许这不是最好的例子,但我希望它能说明两者之间的区别。
当用户在表单中输入信息并单击提交时,可以通过两种方式将信息从浏览器发送到服务器:在 URL 中,或在 HTTP 请求的正文中。
前面示例中使用的 GET 方法将名称/值对附加到 URL。不幸的是,URL 的长度是有限的,所以这种方法只有在只有几个参数的情况下才有效。如果表单使用大量参数,或者如果参数包含大量数据,则 URL 可能会被截断。此外,在 URL 上传递的参数在浏览器的地址字段中可见,而不是显示密码的最佳位置。
GET 方法的替代方法是 POST 方法。此方法将名称/值对打包在 HTTP 请求的正文中,这使得 URL 更清晰,并且对表单输出没有大小限制。它也更安全。
最好的答案是第一个。
您正在使用:
使用GET
. 由于数据出现在 URL 字符串中,因此可能有人在地址栏/URL 上查看您的肩膀可能能够查看他们不应该知道的内容,例如可能被用来劫持您的会话的会话 cookie。请记住,每个人都有照相手机。
另一个安全隐患GET
与GET
作为请求 URL 的一部分记录到大多数 Web 服务器访问日志的变量有关。根据情况、监管环境和数据的一般敏感性,这可能会引起关注。
一些客户端/防火墙/IDS 系统可能会对GET
包含过多数据的请求不满意,因此可能会提供不可靠的结果。
POST
支持高级功能,例如支持用于将文件上传到 Web 服务器的多部分二进制输入。
POST
需要一个 content-length 标头,这可能会增加特定于应用程序的客户端实现的复杂性,因为必须提前知道提交的数据大小,从而防止客户端请求以独占的单通道增量模式形成。对于那些选择滥用HTTP
它作为 RPC(远程过程调用)传输的人来说,这可能是一个小问题。
其他人已经很好地涵盖了这个问题的语义差异和“何时”部分。
如果有大量数据或某种敏感信息(真正敏感的东西也需要安全连接),您应该使用 POST。
如果您希望人们能够为您的页面添加书签,请使用 GET,因为所有数据都包含在书签中。
请注意人们使用 GET 方法点击 REFRESH,因为每次都会再次发送数据而不会警告用户(POST 有时会警告用户重新发送数据)。
当我从URL 中检索信息时使用 GET,当我向URL发送信息时使用 POST 。
这个W3C 文档解释了 HTTP GET 和 POST 的使用。
我认为这是一个权威来源。
摘要是(文件的第 1.3 节):
- 如果交互更像是一个问题(即,它是一个安全操作,例如查询、读取操作或查找),则使用GET 。
- 在以下情况下使用POST:
- 交互更像是一个命令,或者
- 交互以用户感知的方式更改资源的状态(例如,订阅服务),或
- 用户应对交互结果负责。
Get 和 Post 方法与您使用的服务器技术无关,它在 php、asp.net 或 ruby 中的工作方式相同。GET 和 POST 是 HTTP 协议的一部分。正如标记所指出的,POST 更安全。POST 表单也不会被浏览器缓存。POST 也用于传输大量数据。
更改数据时使用 POST 的原因:
此外,不要将敏感信息放在查询字符串中(只有 GET 选项),因为它会显示在地址栏、书签和服务器日志中。
希望这可以解释为什么人们说 POST 是“安全的”。如果您要传输敏感数据,则必须使用 SSL。
GET
并且POST
是可以实现类似目标的 HTTP 方法
GET
基本上是为了获取(检索)数据,AGET
不应该有正文,所以除了 cookie 之外,传递信息的唯一地方是 URL 并且 URL 的长度有限,与发送的数据是一部分GET
相比不太安全POST
网址
GET
发送密码、信用卡或其他敏感信息时
切勿使用!,URL中的每个人都可以看到数据,可以缓存数据。GET
当我们重新加载或回调按钮时是无害的,它将被标记,参数保留在浏览器历史中,只允许ASCII字符。
POST
可能涉及任何事情,例如存储或更新数据、订购产品或发送电子邮件。POST
方法有一个主体。
POST
方法是安全的,可以将敏感和机密信息传递给服务器,它不会在 URL 的查询参数中可见,并且参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。POST
方法无法添加书签
这个问题和其他关于 SO的问题中的所有或大部分答案都与此相关GET
并且POST
被误导了。它们在技术上是正确的,并且正确地解释了标准,但在实践中却完全不同。让我解释:
GET
被认为是幂等的,但不是必须的。您可以将参数传递GET
给对数据进行永久更改的服务器脚本。相反,POST
被认为不是幂等的,但您可以POST
对一个脚本不做任何更改的服务器。所以这是一种错误的二分法,在实践中是不相关的。
此外,说GET
如果重新加载不会损害任何东西是错误的——当然,如果它调用的脚本和它传递的参数正在进行永久性更改(例如删除数据),它当然可以。也可以POST
!
现在,我们知道这POST
(到目前为止)更安全,因为它不会暴露正在传递的参数,也不会被缓存。另外,您可以传递更多数据,并GET
获得一个干净、不混淆的 URL。它做了所有GET
可以做的事情。所以它只是更好。至少在生产中。
所以在实践中,什么时候应该使用GET
vs. POST
?我GET
在开发过程中使用,所以我可以查看和调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我可以做到这一点,而无需构建表单并且不必修改它。我只需根据需要在浏览器中编辑 URL。
一旦开发完成,或者至少稳定,我将所有内容切换到POST
.
如果您能想到任何技术上的原因表明这是不正确的,我将非常乐意学习。
如果要从 URL 检索资源,请使用 GET 方法。如果您点击浏览器的后退按钮,您总是可以看到最后一页,并且它可能被加入书签,因此它不如 POST 方法安全。
如果您想向 URL “提交”某些内容,请使用 POST 方法。例如你想创建一个谷歌账户,你可能需要填写所有详细信息,然后你点击“提交”按钮(这里调用POST方法),一旦你提交成功,然后尝试点击浏览器的返回按钮,您将收到错误或新的空白表格,而不是填写表格的最后一页。
GET
方法:
它仅用于发送 256 个字符的日期
使用此方法时,可以在浏览器上看到信息
这是表单使用的默认方法
它没有那么安全。
POST
方法:
它用于发送无限数据。
使用这种方法,在浏览器上看不到信息
您可以明确提及该POST
方法
它比GET
方法更安全
它提供了更高级的功能