我想知道使用这两种方法的所有利弊。特别是对网络安全的影响。
谢谢。
要在它们之间进行选择,我使用这个简单的规则:
获取读取。(读取数据并显示)
POST 用于写入的任何内容(即更新数据库表、删除条目等)
另一个考虑是 GET 受制于最大 URI 长度,当然不能处理文件上传。
GET 和 POST 都有自己的位置。您不应该依赖它们中的任何一个来确保安全。
获取请求
POST 请求
您是否希望表单提交的结果可以收藏(想想 Google 搜索)?使用GET。
您希望表单提交的结果是可缓存的吗?使用GET。
您的请求不是幂等的(安全可重复)吗?使用POST然后始终重定向到适合通过 HTTP GET 获取的页面。
你需要文件上传吗?使用POST。
GET 不应该有副作用:http ://www.w3.org/DesignIssues/Axioms.html#state
当提交有副作用时,应使用 POST 表单。
这两种方法对安全性都没有任何实际影响,如果您担心安全性,请使用 SSL。
除了来自例如 Micke 的精彩回答之外,我想指出浏览器界面如何处理使用 GET 与 POST 请求的页面的一个重要区别。
如果您重新加载 GET 请求的页面,浏览器将再次获取 URL(从服务器或缓存中),但是如果您重新加载 POST,浏览器将显示一个关于重新发布数据的稍微令人困惑的警告弹出窗口,用户可能会然后取消(导致更加混乱的“过期”页面)。如果您使用返回或历史记录返回到作为 POST 的结果的页面,同样的事情。
这当然是基于不同的语义:GET-requests 应该是幂等的——也就是说,你可以做几次而不改变任何东西。另一方面,帖子用于具有副作用的操作,例如注册某事,通过某事,在论坛上发表评论。通常,用户在重新加载时不希望重复此操作,因此警告是明智的。但是,如果操作可以安全地重复(如搜索),请避免使用 POST,因为警告不是必需的,只会让用户感到困惑。
关于安全性的一点:如果您在 GET 表单中有一个密码字段,则当您输入密码时,密码将被屏蔽以防窥探,但是,当您点击提交时,它将在地址栏中清晰可见!但除此之外,GET 和 POST 都没有真正的安全性,因此如果担心,请使用 SSL。
GET 在 URL 中传递数据,POST 在 HTTP 内容中传递相同的数据,从安全角度来看两者完全相同(也就是说,完全不安全,除非你自己做一些事情,比如使用 HTTPS)。
GET 受浏览器和 Web 服务器支持的最大 URL 长度限制,因此只能以短格式使用。
从 HTTP 标准的角度来看,GET 请求不应该改变站点,并且浏览器/蜘蛛更有可能自己发出 GET 请求(没有用户实际点击某些东西)然后 POST 请求。
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 长度。
什么是 POST HTTP 方法 POST HTTP 请求由方法表示:HTTP 请求中的 POST。在 POST 方法中,数据不作为 URL 字符串的一部分发送到服务器,而是在 POST 中,数据作为消息正文的一部分发送。几乎所有的身份验证请求都是通过 HTTP 世界中的 POST 方法发送的。POST 方法是安全的,因为数据在 URL 字符串中不可见,并且可以使用 HTTPS 安全地加密以提高安全性。所有发送到服务器的敏感和机密信息都必须通过 POST 请求并通过 HTTPS(带有 SSL 的 HTTP)。POST 方法也用于向服务器提交信息,任何可以改变应用程序状态的信息,例如将商品添加到购物车、付款等。这里有一些示例,您应该考虑在 HTTP 请求中使用 POST 方法:如果您是,请使用 POST在 GET 的情况下发送无法放入 URL 的大数据。如果您将敏感和机密信息传递给服务器,例如 user_id、密码、帐号等,请使用 POST 方法。如果您提交可以改变应用程序状态的数据,例如将项目添加到购物车以传递该购物车进行支付处理,请使用 POST 方法。如果您正在编写安全应用程序并且不想在 URL 中显示查询参数,请使用 POST。
HTTP 协议中 GET 和 POST 方法 之间的区别 GET 和 POST 之间的大部分区别已经在各自的章节中讨论过。当您想要选择 GET 和 POST 时,这一切都取决于要求,并且了解这些差异有助于您做出决定。
GET 方法在 URL 字符串中传递请求参数,而 POST 方法在请求正文中传递请求参数。GET 请求只能传递有限数量的数据,而 POST 方法可以向服务器传递大量数据。与 POST 请求不同,GET 请求可以被添加书签和缓存。GET 主要用于查看目的(例如 SQL SELECT),而 POST 主要用于更新目的(例如 SQL INSERT 或 UPDATE)。
如果您要传递密码或其他敏感信息等内容,请始终使用 POST 并确保您使用的是 SSL,这样数据就不会以明文形式在客户端和服务器之间传输。
安全方面,使用 GET 的缺点是所有提交的数据都将在 URL 中,因此本地存储在客户端的浏览器历史记录中。
如果您希望结果可收藏,请使用 GET。
GET 可能更容易调试,因为您无需任何其他工具即可监控地址栏中的所有发送值。但是最大有一个限制。长度,所以有一些变量你可能会超过这个。
现在 POST 并不太安全,因为使用 Fiddler & co 等免费工具。你可以很容易地掌握这些价值观。但是,您可以通过这种方式提交的值的长度或数量并没有真正的限制,并且您的 URL 看起来更加用户友好。
所以我一直以来的建议是使用 POST 而不是 GET。
大卫 M 的回答是我的投票。
我只是想添加一个我听说过的项目,也许它是一个都市传说??
有人有一个网站,其中的链接仅供内部使用,以删除其网站上的文件。一切都很好,直到一个网络蜘蛛(我认为是谷歌)以某种方式找到了这些链接并愉快地跟踪每个链接,导致他网站上的所有文件都被删除。链接使用 GET 并且应该使用 POST,因为蜘蛛不遵循 POST 链接。
Google 搜索引擎是 GET 表单的一个示例,因为您应该能够连续搜索两次,并且这样做不会影响结果。它还具有很好的效果,您可以链接到搜索结果页面,因为它是一个普通的 GET 请求,就像任何其他地址一样。
如前所述,使用 POST 删除或更新数据,但我想补充一点,您应该立即将用户重定向到 GET 页面。
这取决于您要传输的数据类型和数据大小。使用 GET,您最多可以将 255 个字符传递到操作页面。使用 POST 方法,您没有这样的限制。POST 为数据提供了更多隐私,因为它不会显示在任何地方。您使用 GET 方法发送的任何内容都会显示在 broser 的地址栏中。
许多搜索站点通常使用 GET 方法,因为这使您可以为搜索查询添加书签。希望这可以帮助。
GET 中一个经常被忽视的安全问题是 Web 服务器日志包含每个页面访问的完整 URL。对于 GET 请求,这包括所有查询参数。即使您安全地访问该站点,它也会以纯文本形式保存到服务器日志中。
服务器日志经常被站点统计应用程序使用,因此不仅仅是服务器管理员可能会看到它。
同样的警告也适用于第三方跟踪软件,例如谷歌分析——它们记录页面的完整 URL,再次包括 GET 查询参数并将其报告给分析用户。
因此,如果您提交敏感数据(密码、卡号等),即使它是通过 AJAX 并且从未出现在浏览器的实际 URL 栏中,您也应该始终使用 POST。
前几天我注意到一个问题,这是一个真正的“DUH!” 我的时刻。
我们的网站上有第三方搜索引擎,他们使用 GET 方法将搜索查询发布到他们的代码中。此外,我还有一些代码可以在查询字符串中查找可能的 SQL 注入攻击。我的代码搞砸了一切,因为它正在寻找“EXEC”、“UPDATE”、“DELETE”等词。好吧,结果用户正在寻找“EXECUTIVE MBA”,而我的代码在“EXECUTIVE”中找到了“EXEC” "并禁止他们的IP。
相信我,我并不是在吹嘘我的代码,只是说在 GET 和 POST 之间进行选择除了“我是否希望我的密码出现在查询字符串中”之外,还有半深远的影响。
通常最好使用 POST,因为它可以更好地隐藏以进行窥探,更好地处理某些浏览器字段中的空格/编码,尤其是由于 GET 字段的总长度的限制。
这两组值很容易被黑客或其他东西监控,但 GET 的安全性较低,因为它的值非常明显(就在地址栏中)。
如果需要,请使用 SSL 以确保安全。
一个好建议:当您不发布内容但尝试获取特定页面(如产品页面)时,始终使用 POST 表单,使用查询字符串 (?value=products)。因此名称 POST 和 GET :)