GET 或 POST 哪个比另一个更安全?

2024-04-06

当比较 HTTP GET 和 HTTP POST 时,从安全角度来看有什么区别?其中一种选择本质上比另一种更安全吗?如果是这样,为什么?

我意识到 POST 不会公开 URL 上的信息,但是这有什么真正的价值,还是只是通过模糊来实现安全?当考虑到安全性时,是否有理由我应该更喜欢 POST?

Edit:
通过 HTTPS,POST 数据被编码,但 URL 是否可以被第 3 方嗅探?另外,我正在处理JSP;当使用 JSP 或类似框架时,是否可以公平地说最佳实践是避免将敏感数据完全放在 POST 或 GET 中并使用服务器端代码来处理敏感信息?


GET 请求的安全性略低于 POST 请求。两者本身都无法提供真正的“安全”;使用 POST 请求will not神奇地使您的网站免受明显的恶意攻击。但是,使用 GET 请求can使原本安全的应用程序变得不安全。

“不得使用 GET 请求进行更改”的口头禅仍然非常有效,但这与恶意的行为。登录表单是最容易使用错误请求类型发送的表单。

搜索蜘蛛和网络加速器

这是您应该使用 POST 请求来更改数据的真正原因。搜索蜘蛛将跟踪您网站上的每个链接,但不会提交他们找到的随机表单。

网络加速器比搜索蜘蛛更糟糕,因为它们运行在客户端的计算机上,并且“单击”所有链接在登录用户的上下文中。因此,使用 GET 请求删除内容的应用程序,即使需要管理员,也会很乐意遵守(非恶意!)Web 加速器的命令,并且删除它看到的所有内容 https://web.archive.org/web/20090126045517/http://radar.oreilly.com/archives/2005/05/google-web-acce-1.html.

副攻混乱

A 混乱的副攻 http://en.wikipedia.org/wiki/Confused_deputy_problem(其中副为浏览器)是无论您使用 GET 还是 POST 请求都可以 http://haacked.com/archive/2009/04/02/anatomy-of-csrf-attack.aspx.

在攻击者控制的网站上,GET 和 POST 是同样容易提交 http://pentestmonkey.net/blog/csrf-xml-post-request 无需用户交互 http://www.javascript-coder.com/javascript-form/javascript-form-submit.phtml.

POST 不太容易受到影响的唯一情况是,许多不受攻击者控制的网站(例如第三方论坛)允许嵌入任意图像(允许攻击者注入任意 GET 请求),但阻止所有攻击注入任意 POST 请求的方法,无论是自动还是手动。

有人可能会说网络加速器是混淆代理攻击的一个例子,但这只是一个定义问题。如果有的话,恶意攻击者无法控制这一点,所以这几乎不是一个attack,即使是副手is使困惑。

代理日志

代理服务器可能会完整记录 GET URL,而不剥离查询字符串。 POST 请求参数通常不会被记录。在这两种情况下都不太可能记录 Cookie。(例子) http://www.linuxquestions.org/questions/linux-server-73/sample-squid-proxy-log-files-837345/

这是支持 POST 的一个非常无力的论据。首先,可以完整记录未加密的流量;恶意代理已经拥有它所需的一切。其次,请求参数对攻击者来说用途有限:他们真正需要的是 cookie,因此如果他们唯一拥有的就是代理日志,他们不太可能能够攻击 GET 或 POST URL。

登录请求有一个例外:这些请求往往包含用户的密码。将其保存在代理日志中会打开一个在 POST 情况下不存在的攻击向量。然而,无论如何,通过纯 HTTP 登录本质上是不安全的。

代理缓存

缓存代理可能会保留 GET 响应,但不会保留 POST 响应。尽管如此,与将 URL 转换为 POST 处理程序相比,将 GET 响应设置为不可缓存可以花费更少的精力。

HTTP“引用者”

如果用户要从响应 GET 请求而提供的页面导航到第三方网站,则该第三方网站将看到所有 GET 请求参数。

