- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 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 代码。
最佳答案
有多个问题:
Content-Security-Policy
(CSP) header 不能以这种方式工作。 CSP 只有单个主机+端口组合(源)的粒度。如果你不能让所有脚本都有 unsafe-eval
,那么任何脚本都不能拥有它。唯一可能的解决方法是不使用需要 unsafe-eval
的脚本(幸运的是,MathJax 不再需要 unsafe-eval
,因为 MathJax bug 256 已修复)。
allow
语法是旧的 Mozilla 变体,不应使用。当前的语法是说 default-src
后跟允许作为所有源的方案或主机名或来源,然后覆盖每个子类型的默认值(例如 script-src
) 根据需要。除了 self
之外,某些来源可能还支持其他来源关键字。例如,script-src
支持 unsafe-eval
,这意味着允许执行的任何脚本都可以运行 eval() 或 Function(),并且 unsafe-inline
意味着任何可以支持某种内联脚本的标记都可以执行。允许 unsafe-eval
可能是可以接受的,但是 unsafe-inline
几乎不适合 script-src(否则,您根本不应该为 CSP 而烦恼)。
script-src
的正确语法如下:
script-src 'self' cdnjs.cloudflare.com
结合从 https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js 加载 MathJax
MathJax 还使用内联样式属性,因此需要以下内容(除非已经允许),否则 MathJax 将在尝试呈现数学时引发 Exception
:
style-src 'self' 'unsafe-inline'
不可能使用 CSP 来允许 JS 插入样式属性并且没有样式属性已经插入到 HTML 源中才能生效。
似乎 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-Policy
或X-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/
我想知道这在 SQL 中是否可行。假设您有两个表 A 和 B,并且您对表 A 进行选择并在表 B 上进行联接: SELECT a.*, b.* FROM TABLE_A a JOIN TABLE_B
我认为这只是一个一般的 C++ 问题: 我正在尝试使用 gnu c++ 编译器在 Linux Fedora 上编译本地版本的 ffmpeg。我的源代码位于以下一堆文件夹中: ~//Downloads/
我听说在 Linux 上编译 PHP 时设置 --prefix=PREFIX 选项将允许您一次安装多个 PHP 而不会发生冲突。 (我认为如果未设置默认值是 /usr/local)。但是,我不确定它到
我有以下 conda 环境文件 environment.yml: name: testproject channels: - defaults dependencies: - python=3.7 p
目前在我的 Makefile 中我有: prefix ?= /usr/local 这样我就可以在调用 make 时覆盖 prefix 值,如下所示: make prefix="/new_path" 我
我正在尝试创建一个计算 pptx 中单词的函数文档。问题是我不知道如何只找到这种标签: Some Text 当我尝试:print xmlTree.findall('.//a:t') , 它返回 Syn
gitconfig(1) : If not set explicitly with --file, there are four files where git config will search
嗨,我是 Spring MVC 的新手,我正在关注 Spring 引用文档,我对 View 解析器有疑问。这是我的示例代码。 @Controller @RequestMapping("/form")
我一般都是通过pip安装python包的。 对于 Google App Engine,我需要将包安装到另一个目标目录。 我试过了: pip install -I flask-restful --tar
我对一些使用指令 ngb-pagination 的组件进行了 Angular 测试。来自 ng-bootstrap . 现在,在我的测试中,我模拟这个组件如下: // on next line I g
我无法运行npm install npm@latest -g,而不会遇到权限错误并被迫使用sudo npm install npm@latest -g。我可以在不使用 sudo 的情况下运行它,但是
假设我有一个字符串公式,它的格式是:“func(a+b,c)”,其中func是一个定制函数,这个字符串同时包含中缀(即+)和前缀(即func)表示,我想将其转换为具有所有前缀表示的字符串,“func(
我已经写下了一个简单的函数来确定 str1 是否是 str2 的前缀。这是一个非常简单的函数,看起来像这样(在 JS 中): function isPrefix(str1, str2) // dete
我们有 git remote add origin http://...避免重复输入实际的源代码库路径。但是如何git subtree --prefix=... ?每次拉/推子树内容时,很难跟踪、记住
我的 travis 工作遇到了以下问题: Process Output:Could not find platform independent libraries Process Output:Co
我正在阅读 Artifice 的来源并看到: module Artifice NET_HTTP = ::Net::HTTP # ... end 行:https://github.com/wyc
我正在阅读有关 Angular 路由的文档并创建了一个简单的测试: const routes: Route[] = [ { path: '', redirectTo: '/home', pat
所以使用 Material 我们有一些代码来问一个问题,我们想在输入的前面添加一个 $ 符号或使用占位符。在这个垫子字段内部,我们还有一个垫子标签。如果我使用 matprefix,它会将美元符号放在标
目前我希望为 Apache Mesos 编写一个脚本来启动主/从(在 2 个不同的节点上)。 我有引用http://mesos.apache.org/documentation/latest/depl
我已为文档建立索引,每个文档都有一个字段:“CodeName”,其值类似于以下内容: document 1 has CodeName: "AAA01" document 2 has CodeName:
我是一名优秀的程序员,十分优秀!