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 哪个比另一个更安全? 的相关文章

  • 如何减少 jQuery 函数中使用的子级数量?

    我觉得我必须使用太多 children 在我的一些 jQuery 函数中 这是我的 HTML div class goal small container div class goal content div class goal row
  • 以编程方式打开网页并以字符串形式检索其 html 包含内容

    我有一个 Facebook 帐户 我想提取我朋友的照片及其个人详细信息 例如 出生日期 就读学校 等 我能够提取我每个朋友帐户的 Facebook 首页的地址 但我不知道如何以编程方式打开我每个朋友首页的网页并将 html 包含保存为字符串
  • 在 jQuery 中获取最接近元素的形式

    我编写了这个 js jquery 脚本来检查表单中的所有复选框 它工作得很好 但是这会检查页面上的所有复选框 无论它们是什么表单包装器 这是函数 function toggleCheck state var checkboxes jQuer
  • 如何关闭 HTML 输入表单字段建议?

    我所说的建议是指当您开始输入时会出现下拉菜单 并且它的建议基于您之前输入的内容 例如 当我在标题字段中输入 a 时 它会给我大量的建议 这非常烦人 如何关闭此功能 你想要的是禁用 HTMLautocomplete属性 在这里设置 autoc
  • 对于一般不成功的请求(不是错误),适当的 HTTP 状态代码响应是什么?

    我正在创建一个 RESTful API 它将处理许多用户交互 包括使用存储的信用卡下订单 如果订单成功 我将返回 200 OK 如果订单请求格式错误或无效 我将返回 400 Bad Request 但如果订单实际处理过程中出现问题 我该怎么
  • 替换已弃用的“keypress” DOM 事件

    根据MDN 文章 https developer mozilla org en US docs Web Events keypress keypress事件已被弃用 但我在其他地方找不到任何关于我们是否应该在新项目中使用此事件的信息 如果不
  • 全面的 html5 音频 API

    对于我的一生 我找不到所有 html5 的完整列表
  • 选中复选框时展开 Div

    我有一个复选框
  • JSP - 如何从数据库呈现 html(或 jsp)代码

    我有一个由多个用户组使用的jsp 要求是每个用户组在访问页面时都希望有自定义的外观和感觉 带有区分参数 我们建议允许用户将他们需要的html转储到数据库表中 jsp将确定用户组并显示相应的html 有关如何做到这一点的任何指示 示例 如果用
  • JavaScript 跨浏览器单击 HTML DOM 元素

    是否有可用的普通 JavaScript 跨浏览器函数能够触发 HTML DOM 元素 包括 div 等非表单元素 上的单击事件 大多数走这条路的人要么最终开发自己的事件管理系统 这并不难 但很烦人 要么在可用的功能范围内工作 如果所有浏览器
  • HTTP POST 操作出现错误代码 302

    我有一个 perl 脚本 它将数据发送到我用 php 编写的 Web 服务 这是代码 use LWP UserAgent my ua LWP UserAgent gt new my server endpoint http example
  • 没有嵌套容器的桌面和移动 Flexbox 布局

    我有 3 个 div 它们必须按移动布局的特定顺序排列 但我必须将第 2 个 div 作为桌面布局的侧边栏 所以对于移动设备 分区1 分区2 分区3 对于桌面 分区1 div2 分区3 在桌面布局中 div 2 有阴影背景 因此必须是父级的
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • HTML 和 JavaScript - 将滚动操作从一个元素传递到另一个元素

    假设我有两个 div div div div A scrollable list div 我想让它当光标停在里面时 control并且鼠标滚轮滚动 view将会滚动 无论如何要实现这一目标 好的 快速修复对我有用 即使固定 div 不可滚动
  • 从 R 中的 HTTPS 连接逐行读取

    当创建连接时open r 它允许逐行读取 这对于批量处理大数据流非常有用 例如这个脚本 https gist github com jeroenooms d33a24958d99bb969ac0通过一次读取 100 行来解析相当大的 gzi
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 随机定位的 div,不重叠

    所有 div 都像我需要的那样 随机 放置 但它们偶尔会重叠 这只是一个机会问题 我怎样才能防止这种情况发生 理想情况下我能够设置它们之间的最小距离 我可以通过进一步开发当前的 javascript 来实现这一目标吗 我需要考虑完全不同的方
  • 使用 JQuery 预填充选择字段的下拉选项验证

    我有这个 JQuery 片段来防止选择已在另一个字段中选择的下拉选项 var coll select name service on change function coll each function var val this value

随机推荐

  • 无法获取 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 上的信息 但是这有什么真正的价值 还是只是通过模糊来实现安全 当考