我应该如何在HTML表单中选择GET和POST方法?

时间:2008-09-21 12:45:05

标签: html http

我希望了解使用这两种方法的所有优点和缺点。特别是对网络安全的影响。

感谢。

17 个答案:

答案 0 :(得分:37)

要在它们之间进行选择,我使用这个简单的规则:

读取GET。 (读取数据并显示)

POST任何写入的内容(即更新数据库表,删除条目等)

另一个考虑因素是GET受到最大URI长度的影响,当然无法处理文件上传。

This page has a good summary

答案 1 :(得分:24)

GET和POST都有自己的位置。你不应该依赖它们中的任何一个来保证安全。

获取请求

  • 很容易安装
  • 很容易收藏“
  • 受URI长度限制
  • 可能会在访问日志中显示参数

POST请求

  • 允许文件上传
  • 允许大数据
  • 不会在浏览器地址栏中显示参数

您是否希望表单提交的结果为可收藏(想想Google搜索)?使用 GET

您希望表单提交的结果是可缓存吗?使用 GET

您的请求不是幂等(安全可重复)?使用 POST 然后always redirect to a page that is suitable to get via HTTP GET

您需要文件上传吗?使用 POST

答案 2 :(得分:12)

GET不应该有副作用:http://www.w3.org/DesignIssues/Axioms.html#state

提交有副作用时,应使用POST表单。

这两种方法都没有任何真正的安全含义,如果您担心安全问题,请使用SSL。

答案 3 :(得分:4)

除了来自例如Micke,我想指出浏览器界面如何处理GET与POST请求的页面的重要区别。

如果您重新加载GET请求的页面,浏览器将再次(从服务器或从缓存中)获取URL,但是如果您重新加载POST,浏览器将显示有关重新发布数据的略微混乱的警告弹出窗口,然后,用户可以取消(导致更加混乱的“过期”页面)。如果您使用back或history返回到POST结果的页面,也是一样。

这当然基于不同的语义:GET请求应该是幂等的 - 即,你可以做几次而不改变任何东西。另一方面,POST是针对具有副作用的操作,例如注册某些内容,通过某些内容,在论坛上发表评论。通常,用户不希望在重新加载时重复此操作,因此警告是明智的。但是,如果操作是安全可重复的(例如搜索),请避免使用POST,因为警告不是必需的,只会让用户感到困惑。

关于安全性的要点:如果您在GET表单中有密码字段,则在您输入密码时屏蔽密码将被屏蔽,但是,当您点击提交时,它将在地址栏中清晰可见!但除此之外,GET和POST都没有真正的安全性,因此如果需要考虑,请使用SSL。

答案 4 :(得分:3)

答案 5 :(得分:2)

GET传递URL中的数据,POST传递HTTP内容中的相同数据,从安全角度来看两者完全相同(也就是说,除非你自己做些什么,比如使用HTTPS),否则完全不安全。

GET受浏览器和Web服务器支持的最大URL长度限制,因此只能以简短形式使用。

从HTTP标准的角度来看,GET请求不应该更改站点,浏览器/蜘蛛更有可能自己发出GET请求(没有用户实际点击某些内容)然后POST请求。

答案 6 :(得分:1)

HTTP中的GET和POST方法是两种最常用的方法,用于使用HTTP(超文本传输​​协议)协议将数据从客户端传输到服务器。 GET和POST都可用于发送请求和接收响应,但它们之间存在显着差异。

什么是GET HTTP请求? HTTP协议支持在使用HTTP或HTTPS协议发送请求时可以使用的多种请求方法。 GET就是其中之一。顾名思义,GET方法是从HTTP Server检索页面。 GET请求的一个重要属性是任何请求参数或查询参数都作为URL编码字符串传递,使用“?”附加使其不安全的字符,因为您在URL字符串中传递的任何信息对每个人都可见。

何时使用HTTP GET请求 正如我所说,GET方法不安全,因此不适合传输机密数据,但GET方法对于从Web服务器检索静态内容非常有用。以下是使用GET方法有意义的一些示例: 重复请求没有副作用。例如,单击指向另一个页面的链接。如果单击链接两次或三次无关紧要,这也为服务器的机会浏览器捕获响应以便更快地检索。 您没有传递任何敏感和机密信息。相反,您只需传递一些配置数据或会话ID。 您希望HTTP GET请求指向的URL是可书签的。 需要发送到服务器的数据量不大,可以安全地容纳所有浏览器支持的最大URL长度。一般来说,不同的浏览器对URL长度有不同的字符限制,但限制它是不错的选择。

什么是POST HTTP方法 POST HTTP请求由方法表示:HTTP请求中的POST。在POST方法中,数据不是作为URL字符串的一部分发送到服务器而是在POST中,数据作为消息正文的一部分发送。几乎所有的身份验证请求都是通过HTTP世界中的POST方法发送的。 POST方法是安全的,因为数据在URL String中不可见,并且可以使用HTTPS安全地加密以进一步提高安全性。发送到服务器的所有敏感和机密信息必须通过POST请求和HTTPS(带SSL的HTTP)。 POST方法也用于向服务器提交信息,任何可以改变应用状态的信息,如添加项目到购物车,付款等等都是你应该考虑在HTTP请求中使用POST方法的一些例子: 如果要发送GET时无法放入URL的大数据,请使用POST。 如果要将敏感和机密信息传递给服务器,请使用POST方法,例如user_id,密码,帐号等 如果您要提交可以改变应用程序状态的数据,请使用POST方法,例如将商品添加到购物车中以传递该购物车进行付款处理。 如果您正在编写安全应用程序而不想在URL中显示查询参数,请使用POST。

