从扩展程序执行bookmarklet是否安全?

时间:2013-02-19 12:25:05

标签: javascript google-chrome google-chrome-extension bookmarklet

背景

我写了一个搜索书签的扩展名并打开了用户的网址。

我已经为扩展添加了JavaScript bookmarklet支持,现在它通过类似于此代码的方式调用脚本:

var bookmark_address; // the address containing javascript:blah();
var js = bookmark_address.substr(11);
chrome.tabs.executeScript({'code': js});

以前我一直在使用这段代码:

var bookmark_address; // the address containing javascript:blah();
chrome.tabs.update({'url': bookmark_address});

第一个似乎更好,但它们实际上没有太大差异。它们都需要权限["tabs", "<all_urls>"]。我现在只在用户选择启用bookmarklet支持时才会请求权限(optional permissions)。

问题:

我只是想到了安全问题。用户添加了书签,因此它们通常安全,但由于我的扩展程序“调用”了脚本,因此会在我的扩展程序的上下文中执行。该脚本将能够搞乱我的扩展的本地存储和变量。 此外,执行的脚本可能有权执行跨源XMLHttpRequest (Docs)

我是否正确思考?真的有安全问题吗?有没有办法从我的扩展程序“沙盒化”脚本执行,和/或禁用脚本的权限?

对于扩展用户来说这可能是一件非常糟糕的事情,所以请认真考虑这个问题。

2 个答案:

答案 0 :(得分:1)

使用以下书签(当然附加了javascript:)测试了跨源XHR:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
        console.log(xhr.responseText);
    }
};
xhr.open("POST", "http://jsfiddle.net/echo/json/", true);
xhr.send("json=" + encodeURIComponent(JSON.stringify({"foo": "bar"})));

<强>结果:

  • 点击书签允许跨源XHR。
  • 使用chrome.tabs.update 允许跨源XHR。
  • 使用chrome.tabs.executeScript 允许跨源XHR。

<强>结论:

使用chrome.tabs.update执行bookmarklet基本上与正常点击书签一样安全,而chrome.tabs.executeScript 适合执行bookmarklet。

答案 1 :(得分:0)

我认为最安全的解决方案是将脚本附加到脚本标记内的页面。我认为这与普通的bookmarklet工作方式最相似,并且不会给代码额外的权限。如果立即删除脚本可能会更好。