HTTPS 标头或帖子正文更安全吗?

Posted

技术标签:

【中文标题】HTTPS 标头或帖子正文更安全吗?【英文标题】:Is an HTTPS header or a post body more secure? 【发布时间】:2019-07-28 14:30:16 【问题描述】:

发送 HTTPS 请求时,从安全角度来看,标头和帖子正文之间有什么区别吗?是否更容易受到泄漏或拦截?如果有,为什么?

我已经阅读了 GET 与 POST 以及各种身份验证和加密方案之间的比较,但没有关于 Header 与 application/x-www-form-urlencoded Post 正文的比较。我承认我只花了大约 20 分钟的时间进行谷歌搜索和 SO 搜索,如果之前已经介绍过,敬请见谅。


虽然我认为这对所有 HTTPS 流量都是通用的,但我是在 OpenId Connect 的上下文中询问的。我正在使用授权代码授权类型和 Spring Security OAuth 客户端库。

OIDC 规定客户端和授权服务器在将一次性代码交换为持久 id 令牌时可以选择发送凭据的方法。引用openid.net openid-connect-core section 9. Client Authentication:

本节定义了一组客户端身份验证方法,它们是 客户端在使用时用于向授权服务器进行身份验证 令牌端点。在客户端注册期间,RP(客户端)可以 注册客户端身份验证方法。如果没有注册方法, 默认方法是 client_secret_basic。

这些客户端身份验证方法是:

client_secret_basic 已收到 client_secret 值的客户端 从授权服务器向授权进行身份验证 服务器按照 OAuth 2.0 [RFC6749] 的第 2.3.1 节使用 HTTP 基本身份验证方案。

注意,这是Authorization: Basic <value> 标头。我正在与之集成的提供商通过 OpenId client_id 和 client_secret 与冒号和 Base64 编码连接来支持这一点。

client_secret_post 客户 已从授权服务器收到 client_secret 值, 根据章节向授权服务器进行身份验证 OAuth 2.0 [RFC6749] 的 2.3.1 通过在请求正文中包含客户端凭据。

我无法找到任何特定于 OpenId Connect 的内容来表达两种方法之间的偏好。

我正在与允许任一方法的 OIDC 提供程序集成,但您必须选择并且所有相关资源服务器必须符合单一选择。标题和帖子正文都以纯文本形式发送。 (请注意,此提供程序不支持作为敏感密钥的 HMAC SHA 编码版本的 client_secret_jwt 方法或作为公私签名的 private_key_jwt 方法,这两种方法显然都比本质上是纯文本值更安全,但是目前尚不清楚这是否会为 TLS/SSL 加密通信增加任何实际的安全改进。)

【问题讨论】:

您使用的是哪种授权类型?您使用的是什么客户端类型? 【参考方案1】:

OAuth 2.0 更喜欢 HTTP Basic auth 和 states 关于此的以下内容:

不建议使用这两个参数在请求正文中包含客户端凭据,并且应仅限于无法直接使用 HTTP 基本身份验证方案(或其他基于密码的 HTTP 身份验证方案)的客户端。

您可以放心地假设这也转化为 OIDC。

【讨论】:

【参考方案2】:

虽然 Pieter 指出了规范,但我也想到了最佳实践。

鉴于帖子正文可以包含任何信息,因此浏览器、代理实现或 API 无法尊重嵌入正文中的秘密。相比之下,Authorization 标头是由标准 RFC7235 定义和维护的。

4.2. Authorization

“授权”标头字段允许用户代理进行身份验证 本身与原始服务器 - 通常,但不一定,之后 收到 401(未经授权)响应。它的价值包括 包含用户身份验证信息的凭据 被请求资源领域的代理。

关于代理的更多信息,

转发请求的代理不得修改任何授权字段 在那个请求中。请参阅 [RFC7234] 的第 3.2 节了解和 与处理授权字段有关的要求 HTTP 缓存。

因此,作为一个被多方理解的标头应该使其成为传输凭据的最安全方式。希望这个想法能帮助其他人做出设计决定。

【讨论】:

以上是关于HTTPS 标头或帖子正文更安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

T00LS帖子正文XSS

我收到一个 json 帖子的身份验证错误

如何正确格式化发布请求的正文?

无论 Content-Type 标头如何,在 Python Flask 中获取原始 POST 正文

在 laravel 测试中进行多个帖子调用时忽略帖子正文

Jekyll:在另一个帖子中包含一个帖子