HTTP协议中GET和POST方法之间的区别 GET和POST之间的大部分区别已在各自的章节中讨论过。当你想选择GET和POST时,这一切都取决于要求,并且这些差异的知识可以帮助你做出决定。

当POST方法在请求体中传递请求参数时,GET方法传递URL String中的请求参数。 GET请求只能传递有限数量的数据,而POST方法可以将大量数据传递给服务器。 与POST请求不同,GET请求可以加入书签和缓存。 GET主要用于查看目的(例如SQL SELECT),而POST主要用于更新目的(例如SQL INSERT或UPDATE)。

Referenced from here

答案 7 :(得分:1)

如果您要传递密码或其他敏感信息,请始终使用POST并确保使用SSL,以便数据不会以明文形式传输到客户端和服务器之间。

安全方面,使用GET的缺点是所有提交的数据都将在URL中,因此在浏览器历史记录中本地存储在客户端上。

答案 8 :(得分:0)

如果您希望结果可收藏,请使用GET。

答案 9 :(得分:0)

GET可能更容易调试,因为您可以在没有任何其他工具的情况下监控地址栏中的所有已发送值。但是最大值有限制。长度,所以有一些变量,你可能会超出这个。

现在使用免费工具如Fiddler&合。你可以很容易地掌握价值观。但是,您无法通过这种方式提交值的长度或数量,并且您的网址看起来更加用户友好。

所以我的建议是使用POST而不是GET。

答案 10 :(得分:0)

大卫M的答案得到了我的投票。

我只想添加一个我听说过的项目,也许这是一个都市传奇?

某人的网站链接仅供内部用于删除其网站上的文件。一切都很好,直到一个webspider(我认为它是谷歌)以某种方式找到这些链接,并愉快地跟随每一个导致他的网站上的所有文件被删除。链接使用GET并且应该使用POST,因为蜘蛛不遵循POST链接。

答案 11 :(得分:0)

Google搜索引擎是GET表单的一个示例,因为您应该能够连续搜索两次而不会影响结果。它还具有很好的效果,您可以链接到搜索结果页面,因为它是一个普通的GET请求,就像任何其他地址一样。

如前所述,使用POST删除或更新数据,但我想补充一点,您应该立即将重定向您的用户转到GET页面。

http://en.wikipedia.org/wiki/Post/Redirect/Get

答案 12 :(得分:0)

这取决于您要传输的数据类型和数据大小。使用GET,您最多可以将255个字符传递到操作页面。使用POST方法,您没有这样的限制。 POST为数据提供了更多隐私,因为它不会在任何地方显示。您使用GET方法发送的任何内容都会显示在更明亮的地址栏中。

许多搜索网站通常使用GET方法,因为这样您就可以为搜索查询添加书签。希望这会有所帮助。

答案 13 :(得分:0)

GET中一个经常被忽视的安全问题是Web服务器日志包含每个页面访问的完整URL。对于GET请求,这包括所有查询参数。即使您安全地访问该站点,也会以纯文本格式保存到服务器日志中。

服务器日志通常由站点统计应用程序使用,因此不只是服务器管理员可能会看到它。

同样的警告适用于第三方跟踪软件,例如谷歌分析 - 它们记录页面的完整URL,再次包括GET查询参数并将其报告给分析用户。

因此,如果您提交敏感数据(密码,卡号等),即使是通过AJAX提交并且从未出现在浏览器的实际网址栏中,您也应始终使用POST。

答案 14 :(得分:-2)

有一天我注意到了,那是一个真正的“DUH!”我的时刻。

我们的网站上有第三方搜索引擎,他们使用GET方法将搜索查询发布到他们的代码中。另外,我有一些代码在查询字符串中寻找可能的SQL注入攻击。我的代码搞砸了所有内容,因为它正在寻找像“EXEC”,“UPDATE”,“DELETE”等字样。好吧,事实证明用户正在寻找“执行MBA”并且我的代码在“EXECUTIVE”中找到了“EXEC” “并禁止他们的知识产权。

相信我,我并不吹嘘我的代码,只是说在GET和POST之间进行选择除了“我是否希望我的密码出现在查询字符串中”之外还有其他意义深远的影响。

答案 15 :(得分:-3)

一般来说最好使用POST,因为隐藏一点隐藏,在某些浏览器的字段中更好地处理空格/编码,特别是因为GET字段总长度的限制。

答案 16 :(得分:-7)

这两组值很容易被黑客或其他东西监控,但是GET的安全性与其非常明显的值(在地址栏中)非常相似。

如果需要,请使用SSL以确保安全。

一个好的建议:总是使用POST表单,使用查询字符串(?value =产品),当你没有发布内容,但是正在尝试获取特定页面,如产品页面。因此名称POST和GET:)