Chrome在重定向时忽略了标头中的CSP指令

3

我正在实现一个OpenID Connect客户端Web应用程序。用户在身份提供者中成功验证后,他们被重定向回我的Web应用程序。一旦到达,根据一些查询参数的值,他们会被重定向到一个URL。当重定向发生时,Chrome在控制台中抛出以下错误:

Refused to send form data to 'https://my-domain-a.com/' because it violates the following Content Security Policy directive: "form-action 'self' https://my-domain-b.com/receive-token".

经过一些搜索,我尝试添加一个Content-Security-Policy标头,如下所示:

content-security-policy: form-action 'self' https://my-domain-a.com

但这似乎没有任何影响,并且我仍然收到此消息。

我有2个问题:

  1. 我该如何解决这个问题?

  2. 为什么Chrome在301重定向时会抛出此错误?

1个回答

5
经过反复搜索和试验,我终于找到了为什么会出现这种问题的原因,并提供了(丑陋的)解决方案。
在我的实验中,我注意到所有的Chromium浏览器派生程序(Chromium、Chrome和Vivaldi)都有这个问题,而非Chromium浏览器派生程序(Firefox和Safari)则没有。事实证明,身份验证提供者设置了一个内容安全策略指令:form-action 'self' https://my-domain-b.com/receive-token。由于浏览器从身份验证提供者重定向到my-domain-b.com,再到my-domain-a.com,因此Chromium派生程序将从my-domain-b.commy-domain-a.com的重定向标记为违反身份验证提供者设置的内容安全策略。不幸的是,我对规范的了解还不够,不能确定这两种不同浏览器所表现出的行为哪一种是最正确的...
我通过一种相当丑陋的hack来解决这个问题。与其从my-domain-b.commy-domain-a.com进行301重定向,我改为让my-domain-b.com呈现一个简单的HTML页面,该页面立即提交到my-domain-a.com<html><body onload="window.location='https://my-domain-a.com?my_param=my_value'"/></html> 这个解决方案满足了Chromium派生程序,因为不再有重定向到未识别域名的情况。在我的情况下,使用Javascript是可接受的,因为用户被重定向到的站点是一个Angular应用程序,所以用户必须启用Javascript。

1
可以在此处找到关于这种有意不同行为的长时间讨论,包括背景(例如 https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet):https://github.com/w3c/webappsec-csp/issues/8 - RiZKiT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接