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

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

(类似的问题)

206136 次浏览

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

在前面的示例中使用的GET方法将名称/值对追加到URL。不幸的是,URL的长度是有限的,所以这个方法只在只有几个参数的情况下才有效。如果表单使用大量参数,或者参数包含大量数据,URL可能会被截断。此外,通过URL传递的参数在浏览器的地址字段中可见,这不是显示密码的最佳位置。

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

Get和Post方法与你所使用的服务器技术无关,它在php、asp.net或ruby中都是一样的。GET和POST是HTTP协议的一部分。 正如mark所指出的,POST更安全。POST表单也不被浏览器缓存。

. POST也用于传输大量数据

我使用GET当我检索信息一个URL和POST当我发送信息一个URL。

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

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

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

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

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

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

使用GET有两个常见的“安全”含义。由于数据出现在URL字符串,它可能有人看着你的肩膀在地址栏/URL可能能够看到一些他们不应该知道的东西,如会话cookie,可能会被用来劫持你的会话。记住每一个人有照相手机。

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

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

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

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

其他人已经很好地涵盖了语义差异和这个问题的“何时”部分。

在修改数据时使用POST的原因:

  • 像谷歌这样的网络加速器将单击页面上的所有(GET)链接并缓存它们。如果链接更改了内容,这是非常糟糕的。
  • 浏览器缓存GET请求,因此即使用户单击链接,它也不会向服务器发送执行更改的请求。
  • 为了保护您的站点/应用程序免受CSRF的侵害,您必须使用POST。为了完全保护你的应用,你还必须在服务器上生成一个唯一的标识符,并在请求中发送。

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

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

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

最好的答案是第一个。

您正在使用:

  • 得到当你想检索数据(GET data)。
  • 帖子当你想要发送数据(POST data)。

GET方法:

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

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

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

  • 它不是那么安全。


POST方法:

  • 它用于发送无限数据。

  • 使用这种方法,信息不能在浏览器上看到

  • 你可以显式地提到POST方法

  • 它比GET方法更安全

  • 它提供了更高级的功能

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

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

摘要如下(文件第1.3节):

  • 如果交互更像是一个问题(即,它是一个安全的操作,如查询、读取操作或查找),则使用得到
  • 如果:
    • 这种互动更像是一种命令,或者
    • 交互以一种方式改变资源的状态 用户将感知到(例如,服务的订阅),或
    • 用户应该对交互的结果负责。
    • 李< / ul > < / >

GETPOST是HTTP方法,其中可以实现了类似的目标

GET基本上只是用于获取(检索)数据,GET不应该有一个主体,所以除了cookie之外,唯一传递信息的地方是URL,而URL的长度是有限的,与GET相比,GET不太安全,因为发送的数据是URL的一部分

当发送密码、信用卡或其他敏感信息时,永远不要使用GET !,数据在URL中对每个人都是可见的,可以缓存数据。 GET是无害的,当我们重新加载或调用返回按钮时,它将被book标记,参数保留在浏览器历史记录中,只允许ASCII字符。< / p >

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

POST方法是安全的,用于传递敏感和机密信息到服务器,它不会在URL中的查询参数中可见,并且参数不会保存在浏览器历史中。数据长度没有限制。当我们重新加载时,浏览器应该提醒用户数据即将被重新提交。POST方法不能被收藏

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

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

这个问题和其他关于SO的问题中有关GETPOST的全部或可能大部分答案都是错误的。他们在技术上是正确的,他们正确地解释了标准,但在实践中,它是完全不同的。让我解释一下:

GET被认为是幂等,但它不一定是。可以将GET中的参数传递给服务器脚本,该脚本对数据进行永久更改。相反地,POST被认为是等幂的,但是你可以将POST转换为不改变服务器的脚本。所以这是一个错误的二分法,与实践无关。

此外,说GET在重新加载后不会损害任何东西是错误的——当然,如果它调用的脚本和它传递的参数进行了永久性的更改(例如删除数据),它就会损害任何东西。POST!

现在,我们知道POST(到目前为止)更安全,因为它不公开传递的参数,也不缓存。另外,你可以通过POST传递更多的数据,它也给你一个干净的,不混乱的URL。它做GET能做的所有事情。所以这是更好的选择。至少在生产中是这样。

所以在实践中,什么时候应该使用GETPOST?我在开发过程中使用GET,所以我可以看到和调整我传递的参数。我用它来快速尝试不同的值(例如测试条件)甚至不同的参数。如果我需要一组不同的参数,我不需要构建一个表单,也不需要修改它,就可以做到这一点。我只需根据需要在浏览器中编辑URL即可。

一旦开发完成,或至少稳定,我切换到POST

如果你能想到任何技术上的原因,这是不正确的,我很乐意学习。

我发现这个列表非常有用

得到

  • GET请求可以被缓存
  • GET请求保留在浏览器历史记录中
  • GET请求可以被收藏
  • 在处理敏感数据时,不应该(几乎)使用GET请求
  • GET请求有长度限制
  • GET请求应该只用于检索数据

帖子

  • POST请求不会被缓存
  • POST请求不会保留在浏览器历史记录中
  • POST请求不能被收藏
  • POST请求对数据长度没有限制