【问题标题】:How to create a Content Security Policy to allow a website to work inside an iframe如何创建内容安全策略以允许网站在 iframe 中运行
【发布时间】:2021-09-27 07:50:42
【问题描述】:

我需要第三方网站才能在我网站的 iframe 中运行。第三方网站在 FireFox 的 iframe 中完美运行。在 Chrome 中,出于某种原因,用户只被允许登录,然后他们点击的任何链接都会将他们带回登录页面(这是 iframe 的默认页面)。

所以我寻找了一个解决方案,似乎我需要创建一个内容安全策略。我以前从未使用过内容安全策略,所以我不知道该怎么做。

我遇到了一篇带有元标记示例的帖子,我尝试了其中的几种变体,但无论我如何尝试,在 Chrome 中,页面甚至都无法加载到 iframe 中。

<html>
<head>
<title>Student Portal</title>
<link rel="shortcut icon" href="favicon.ico">
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://<third party site>; img-src https://*; child-src 'self' https://<third party site>; script-src 'self' https://<third party site>; style-src 'self' https://<third party site>;" />
</head>
<body>
<!-- rest of my code -->
</body>
</html>

我也尝试了 &lt;embed&gt; 元素,但得到了相同的结果。

是否有另一种创建内容安全策略的方法,或者可能是其他完整的解决方案?

任何帮助将不胜感激

【问题讨论】:

    标签: html header content-security-policy


    【解决方案1】:

    Content-Security-Policy 不会解决你的问题

    Content-Security-Policy (CSP) 只能限制网页中发生的事情并阻止默认打开的行为。

    最有可能的问题 - SameSite 或 Sec-fetch 标头

    您描述的网站允许框架但阻止登录的问题的最可能原因:

    选项 1:SameSite Cookie 默认

    如果站点没有使用SameSite 参数明确设置登录cookie - 这可能是问题所在。 Firefox 将 cookie 默认设置为不太安全的SameSite=None。 Chrome 将 cookie 默认设置为更安全的 SameSite=Lax(某种)。

    Lax cookie 最终可能会从框架请求中被丢弃(因为它可能是 Clickjacking / CSRF 的一种形式)

    选项 2:站点有一个用于 Fetch metadata request headers 的服务器端处理程序

    根据上下文,该网站可能在服务器端被阻止。 这些功能仅在最近发布的 Firefox 90 中受支持,但在 Chrome 中已有一段时间了。 如果您使用的是 Firefox 90,并且在对该站点的请求中看到了 Sec-Fetch 标头,并且流程正常,那么这不是问题所在。 如果升级到 V90 时它在 FF 中中断 - 类似于 Chrome: 您的问题是其中之一的处理程序:

    Sec-Fetch-Site
    Sec-Fetch-Mode
    Sec-Fetch-User
    Sec-Fetch-Dest
    

    选项 3:还有别的吗?

    分享有关案例/网站的更多信息,我会建议更多选择。

    相关:CSP 使用示例

    默认情况下,您可以在您的站点中构建任何其他站点。这是网络的开放性。 但是,您可以使用 CSP 阻止来自您网站的 iframe:

    Content-Security-Policy:frame-src 'none';

    同样,网站可以通过设置X-frame-options:deny: 的(更好的)等价物来拒绝使用 CSP 陷害:

    Content-Security-Policy:frame-ancestors 'none';

    附言不要使用 CSP 元标记

    通过 html 元标头为 CSP 提供服务被认为是遗留问题,并且在多个浏览器边缘情况下存在一些缺点。仅通过请求的 HTTP 标头设置 CSP。

    More info on &lt;meta&gt; bugs

    【讨论】:

    • 谢谢你。我偶然发现了这个帖子:stackoverflow.com/questions/58191969/…,我把它发给了第三方网站的开发者。希望这能解决问题。我会在收到他们的回复后立即提供更新。
    • 请在每次提及时披露您与 RapidSec 的关系。请不要只是回答可以推广产品的问题。这是spam
    • @ShaiAlon,您几乎所有的帖子都链接到您自己的产品。正如我提供的“不要成为垃圾邮件发送者”链接所说,“您必须在您的回答中披露您的从属关系”。
    • 对于您对其他用户违反规则的评论,所有用户应保持相同的质量标准。有超过 1500 万注册用户,如果其他人在做同样的事情,他们可能还没有被抓到。不要以别人的不良行为为自己的借口。 (而且我不知道“用户授权”是谁。用户名在这里不是唯一的。)
    • 您无法知道谁对您的答案投了反对票。甚至elected diamond moderators can't see who cast up or downvotes。还有automated systems in place to detect and correct vote fraud。不要以为有人会来抓你。在这里做那种事情是相当困难的。
    【解决方案2】:

    尝试为 iframe 添加沙盒属性

    <iframe sandbox></iframe>
    

    【讨论】:

    • 我添加了沙盒属性,一切都在 FireFox 中运行,但现在我什至无法登录 Chrome。沙盒属性基本上是使第三方页面无响应。还有其他建议吗?
    猜你喜欢
    • 2019-08-10
    • 2016-06-28
    • 1970-01-01
    • 2020-10-19
    • 2017-06-16
    • 2023-02-09
    • 1970-01-01
    • 2019-01-03
    • 2019-05-25
    相关资源
    最近更新 更多