什么时候应该使用GET或POST方法?它们之间有什么区别?


249

使用GETPOST方法有什么区别?哪一个更安全?它们各自的(缺点)优点是什么?

类似的问题


2
Get没有主体,因此在实践中,由于缺少用于更复杂结构的任何查询字符串编码格式,因此实际上您只能将名称->值对用作数据结构。如果您需要在请求中处理更复杂的数据结构(即数组,对象等),则需要使用POST以及也许更高级的格式(json / xml)。简短地说:除非确实需要,否则不要使用GET(即URL /资源必须是可发现的)。
themihai

Answers:


263

这不是安全问题。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'])。好的,也许这不是最好的例子,但我希望它能说明两者之间的区别。


13
GET和POST之间的区别肯定存在安全性方面。例如,恶意网站可以在图像标签中粘贴任意GET请求,从而导致用户针对另一台服务器执行GET操作。如果此GET类似于otherserver / deletemyaccount,则会发生不良情况。
Frank Schwieterman

2
我的意思是$ _POST的内容并未从恶意用户那里神奇地隐藏起来。所有事物编程显然都涉及安全方面。
troelskn

1
这篇文章没有完全回答这个问题,因为他没有提到安全隐患。只要拼写错误“ pain english”更改为“ plain english”,顶部就可以了。底部太难理解了。总体而言,比我的帖子要好得多。:-)
Akrikos,2009年

1
“ POST请求从查询字符串并通过请求正文获取输入。” 恕我直言,这是不正确的。要使用这两个输入,您需要使用$ _REQUEST。$ _POST没有获得url条目。
Gunnar Bernstein 2014年

1
@Frank Schwieterman我知道这条帖子很旧,但是删除我的帐户不是幂等的,不应该使用get。
2014年

76

当用户以表格形式输入信息并单击Submit时,可以通过两种方式将信息从浏览器发送到服务器:URL中或HTTP请求正文中。

在前面的示例中使用的GET方法将名称/值对附加到URL。不幸的是,URL的长度是有限的,因此该方法仅在参数很少的情况下才有效。如果表单使用大量参数,或者参数包含大量数据,则URL可能会被截断。另外,URL上传递的参数在浏览器的地址字段中可见,而不是显示密码的最佳位置。

GET方法的替代方法是POST方法。此方法将名称/值对打包在HTTP请求的正文中,这使URL更加整洁,并且对表单输出没有大小限制。它也更安全。


1
如何更“安全”?
朱利安·雷施克

4
因为它更难改变?您可以在地址栏中更改GET,但使用POST则不那么容易。
IAdapter

8
服务器无法信任客户端。围绕错误的假设来设计应用程序远非安全。
troelskn

openid也不能保存,因为它可以被破坏吗?
IAdapter

1
我相信这是最清晰的解释-发送数据的位置有所不同。谢谢。
greenoldman 2011年

37

最好的答案是第一个。

您正在使用:

  • GET当你想获取数据(GET DATA)。
  • POST当您要发送数据(POST数据)。

2
您使用的是什么请求/响应服务模式?;)在需要回复的大多数情况下,我更喜欢使用POST。
德米特里·巴甫洛夫

8
通常这是对的。GET也完全能够“发送”数据,因此答案不是很准确。
Patrick Hofman 2015年

23

使用有两个常见的“安全性”含义GET。由于数据出现在URL字符串中,因此可能有人在您的地址栏/ URL旁望着您,可能会看到他们不应该看到的内容,例如可能会用于劫持您会话的会话cookie。请记住,每个人都有照相手机。

另一个安全隐患GET与将GET变量记录到大多数Web服务器访问日志中作为请求URL的一部分有关。根据情况,法规环境和数据的总体敏感性,这可能会引起关注。

某些客户端/防火墙/ IDS系统可能不赞成GET包含过多数据的请求,因此可能会提供不可靠的结果。

POST 支持高级功能,例如支持用于文件上传到Web服务器的多部分二进制输入。

POST需要一个内容长度报头,这可能会增加专用客户端实现的复杂性,因为必须提前知道提交的数据大小,以防止客户端请求仅以单遍递增方式形成。对于那些选择HTTP通过将其用作RPC(远程过程调用)传输来滥用的人来说,这可能是个小问题。

其他人已经在涵盖语义差异和该问题的“何时”部分方面做得很好。


17

URL 检索信息时,我使用GET; URL 发送信息时,我使用POST 。


1
但您也可以使用GET发送。区别在于格式(在URL(GET)或在请求(POST)中)。
eric

如果端点接受文件并从文件返回一行(不涉及数据创建,更改或数据库),那么端点应该是GET还是POST?
变量

16

如果有大量数据或一些敏感信息(真正敏感的东西也需要安全连接),则应使用POST。

