21

我在使用以下 Content-Security-Policy HTTP 标头时尝试使用 TinyMCE:

X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; img-src *; media-src *; frame-src *; font-src *; style-src 'self' 'unsafe-inline'; report-uri /:reportcspviolation

我在工具 - JavaScript 控制台中收到以下错误:

Refused to execute JavaScript URL because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 about:blank:1
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 test.xhtml:1
Refused to execute JavaScript URL because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 about:blank:1
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 test.xhtml:1

但是,其中没有可执行的 JS 代码,test.xhtml因为它仅使用外部<script>来处理给定的 CSP 标头。对的引用about:blank也同样无效

任何想法如何找出违反 CSP 的原因在哪里?

Chrome 的内部 JS 调试器似乎无法识别来源。

此外,由于某种原因,Chrome 在工具 - 开发人员工具 - 网络中将 CSP 违规报告显示为“待处理”,但检查要发送的数据不会提供任何额外信息。例子:

{"csp-report":{"document-uri":"about:blank","referrer":"url-of/test.xhtml","violated-directive":"script-src 'self' 'unsafe-eval'","original-policy":"default-src 'self'; script-src 'self' 'unsafe-eval'; img-src *; media-src *; frame-src *; font-src *; style-src 'self' 'unsafe-inline'; report-uri /:reportcspviolation"}}

我能够弄清楚错误消息是关于onclick在 TinyMCE 动态加载的一些 HTML 中使用 eg 属性,但是要查找什么文件?另一个错误可能是一段 TinyMCE HTML,其中一些href具有以开头的值,javascript:但如果没有来自 Chrome 的任何指针,也很难找到。整个设置适用于 Firefox 13(使用相应的 CSP 标头)。

有没有办法让 Chrome 为每个 CSP 违规抛出异常?

4

4 回答 4

8

确保在您的网站上测试 CSP 时禁用所有 Chrome 扩展程序 - 例如,AdBlock 和 PhotoZoom 扩展程序都将它们自己的内联样式添加到触发违规的 DOM(如果您启用了该功能,则随后点击报告 uri ,而其他扩展可能也会这样做。

于 2012-07-06T17:23:45.947 回答
2

虽然这个问题很老了,但答案还是一样的。TinyMCE 编写的默认代码不符合 csp。

Tinymce 将内联 css 插入到它添加 dom 的元素中。不一定要这样,但这是他们写的方式。如果您使用 google 或 firefox 开发工具检查 dom,您可以看到它,这是一个可以在它插入的 iframe 中找到的示例:

<body spellcheck="false" id="tinymce" class="mce-content-body " onload="window.parent.tinymce.get('story_story').fire('load');" contenteditable="true"><p><br></p></body>

浏览器检测到这一点并提出违规报告,因为您的 csp 不允许这样做。有两种方法可以使此错误消失:

1) 将“inline”或“unsafe-inline”添加到该页面的 csp script-src

或者

2) 重新编码 tinymce javascript 文件。这将要求您打开所有 javascript 文件并更改它插入的代码以排除内联 js 部分。然后必须将这些脚本放入插入到 dom 中的脚本文件中,以使代码仍然可以工作。

于 2013-12-08T08:17:56.290 回答
0

如果 TinyMCE iframe 域和您网站的域不同,则无法通过 javascript 访问 iframe 并在控制台中收到错误消息。在这种情况下,没有标题对您没有帮助。iframe 和地址是否在同一个域中?

于 2012-08-14T07:48:05.943 回答
0

这个问题的原因是 TinyMCE 为其编辑器的实现创建了一些隐藏的 iframe 元素。然后 TinyMCE 实现尝试onclick在其中一个 iframe 元素中使用例如内联属性运行 JS,这显然会因 CSP 规则而失败。

通常,如果脚本生成一个新框架(例如about:blank),然后尝试在其中运行一些代码,则 Google Chrome 无法在控制台中提供任何有意义的内容,也无法向 CSP 报告 URL 提供任何内容。你得到的只是about:blank:1.

这是因为 Google Chrome 不会保留有关内联onclick属性来源的信息。基本上,浏览器需要有关document.write()添加行为不端onclick代码的代码的信息!我想为每个人都这样做document.write()对于运行时性能来说太昂贵了。我希望他们能够跟踪创建该特定 iframe 的代码位置,因为这可能有助于跟踪问题的根源。此外,当 TinyMCE 创建了多个不可见的 iframe 元素时,Google Chrome 无法将您指向正确的iframe,因为每个元素的 URL 都about:blank在通过document.write().

Nowadays you can add 'report-sample' to the Content-Security-Policy which may help tracking down the problem a bit. Sometimes you can identify the problematic code from the script sample you get in the report.

于 2019-07-19T09:21:40.937 回答