在Chrome包应用中评估

Cha*_*les 26 javascript google-chrome eval google-chrome-extension google-chrome-app

我想创建一个包app chrome扩展,以允许用户编写和执行javascript代码(如javascript控制台).

我想使用该eval()函数来执行JS代码.

eval从chrome扩展调用时,经典的javascript 函数会抛出错误:

未捕获的错误:对于此上下文不允许从字符串生成代码

eval在chrome扩展程序中使用,人们需要使用沙箱,但是当我在清单中编写沙箱时,我收到此错误:

尝试安装此扩展时出现警告:指定的包类型(主题,应用程序等)不允许使用"sandbox".

UPDATE

根据这个问题,包应用程序不支持沙箱,所以我有两个问题:

  1. 还有其他方法可以代替eval()吗?

  2. eval没有沙盒可以使用吗?(我想可能不是出于安全考虑?)

aps*_*ers 30

更新:

自2013年1月至今,Chrome现在允许unsafe-eval内容安全策略(CSP)指令,该指令允许eval在沙箱之外执行:

针对该政策eval()及其亲属一样setTimeout(String),setInterval(String)以及new Function(String)可以通过添加适当放宽'unsafe-eval'您的保单

向扩展程序清单添加适当的CSP,例如:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
Run Code Online (Sandbox Code Playgroud)

您引用错误现已标记fixed,并且自Chrome 22以来已包含在内.

在引入之前'unsafe-eval',没有办法让manifest_version: 2扩展的CSP 允许执行任意文本作为代码. 当时,Google明确表示没有办法删除此限制(在沙盒之外):

内联JavaScript以及危险的字符串到JavaScript方法eval都不会被执行......没有放松限制执行内联JavaScript的机制.特别是,设置包含的脚本策略unsafe-inline将不起作用.这是故意的.

如上所述,现在可以放宽这种限制.

  • 我只想补充说,此方法仅适用于扩展,而不适用于[打包应用](https://developer.chrome.com/apps/contentSecurityPolicy#what)(因为线程的标题是指打包的应用). (2认同)

man*_*ini 6

我想你在谈论新的打包应用程序(清单版本2),对吧?

Sandboxes绝对可以在新的打包应用程序中使用.上周我刚上传了一个样本,它正是这样做的:一个窗口向一个隐藏的沙盒iframe发送一条消息,iframe编译一个把手模板(这里它可以使用eval代替)并将编译后的HTML返回到托管页面,显示结果.

您还可以查看其他样本,它完全符合您的要求.

所以,直接回答你的问题:

1)否,因为CSP的限制.评估Chrome打包应用中动态JavaScript的唯一方法是沙盒iframe.如果这不是您应用的选项,您还可以发送和评估服务器中的JavaScript内容,并仅将结果返回给用户(尽管这会破坏Chrome Packaged Apps的离线功能)

2)不,你只能在沙盒iframe中使用eval().