如果您希望人们能够为您的页面添加书签,请使用GET,因为所有数据都包含在书签中。

只是要小心人们使用GET方法击中REFRESH,因为数据每次都会再次发送而不会警告用户(POST有时会警告用户有关重新发送数据)。


如果端点接受文件并从文件返回一行(不涉及数据创建,更改或数据库),那么端点应该是GET还是POST?
变量

@变量POST。在这种情况下,主要是因为POST是为处理文件上传而构建的,而标准GET不是。您每次页面加载时都必须发送文件,因此仅使用标准POST而不是GET + file是有道理的,这将破坏GET的期望,即URL每次应大致相同的结果。
格兰特(Grant)

14

W3C文档介绍了HTTP GET和POST的用法。

我认为这是权威资料。

摘要是(文档的第1.3节):

  • 如果交互更像一个问题(即,它是一种安全的操作,例如查询,读取操作或查找),请使用GET
  • 在以下情况下使用POST
    • 互动更像是订单,或者
    • 交互以用户会感知的方式(例如,对服务的订阅)更改资源状态,或者
    • 使用户对交互结果负责。

9
我认为可以将其进一步概括为:在服务器状态未更改时为GET,在服务器状态未更改时为POST。
Yamcha

10

Get和Post方法与您使用的服务器技术无关,它在php,asp.net或ruby中的工作原理相同。GET和POST是HTTP协议的一部分。如标记所示,POST更安全。浏览器也不缓存POST表单。POST也用于传输大量数据。


8

更改数据时使用POST的原因:

  • 诸如Google Web Accelerator之类的Web加速器将单击页面上的所有(GET)链接并将其缓存。如果链接更改了内容,这将非常糟糕。
  • 浏览器会缓存GET请求,因此即使用户单击链接,它也可能不会向服务器发送请求以执行更改。
  • 为了保护您的站点/应用程序免受CSRF的侵害,您必须使用POST。为了完全保护您的应用程序,您还必须在服务器上生成一个唯一标识符,并将其随请求一起发送。

另外,不要在查询字符串中放入敏感信息(只有GET选项),因为它会显示在地址栏,书签和服务器日志中。

希望这可以解释为什么人们说POST是“安全的”。如果要传输敏感数据,则必须使用SSL。


8

GETPOST在HTTP方法,其可以实现类似的目标

GET基本上只用于获取(检索)数据,A GET不应该有主体,因此,除了cookie之外,传递信息的唯一位置是URL,URL的长度受到限制,GET与之相比,安全性较低,POST因为发送的数据是其中的一部分网址

GET发送密码,信用卡或其他敏感信息时切勿使用!,URL中的每个人都可以看到数据,可以缓存数据。 GET在重新加载或调用返回按钮时是无害的,它将被标记为书签,参数保留在浏览器历史记录中,仅允许使用ASCII字符。

POST可能涉及任何内容,例如存储或更新数据,订购产品或发送电子邮件。POST方法有一个身体。

POST该方法已经过安全保护,可以将敏感和机密信息传递给服务器,该方法在URL的查询参数中将不可见,并且参数也不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载时,浏览器应警告用户数据将要重新提交。POST方法无法收藏


3
  1. GET方法用于发送不太敏感的数据,而POST方法用于发送敏感的数据。
  2. 与GET方法相比,使用POST方法可以发送大量数据。
  3. GET方法发送的数据在浏览器标题栏中可见,而POST方法发送的数据不可见。

0

如果要从URL检索资源,请使用GET方法。如果您单击浏览器的后退按钮,则始终可以看到最后一页,并且可以将其标记为书签,因此它不如POST方法安全。

如果要向URL“提交”某些内容,请使用POST方法。例如,您要创建一个Google帐户,可能需要填写所有详细信息,然后单击“提交”按钮(此处称为POST方法),一旦提交成功,然后尝试单击浏览器的后退按钮,则会出现错误或新的空白表格,而不是最后一页填写的表格。


-10

GET方法:

  • 仅用于发送256个字符的日期

  • 使用此方法时,可以在浏览器中看到信息

  • 这是表单使用的默认方法

  • 它不是那么安全。


POST方法:

  • 它用于发送无限数据。

  • 使用此方法,无法在浏览器中看到信息

  • 您可以明确提及该POST方法

  • GET方法更安全

  • 它提供更多高级功能


“它仅用于发送256个字符的日期”-不正确。“使用这种方法时,信息可以在浏览器中看到” –发布数据在浏览器中也可见,只是不太明显。“它提供了更高级的功能”-例如?
昆汀2012年

这不是一个非常有用的答案。诸如“信息不那么安全”,“提供更高级的功能”之类的不正确信息,以及昆汀提到的其他信息。
安德鲁·巴伯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.