在Google Chrome中调试CSP违规

时间:2012-07-06 10:35:36

标签: javascript security google-chrome tinymce content-security-policy

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

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

但是, test.xhtml 中没有可执行的JS代码,因为它只使用外部<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"}}

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

有没有办法让Chrome针对每次CSP违规都抛出异常?

4 个答案:

答案 0 :(得分:6)

确保在您的网站上测试CSP时禁用所有Chrome扩展程序 - 例如,AdBlock和PhotoZoom扩展程序都会将自己的内联样式添加到DOM中,从而触发违规行为(如果您有该功能已启用,其他扩展程序可能也会这样做。

答案 1 :(得分: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)为你的csp script-src添加'inline'或'unsafe-inline'

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果脚本生成一个新框架(例如about:blank),然后尝试在其中运行一些代码,则Google Chrome无法在Console中提供任何有意义的内容,也不能为CSP重新发送URL提供任何意义。您得到的只是about:blank:1