8

不断收到 CSP 错误:“拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”

问题可能是由于 GWT 生成的 HTML 文件包含内联 JS。

UPD:更改为清单版本 1 有所帮助,但这是一个临时解决方法,因为 Chrome 21 抱怨它将不再受支持。

UPD2: <add-linker name="xsiframe" />也无济于事

4

4 回答 4

9

GWT 2.5.1 终于解决了这个问题。记录这一点的发行说明在这里:

https://developers.google.com/web-toolkit/release-notes#Release_Notes_2_5_1

他们说:

“使用 DirectInstallLinker 构建的应用程序应该在禁止内联脚本的页面中运行(例如 Chrome 扩展程序)”

这意味着现在可以使用 DirectInstallLinker 以满足清单版本 2 关于内联脚本的新安全要求的方式链接您的 Chrome 打包应用程序。也就是说,通过使用 DirectInstallLinker 将您的应用程序与选择作为您的 GWT 版本的 GWT 2.5.1 链接,GWT 不会在其生成的 Javascript 中内嵌任何脚本元素,因此新的清单版本 2 要求没有内联脚本不会被侵犯。

我发现 SingleScriptLinker 似乎也适用于我自己的应用程序;但是,Issue 7685 警告不要使用 SingleScriptLinker,因为“这会生成一个 $doc.write 行,这在打包的应用程序中是被禁止的。” 我自己正在使用 DirectInstallLinker。

这是 DirectInstallLinker 的 Javadoc:

http://google-web-toolkit.googlecode.com/svn/javadoc/2.5/com/google/gwt/core/linker/DirectInstallLinker.html

要使用此链接器,您可以在 *.gwt.xml 文件中包含以下内容:

<define-linker name="dil" class="com.google.gwt.core.linker.DirectInstallLinker"/>
<add-linker name="dil" />

(只要没有破折号或其他非法字符,dil 可以替换为您选择的任何内容)。

您需要选择 GWT 2.5.1 作为您的 GWT 版本。如果您在过时版本的 Eclipse 中使用旧版本的 GWT,例如 Ganymede(就像我一样),您必须至少升级到 Helios,然后将您的项目导入新的 Eclipse 环境。可用于最新三个 Eclipse 版本的 Google Plugin for Eclipse 的存档 URL 可在此处找到:

https://developers.google.com/eclipse/docs/download

有了上面的地方,你应该可以设置

"manifest_version": 2

在您的 manifest.json 文件中,并且不会因为 GWT 生成的内联 Javascript 而遇到任何错误。只要没有其他问题,这应该允许您的 Chrome Web 应用程序被 Chrome 网上应用店接受(现在任何新应用程序或现有应用程序的更新都需要清单版本 2)。

于 2013-05-14T22:05:13.110 回答
5

编辑:报告的新 GWT 错误:http ://code.google.com/p/google-web-toolkit/issues/detail?id=7685 ,另见http://gwt-code-reviews.appspot.com/1838803 /与此错误有关

换句话说,看起来,修复后,您只需使用DirectInstallLinker( <add-linker name='direct_install'/>)。

同时,IIUC,您必须扩展DirectInstallLinker并且:

  • 覆盖以返回没有该部分getJsInstallLocation的副本 ainstallLocaltionIframe.js$wnd
  • 覆盖getModulePrefixvar $wnd = $wnd || window.parent;添加到生成的内容之前super.getModulePrefix

我对 CSP 的了解不足以给出完整的答案,但是 xsiframe 链接器是“可定制的”:创建一个扩展com.google.gwt.core.linker.CrossSiteIframeLinker并覆盖适当方法的类,然后<define-linker><add-linker>您的*.gwt.xml.

例如,getJsInstallLocation默认为com/google/gwt/core/ext/linker/impl/installLocationIframe.js但有一个com/google/gwt/core/ext/linker/impl/installLocationMainWindows.js替代实现。

同样(可能更重要),getJsInstallScript默认为com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js但也有一个com/google/gwt/core/ext/linker/impl/installScriptDirect.js替代实现。

请参阅http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java#204,http:// _ /code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/http://code.google。 com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/core/Core.gwt.xml

于 2012-08-27T22:09:48.337 回答
2

感谢 Thomas Broyer 的建议。我创建了这个 GWT 链接器。现在我的 GWT 应用程序作为 Chrome 应用程序完美运行(在 Chrome 32 和 GWT 2.5.1 上测试)。

公共类 CSPCompatibleLinker 扩展 DirectInstallLinker {

@Override
protected String getJsInstallLocation(LinkerContext context) {
    return "com/google/gwt/core/ext/linker/impl/installLocationMainWindow.js";
} 

}

不要忘记将链接器声明到您的*.gwt.xml 文件中:

<define-linker name="csp" class="com.sfeir.linker.CSPCompatibleLinker"/>
<add-linker name="csp" />
于 2014-01-22T14:22:33.747 回答
0

清单版本 2 不允许内联脚本。您需要确保所有脚本都被链接,并且 HTML 元素中没有 JavaScript。

于 2012-08-25T16:51:16.150 回答