属于“向第三方泄露请求参数”类别,其严重性取决于这些参数中存在的内容。 POST 请求自然不受此影响,但是要利用 GET 请求,黑客需要将指向其自己网站的链接插入到服务器的响应中。

浏览器历史记录

这与“代理日志”参数非常相似:GET 请求与其参数一起存储在浏览器历史记录中。如果攻击者能够物理访问计算机,他们就可以轻松获取这些信息。

浏览器刷新动作

一旦用户点击“刷新”,浏览器就会重试 GET 请求。关闭后恢复选项卡时可能会这样做。因此,任何操作(例如付款)都将在没有警告的情况下重复进行。

浏览器不会在没有警告的情况下重试 POST 请求。

这是仅使用 POST 请求来更改数据的充分理由,但与恶意行为无关,因此也与安全无关。

所以我该怎么做?

  • 仅使用 POST 请求来更改数据,主要是出于非安全相关的原因。
  • 仅对登录表单使用 POST 请求;否则会引入攻击向量。
  • 如果您的网站执行敏感操作,您确实需要一个知道自己在做什么的人,因为这无法用一个答案来涵盖。你需要使用HTTPS、HSTS、CSP,缓解SQL注入,脚本注入(XSS) http://en.wikipedia.org/wiki/Cross-site_scripting, CSRF http://en.wikipedia.org/wiki/Cross-site_request_forgery以及大量可能特定于您的平台的其他内容(例如各种框架中的批量分配漏洞:ASP.NET MVC https://web.archive.org/web/20120503215142/http://freshbrewedcode.com/joshbush/2012/03/05/mass-assignment-aspnet-mvc/, 红宝石 on Rails http://www.infoq.com/news/2012/03/GitHub-Compromised, ETC。)。没有任何一件事可以区分“安全”(不可利用)和“不安全”。

通过 HTTPS,POST 数据被编码,但 URL 是否可以被第 3 方嗅探?

不,它们不能被嗅到。但 URL 将存储在浏览器历史记录中。

公平地说,最佳实践是避免将敏感数据完全放在 POST 或 GET 中并使用服务器端代码来处理敏感信息吗?

取决于它的敏感程度,或者更具体地说,以何种方式敏感。显然客户会看到它。任何能够物理访问客户计算机的人都会看到它。客户在将其发回给您时可以对其进行欺骗。如果这些很重要,那么是的,请将敏感数据保留在服务器上,不要让它离开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GET 或 POST 哪个比另一个更安全? 的相关文章

