为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检

Posted

技术标签:

【中文标题】为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检【英文标题】:Why do browsers allow setting some headers without CORS, but not others? Trying to avoid preflights为什么浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检 【发布时间】:2020-08-17 04:11:23 【问题描述】:

出于延迟性能原因,我试图避免0 CORS 对授权 GET 请求的预检请求。简单的方法是将访问令牌放入 URL 查询参数中,但这是一种糟糕的安全做法1。

根据这个答案2,浏览器的目标是阻止使用 html 标记(如 imgscript)无法完成的任何事情。但如果是这样,为什么允许设置像AcceptContent-Langage这样的标题?您不能在 img 标签上设置它们。此外,是什么阻止我将访问令牌隐藏在 Accept 标头中,如下所示:

Accept: */*, x-access-token/<access_token>

在这种情况下,浏览器政策似乎没有增加额外的保护,并鼓励开发人员使用不安全的做法或讨厌的黑客行为。我错过了什么?

【问题讨论】:

img 标签解释过于简单了。实现级别的 CORS 策略是基于白名单的,它允许一组限制标头和其他一些东西。如果您有兴趣,可以搜索规范。但回到你的问题,为什么,因为它是白名单基础。 谢谢。但是,考虑到在 Accept 标头中放置任意数据是多么容易,它到底完成了什么? 这很简单,但是可以用这些任意数据做什么呢?不会造成任何伤害。 没有害处,但为了让浏览器开发人员的生活更轻松(并使您的工作更难),实现是基于白名单的。 至于 “为什么允许设置像 AcceptContent-Langage 这样的标题? 这个问题的一部分,请参阅lists.w3.org/Archives/Public/public-webappsec/2013Aug/… 的讨论。 “由于插件,接受是相当随机的。 Accept-Language 和 Content-Language 我想我们认为足够安全。不确定有什么特别有力的理由”“最后,它看起来有些武断,因为它反映了过去 15 年 Web 平台发展的变幻莫测。” 【参考方案1】:

问题是什么?

仅供参考:您实际上没有可以回答的单一问题。你已经有一百万了。

您的标题提出了一个相当哲学的无法回答的问题,但您的帖子要求的是用例的解决方案。

为什么浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?

个人/团队偏见。政治。宗教。

在这种情况下,浏览器政策似乎没有增加额外的保护,并鼓励开发人员使用不安全的做法或讨厌的黑客行为。我错过了什么?

它被称为“安全剧院”。

当了解更多的人做出的政治选择对于那些不具备理解这些事情(或不必实施)知识的人来说似乎很容易(或很难)理解接受它,这样他们就可以继续他们的生活——或者在威瑞信、*** 和其他的情况下——以赚取利润。

为什么允许设置像 Accept 或 Content-Langage 这样的标头?

这些是良性标题,不携带任何特别可识别或敏感的内容

尽量避免使用访问令牌进行预飞行

执行此操作的简单方法是将访问令牌放入 URL 查询参数中,但这是一种糟糕的安全做法。

是和不是。

如果它是会话令牌并且持续 90 天...当然,有一些缺点...假设您没有使用 https(这很糟糕)或者攻击者已经 可以访问用户的机器(通过代码或其他方式)...在这种情况下,攻击者可以访问他们的电子邮件以重置他们的所有密码和登录名,可能还有他们的 MFA(即 iMessage / Authy / LastPass) ...嗯

如果它是非敏感数据(即社交媒体垃圾)上的短暂(“短”意思,比如 15 分钟)令牌,谁在乎?

您还可以制作一个一次性令牌,假设您不将敏感信息放入令牌本身,这会让每个人都开心。

肮脏的想法

您是否考虑过建立一个可以代理请求的端点?这就是现在所有孩子都在做的事情(看看你的 GraphQL)。

如果你足够努力,iframes 总是有一些方法可以被滥用来解决你的问题。它们是网络的 WD-40(或胶带)。 搜索你的感受......你知道这是真的。

【讨论】:

很公平,感谢您的意见!不幸的是,代理不适用于我的情况,因为原因。很可能我会继续使用查询参数,除非遇到缓存问题,否则我可能会使用 Accept hack。 请不要使用接受黑客。但是请限制您的令牌生命周期并整天使用查询。

以上是关于为啥浏览器允许设置一些没有 CORS 的标头,但不允许设置其他标头?试图避免预检的主要内容,如果未能解决你的问题,请参考以下文章

由于浏览器设置的标头,Safari 拒绝重定向 CORS 请求

为啥没有在 CORS 未命中时设置“Vary: Origin”响应?

为啥禁止没有凭据的 CORS?

我没有设置 CORS 标头,即使它已设置。为啥?

为啥浏览器中未设置 res 标头中的 cookie?

CORS XMLHttpRequest 不允许我设置标头