背景
我写了一个搜索书签的扩展名并打开了用户的网址。
我已经为扩展添加了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)
我是否正确思考?真的有安全问题吗?有没有办法从我的扩展程序“沙盒化”脚本执行,和/或禁用脚本的权限?
对于扩展用户来说这可能是一件非常糟糕的事情,所以请认真考虑这个问题。
答案 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"})));
<强>结果:强>
chrome.tabs.update
不允许跨源XHR。chrome.tabs.executeScript
允许跨源XHR。<强>结论:强>
使用chrome.tabs.update
执行bookmarklet基本上与正常点击书签一样安全,而chrome.tabs.executeScript
不适合执行bookmarklet。
答案 1 :(得分:0)
我认为最安全的解决方案是将脚本附加到脚本标记内的页面。我认为这与普通的bookmarklet工作方式最相似,并且不会给代码额外的权限。如果立即删除脚本可能会更好。