如何在HTML表单的GET和POST方法之间进行选择?
我希望了解使用这两种方法的所有优缺点。特别是对网络安全的影响。
谢谢。
解决方案
要在它们之间进行选择,我使用以下简单规则:
GET读取。 (读取并显示数据)
POST进行任何写操作(即更新数据库表,删除条目等)
另一个要考虑的是,GET必须遵守最大URI长度,并且当然不能处理文件上载。
此页面有一个很好的摘要。
黑客或者其他人员很容易监视这两个值集,但是GET的安全性较低,因为它非常明显地显示了值的含义(在地址栏中)。
如果需要,请使用SSL来确保安全性。
一个很好的建议:当我们不发布内容,而是尝试获取特定页面(例如产品页面)时,请始终对表单使用POST,使用查询字符串(?value = products)。因此,名称为POST和GET :)
如果我们要传递密码或者其他敏感信息之类的信息,请始终使用POST并确保使用SSL,这样数据就不会以明文形式在客户端和服务器之间传输。
从安全角度来看,使用GET的缺点是所有提交的数据都将位于URL中,因此将其本地存储在浏览器历史记录中的客户端上。
GET应该没有副作用:http://www.w3.org/DesignIssues/Axioms.html#state
如果提交有副作用,则应使用POST表格。
两种方法都没有真正意义上的安全性,如果我们担心安全性,请使用SSL。
看一下RFC 2616:第9节" HTTP / 1.1方法定义"
如果希望结果可添加书签,请使用GET。
GET可能更易于调试,因为我们可以在地址栏中监视所有发送的值,而无需任何其他工具。但是最大数量是有限制的。长度,因此如果有一些变量,我们可能会超出此范围。
如今,POST并不是那么安全,因为使用Fiddler&co等免费工具。我们可以非常轻松地掌握这些值。但是,我们可以通过这种方式提交的值的长度或者数量并没有真正的限制,并且URL看起来更加人性化。
因此,我始终建议使用POST而不是GET。
GET在URL中传递数据,POST在HTTP内容中传递相同的数据,从安全角度来看,两者都是完全相同的(也就是说,除非我们自己进行某些操作(例如使用HTTPS),否则这是完全不安全的)。
GET受浏览器和Web服务器支持的最大URL长度的限制,因此只能以简短形式使用。
从HTTP标准的角度来看,GET请求不应更改站点,浏览器/蜘蛛程序比POST请求更有可能自己发出GET请求(无需用户实际单击某些东西)。
通常最好使用POST,因为它可以更好地隐藏以进行侦听,使用某些浏览器更好地处理字段中的空格/编码,尤其是由于GET字段的整体长度受到限制。
GET和POST都有它们的位置。我们不应该依赖它们中的任何一个来保证安全性。
GET请求
- 容易到达
- 容易收藏
- 受URI长度限制
- 可能在访问日志中显示参数
POST请求
- 允许文件上传
- 允许大数据
- 在浏览器地址栏中不显示参数
我们是否希望表单提交的结果可添加书签(例如Google搜索)?使用GET。
我们希望提交表单的结果是可行的吗?使用GET。
请求不是幂等的(安全可重复的)吗?使用POST,然后始终重定向到适合通过HTTP GET获取的页面。
我们需要上传文件吗?使用POST。
前几天我注意到了一个陷阱,那真是一个" DUH!"我的时刻。
我们的网站上有一个第三方搜索引擎,他们使用GET方法将搜索查询发布到他们的代码中。另外,我有一些代码在查询字符串中寻找可能的SQL注入攻击。我的代码搞砸了所有东西,因为它正在寻找" EXEC"," UPDATE"," DELETE"等单词。恩,事实证明用户正在寻找" EXECUTIVE MBA",而我的代码在" EXECUTIVE"中找到了" EXEC"并禁止了他们的IP。
相信我,我不是在吹牛我的代码,只是说在GET和POST之间进行选择具有"不希望我的密码显示在查询字符串中"以外的其他含义。
除了例如Micke,我想指出浏览器界面处理GET和POST请求的页面方面的重要区别。
如果我们重新加载GET请求的页面,浏览器将再次从服务器或者缓存中获取URL。但是,如果我们重新加载POST,浏览器将显示有关重新发布数据的警告弹出窗口,用户可能会然后取消(导致更加混乱的"过期"页面)。如果我们使用后退或者历史记录返回到POST结果的页面,则也是一样。
当然,这是基于不同的语义的:GET请求应该是幂等的,即,我们可以执行多次,而无需进行任何更改。另一方面,POST用于具有副作用的操作,例如注册某些内容,分发某些内容,在论坛上发表评论。通常,用户不希望在重新加载时重复此操作,因此该警告是明智的。但是,如果操作可以安全地重复(例如搜索),请避免使用POST,因为警告不是必需的,只会使用户感到困惑。
关于安全性的要点:如果在GET表单中有一个密码字段,则当我们键入密码时,该密码将被遮住,以防窥视,但是,当我们单击Submit时,它会在地址栏中清晰可见!但是除此之外,GET和POST都没有真正的安全性,因此如果需要考虑使用SSL。
大卫·M的答案得到我的投票。
我只想添加一个我听说过的项目,也许这是一个城市传奇?
某人有一个站点,该站点的链接仅供内部使用,以删除其网站上的文件。一切都很好,直到一个网络蜘蛛(我认为是google)以某种方式找到了这些链接,并愉快地跟随着每个链接,导致他站点上的所有文件都被删除了。链接使用GET,并且应该使用POST,因为蜘蛛程序不遵循POST链接。
Google搜索引擎是GET表单的示例,因为我们应该能够连续搜索两次,并且这样做不会影响结果。我们还可以链接到搜索结果页面,因为它是一个普通的GET请求,就像其他地址一样,它也具有很好的效果。
如前所述,使用POST删除或者更新数据,但我想补充一点,我们应该立即将用户重定向到GET页面。
http://zh.wikipedia.org/wiki/邮寄/重定向/获取
这取决于要传输的数据类型和数据大小。使用GET,我们最多可以将255个字符传递到操作页面。使用POST方法,我们没有这样的限制。 POST为数据提供了更多的隐私,因为它不会在任何地方显示。我们使用GET方法发送的任何内容都将显示在broser的地址栏中。
许多搜索网站通常都使用GET方法,因为这使我们可以为搜索查询添加书签。希望这可以帮助。
GET中经常被忽略的一个安全问题是Web服务器日志包含每个页面访问的完整URL。对于GET请求,这包括所有查询参数。即使我们安全地访问该站点,它也以纯文本格式保存到服务器日志中。
服务器日志通常由站点统计应用程序使用,因此可能不仅仅是看到服务器日志的服务器管理员。
同样的警告适用于第三方跟踪软件,例如google Analytics(分析),它们记录页面的完整URL,并再次包含GET查询参数并将其报告给Analytics(分析)用户。
因此,如果我们要提交敏感数据(密码,卡号等),即使它是通过AJAX进行的,并且从未出现在浏览器的实际URL栏中,则应始终使用POST。