1

背景:从扩展中执行书签是否安全?

我写了一个扩展来搜索书签并打开用户的URL。

我已经添加书签的JavaScript支持扩展,现在它是由类似这样的东西代码调用脚本:

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

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

以前我曾使用此代码被第一个看起来更好,但实际上并没有太大的区别。他们都需要权限["tabs", "<all_urls>"]。我现在只在用户选择启用小书签支持时请求权限(由optional permissions)。

问题:

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

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

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

回答

1

测试跨来源XHR具有以下书签(当然与javascript:所附):

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。

0

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