我正在尝试使用MathJax作为我们使用非常严格的内容安全策略 (CSP)的 Web 应用程序的一部分。问题是 MathJax 被编码为使用eval()
[确切地说,以Function()
] 的形式,默认情况下 CSP 认为它不安全。
我目前正在使用以下 CSP 标头:
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()
. 我试图只允许Function()
位于 path 下同一原点内的 MathJax 的 unsafe-eval (即)/:static/math/
。为此,我尝试添加
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 控制台(位于工具 - Web 开发人员)的错误消息:
[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 的自定义 localhost 端口运行测试,以防万一。前面的冒号static
不是错字,我保留所有以冒号开头的路径部分供内部使用应用程序,所有用户内容都可以自由定义其他 URL。)
我对unsafe-eval
属性的使用是不正确的,还是不可能只对“自我”的子集允许不安全评估?目的是只允许 unsafe-eval 用于相同的源路径前缀/:static/math
,严格的 CSP JS 代码执行 ' self
' 并且不允许任何其他方法的 JS 代码。