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

时间:2009-02-02 21:15:47

标签: forms http post get http-method

使用GETPOST方法有什么区别?哪一个更安全?他们每个人有什么(不)的优势?

similar question

14 个答案:

答案 0 :(得分:233)

这不是安全问题。 HTTP协议将GET类型的请求定义为idempotent,而POST可能有副作用。简单来说,这意味着GET用于查看内容而不更改内容,而POST则用于更改内容。例如,搜索页面应使用GET,而更改密码的表单应使用POST。

另外,请注意PHP会混淆概念。 POST请求从查询字符串和请求主体获取输入。 GET请求只从查询字符串中获取输入。所以POST请求是GET请求的超集;您可以在POST请求中使用$_GET,甚至可以在$_POST$_GET中使用具有相同名称的参数来表示不同的内容。

例如,假设您有一个用于编辑文章的表单。 article-id可以在查询字符串中(因此,可以通过$_GET['id']获得),但是,假设您要更改article-id。然后,新ID可以出现在请求正文中($_POST['id'])。好吧,也许这不是最好的例子,但我希望它能说明两者之间的区别。

答案 1 :(得分:74)

当用户在表单中输入信息并单击“提交”时,有两种方法可以将信息从浏览器发送到服务器:在URL中,或在HTTP请求的正文中。

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

GET方法的替代方法是POST方法。此方法将名称/值对打包在HTTP请求的正文中,这样可以生成更清晰的URL,并且对表单输出不施加任何大小限制。它也更安全。

答案 2 :(得分:37)

最好的答案是第一个。

您正在使用:

    当您想要检索数据时,
  • 获取(获取数据)。
  • POST ,如果要发送数据(POST DATA)。

答案 3 :(得分:19)

使用GET有两个常见的“安全性”含义。由于数据出现在URL字符串中,因此可能有人在地址栏/ URL上查看您可能无法查看的内容,例如可能用于劫持会话的会话cookie。请记住每个人都有可拍照手机。

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

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

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

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

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

答案 4 :(得分:17)

当我从网址检索信息时使用GET,当我将信息发送到网址时,我会使用POST。

答案 5 :(得分:15)

如果有大量数据或敏感信息(非常敏感的东西也需要安全连接),您应该使用POST。

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

请注意人们使用GET方法点击REFRESH,因为每次都会再次发送数据而不会警告用户(POST有时会警告用户重新发送数据)。

答案 6 :(得分:13)

这个W3C document解释了HTTP GET和POST的使用。

我认为这是一个权威来源。

摘要是(文件第1.3节):

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

答案 7 :(得分:10)

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

答案 8 :(得分:8)

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

  • Google Web Accelerator等网络加速器会点击页面上的所有(GET)链接并对其进行缓存。如果链接对事物进行了更改,这非常糟糕。
  • 浏览器缓存GET请求,因此即使用户单击该链接,它也不会向服务器发送执行更改的请求。
  • 要保护您的站点/应用程序免受CSRF攻击,您必须使用POST。要完全保护您的应用程序,您还必须在服务器上生成唯一标识符,并在请求中发送该标识符。

此外,请勿在查询字符串中添加敏感信息(仅限GET选项),因为它会显示在地址栏,书签和服务器日志中。

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

答案 9 :(得分:6)

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

GET基本上只是用于获取(检索)数据,A GET不应该有正文,因此除了Cookie之外,唯一可以传递信息的地方是网址和网址限制在与GET相比,POST的安全性较低,因为发送的数据是网址的一部分

发送密码,信用卡或其他敏感信息时,请勿使用GET!网址中的所有人都可以看到数据,可以是缓存数据。  当我们重新加载或回拨按钮时,GET是无害的,它将被预订,参数保留在浏览器历史记录中,只允许使用ASCII字符。

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

POST方法用于将敏感和机密信息传递给服务器,它在URL中的查询参数中不可见,参数不会保存在浏览器历史记录中。数据长度没有限制。当我们重新加载浏览器时,应提醒用户数据即将重新提交。 POST方法无法加入书签

答案 10 :(得分:3)

此问题以及other中与GETPOST有关的SO问题中的全部或大部分答案都是错误的。从技术上讲,它们是正确的,并且可以正确解释standards,但实际上它是完全不同的。让我解释一下:

GET被认为是idempotent,但不是必须的。您可以将GET中的参数传递到对数据进行永久更改的服务器脚本。相反,POST被认为不是幂等的,但是您可以POST使用不更改服务器的脚本。因此,这是错误的二分法,在实践中是无关紧要的。

此外,说GET如果重新加载不会损害任何内容是一个错误-当然,如果调用的脚本和传递的参数进行了永久更改(例如删除示例数据),则可以这样做。 POST也可以!

现在,我们知道POST(到目前为止)更加安全,因为它不公开正在传递的参数,并且不进行缓存。另外,您可以传递更多数据,并且GET一个干净的,不混乱的URL。它可以完成GET可以做的所有事情。因此,这更好。至少在生产中。

因此,实际上,您何时应该使用GETPOST?我在开发过程中使用了GET,所以我可以看到和调整我传递的参数。我用它来快速尝试不同的值(例如,测试条件)甚至不同的参数。如果我需要一组不同的参数,则无需构建表单并进行修改即可。我只需根据需要在浏览器中编辑URL。

开发完成或至少稳定之后,我将所有内容都切换到POST

如果您能想到任何不正确的技术原因,我将很高兴学习。

答案 11 :(得分:1)

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

答案 12 :(得分:0)

如果要从URL检索资源,请使用GET方法。如果你点击浏览器的后退按钮,你总是可以看到最后一页,它可能被加入书签,因此它不如POST方法安全。

如果您想要向网址“提交”某些内容,请使用POST方法。例如,你想创建一个谷歌帐户,你可能需要填写所有详细信息,然后点击“提交”按钮(这里调用POST方法),一旦你成功提交,并尝试回击浏览器的按钮,您将收到错误或新的空白表单,而不是填写表单的最后一页。

答案 13 :(得分:-10)

GET方法:

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

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

  • 这是表单

  • 使用的默认方法
  • 不太安全。


POST方法:

  • 用于发送无限数据。

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

  • 您可以明确提及POST方法

  • 它比GET方法

  • 更安全
  • 它提供了更多高级功能