随机推荐

  • 无法获取 ZeroMQ python 绑定来通过 IPC 接收消息

    我正在尝试通过 IPC 实现 PUB SUB 如果我更改下面的代码 以便订阅者绑定到 tcp 5000 并且发布者连接到 tcp localhost 5000 它可以工作 但我无法让它通过 IPC 工作 我究竟做错了什么 订阅者 py im
  • JQuery UI 加载事件?

    有没有办法不仅检测 jquery UI 是否加载 而且在加载时触发一个事件 现在 我将代码包装在 document ready 函数中 但有时 UI 代码会出错 因为 UI 库未完全加载 所有内容都按正确的顺序加载 该代码在 99 的情况下
  • 如何使用 https 运行 Vue.js 开发服务?

    我正在使用 Vue cli 使用 webpack 模板创建 vue 项目 如何在开发中使用 https 运行它 npm run dev 在最新的vuejs 截至2018年5月7日 中 需要在项目根目录下添加一个 vue config js
  • 为什么我的 Express 路由器中间件没有定义 req.route?

    我正在尝试使用路由器中间件来获取以下值请求路由 https expressjs com en api html req route 我有一些像这样的简单代码 服务器 js import api from api app use api ap
  • webView:didFailLoadWithError -1004: 在 Phonegap ios 中连接 google plus 时无法连接到服务器

    在获取配置文件数据之前接受 google plus 身份验证时 我收到 webView didFailLoadWithError 1004 无法连接到服务器 错误 这些代码之前可以正常工作 现在我面临这些错误 不知道为什么我无法连接 请帮助
  • 使用鼠标光标捕获屏幕截图

    我使用以下代码在 Windows 上获取屏幕截图 hdcMem CreateCompatibleDC hdc int cx GetDeviceCaps hdc HORZRES int cy GetDeviceCaps hdc VERTRES
  • 正确的原型继承

    所以我真的查遍了互联网 发现了许多在 javascript 中设置原型继承的不同方法 其中一些使用call 其中一些使用以下语法 var rabbit prototype new Animal 有些在更改原型后更改构造函数 有些则不更改 有
  • vim :AnsiEsc - 如何默认打开它们?

    我有带有彩色日志条目的日志文件 假设扩展名为 smt2 其中颜色由 ansi 转义码定义 我安装了vim插件基于AnsiEsc vim http www vim org scripts script php script id 302 现在
  • awk 解析文件名并将结果添加到每行末尾

    我有许多名称相似的文件 例如 DWH Export AUSTA 20120701 20120731 v1 1 csv 397 dat 2012 10 02 04 01 46 out DWH Export AUSTA 20120701 201
  • 人类友好的二进制编码

    不久前 我发现一个网站描述了一种对人类友好的二进制到文本编码 例如 在输入 用于解码 时 它接受 0 o 和 O 全部作为相同的值 因为人们往往很容易混合这些字符 不幸的是我不记得它是怎么叫的 编辑 这就是我正在寻找的 其他Base32 的
  • retq 和 ret 有什么区别?

    让我们考虑以下程序 它计算参数的无符号平方 global foo text foo mov rdi rax mul rdi ret 这是正确编译的as 但反汇编为 0000000000000000
  • 如何设置iPhone振动时长?

    我正在使用 AudioServicesPlaySystemSound 来调用振动函数 AudioServicesPlaySystemSound kSystemSoundID Vibrate 有什么办法可以设置振动的持续时间吗 我知道默认持续
  • ASP .NET 5 MVC 6 Identity 3 角色声明组 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在寻找一种解决方案 以在带有 Identity 3 的 ASP NET 5 MVC 6 中使用高级角色 组权限管理 我启动了一
  • Spring MVC 返回自定义 HTTP 状态代码(无错误)

    在 Spring MVC RequestMapping 注释中 我返回 JSP 页面名称作为结果 这将返回 HTTP 状态代码 200 OK 如何将此状态代码更改为 201 创建之类的内容 ResponseStatus 不起作用 另外 Ht
  • JPA:如何对实体中的 Set 字段进行排序?

    我正在使用 Spring 3 2 11 RELEASE Hibernate 4 3 6 Final 和 JPA 2 1 我有以下具有以下字段的实体 Entity Table name user public class User imple
  • 如何在 Spring MVC 中将正确的 JSON 传递给控制器​​?

    我不明白为什么在将 POST 请求传递给时会收到 HTTP 415http localhost 8080 company 我在 POST 请求中的 JSON id 7 name IBM 这是我在控制器中的方法 Controller Requ
  • 为什么在 swift 中创建 String 时会出现内存泄漏?

    泄漏是一个根漏 在此图像中 在同一行上发生了多次 但下面还有另一个称为单次 也会产生泄漏 这是调用堆栈after调用前面提到的代码行 这是 Instruments 定位泄漏的类 class Item var id String var na
  • 为什么我的 schema.ddl 在 hibernate3-maven-plugin 之后是空的?

    这是项目的目录结构 使用maven2 pom xml src main java Abc java resources hibernate cfg xml database properties META INF persistence x
  • 公共属性和私有成员 C#

    只使用公共属性而不是使用公共属性来访问私有变量有什么好处 例如 public int iMyInt get set 代替 private int myint public int iMyInt get return myint set my
  • GET 或 POST 哪个比另一个更安全?

    当比较 HTTP GET 和 HTTP POST 时 从安全角度来看有什么区别 其中一种选择本质上比另一种更安全吗 如果是这样 为什么 我意识到 POST 不会公开 URL 上的信息 但是这有什么真正的价值 还是只是通过模糊来实现安全 当考