为啥浏览器允许设置一些没有 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 标记(如 img
或 script
)无法完成的任何事情。但如果是这样,为什么允许设置像Accept
或Content-Langage
这样的标题?您不能在 img
标签上设置它们。此外,是什么阻止我将访问令牌隐藏在 Accept
标头中,如下所示:
Accept: */*, x-access-token/<access_token>
在这种情况下,浏览器政策似乎没有增加额外的保护,并鼓励开发人员使用不安全的做法或讨厌的黑客行为。我错过了什么?
【问题讨论】:
img 标签解释过于简单了。实现级别的 CORS 策略是基于白名单的,它允许一组限制标头和其他一些东西。如果您有兴趣,可以搜索规范。但回到你的问题,为什么,因为它是白名单基础。 谢谢。但是,考虑到在 Accept 标头中放置任意数据是多么容易,它到底完成了什么? 这很简单,但是可以用这些任意数据做什么呢?不会造成任何伤害。 没有害处,但为了让浏览器开发人员的生活更轻松(并使您的工作更难),实现是基于白名单的。 至于 “为什么允许设置像Accept
或 Content-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 请求