gpt4 book ai didi

javascript - CSP : How to allow unsafe-eval for a given URI prefix (Firefox)

转载 作者:可可西里 更新时间:2023-11-01 01:40:55 27 4
gpt4 key购买 nike

我正在尝试使用 MathJax作为我们网络应用程序的一部分,它使用非常严格的 Content Security Policy (CSP) .问题是 MathJax 被编码为使用 eval() [确切地说,以 Function() 的形式],默认情况下 CSP 认为它不安全。

我目前正在使用以下 CSP header :

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation';

这会导致 MathJax 2.0 代码失败,因为它使用了 Function()。我试图仅对位于路径 /:static/math/ 下同一原点内的 MathJax 允许不安全求值(即 Function())。为此,我尝试添加

unsafe-eval '/:static/math/*'

使完整的标题看起来像

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; unsafe-eval '/:static/math/*'

但我仍然无法在 Firefox 13.0 上运行代码。我在 Firefox Web 控制台(位于 Tools - Web Developer 中)收到一条错误消息:

[10:09:59.072] call to Function() blocked by CSP @ http://localhost:8080/:static/math/2.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML:29

但是,我没有收到“report-uri”的 CSP 报告。 (如您所见,我目前正在通过不使用 SSL 的自定义本地主机端口运行测试,以防万一。static 之前的冒号不是拼写错误,我保留所有路径部分开始带有冒号的应用程序内部使用,所有用户内容都可以自由定义其他 URL。)

我对 unsafe-eval 属性的使用是否不正确,或者是否不可能仅对“self”的子集允许 unsafe-eval?目的是允许不安全-仅对同源路径前缀 /:static/math 进行评估,对“self”执行严格的 CSP JS 代码,对任何其他方法都没有 JS 代码。

最佳答案

有多个问题:

  1. Content-Security-Policy (CSP) header 不能以这种方式工作。 CSP 只有单个主机+端口组合(源)的粒度。如果你不能让所有脚本都有 unsafe-eval,那么任何脚本都不能拥有它。唯一可能的解决方法是不使用需要 unsafe-eval 的脚本(幸运的是,MathJax 不再需要 unsafe-eval,因为 MathJax bug 256 已修复)。

  2. allow 语法是旧的 Mozilla 变体,不应使用。当前的语法是说 default-src 后跟允许作为所有源的方案或主机名或来源,然后覆盖每个子类型的默认值(例如 script-src) 根据需要。除了 self 之外,某些来源可能还支持其他来源关键字。例如,script-src 支持 unsafe-eval,这意味着允许执行的任何脚本都可以运行 eval() 或 Function(),并且 unsafe-inline 意味着任何可以支持某种内联脚本的标记都可以执行。允许 unsafe-eval 可能是可以接受的,但是 unsafe-inline 几乎不适合 script-src(否则,您根本不应该为 CSP 而烦恼)。

  3. script-src 的正确语法如下:

     script-src 'self' cdnjs.cloudflare.com

    结合从 https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js 加载 MathJax

  4. MathJax 还使用内联样式属性,因此需要以下内容(除非已经允许),否则 MathJax 将在尝试呈现数学时引发 Exception:

     style-src 'self' 'unsafe-inline'

    不可能使用 CSP 来允许 JS 插入样式属性并且没有样式属性已经插入到 HTML 源中才能生效。

  5. 似乎 Firefox 13.0(至少)不会在违反 CSP 的情况下立即“报警”。大多数违规报告确实是在事件发生后的一段时间内提交的。 Chrome 似乎更积极地提交报告,这将使它更容易测试。根据我的经验,Firefox 并不总是发送 CSP 报告——它可能使用某种启发式方法来不发送重复的消息。

最后,要使 MathJax 与 Content-Security-Protection 一起工作,您需要以下 header (假设您通过 CDNJS 使用 MathJax):

Content-Security-Policy: default-src 'self'; script-src 'self' cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline';

旧版浏览器(例如 Firefox 13)过去需要额外的参数,例如 options 或需要使用非标准的标题名称,例如 X-Content-Security-PolicyX-WebKit-CSP。这些 hack 不再需要,因为现在用户代理支持标准 header 。 (与 MS Edge 相反,MSIE 除外。)

2021 年更新:

CSP 版本 2 也允许在 origins 中指定路径。但是,请注意 using paths is a breaking change其中向后兼容性有点未知。有问题的部分是服务器在知道用户代理支持 CSP1 还是 CSP2 之前需要发出 CSP header 。

关于javascript - CSP : How to allow unsafe-eval for a given URI prefix (Firefox),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10944794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com