Firefox XPCOM组件-拒绝调用方法UnnamedClass的权限
firefox XPCOM组件可以跨多个页面读取和写入页面内容吗?
设想:
一堆本地HTML和javascript文件。一个" Main.html"文件打开一个窗口" pluginWindow",并使用以下命令创建一个插件:netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); var obj = Components.classes [cid] .createInstance(); plugin = obj.QueryInterface(Components.interfaces.IPlugin); plugin.addObserver(handleEvent);
该插件具有3种方法。
IPlugin.Read从插件读取数据
IPlugin.Write将数据写入插件
IPlugin.addObserver添加一个用于读取的回调处理程序。
然后," Main.html"将调用pluginWindow并尝试调用插件方法Write。
我收到一个错误:
拒绝调用方法UnnamedClass.Write的权限
解决方案
Main.html和其他窗口是否以chrome特权运行?
如果我们"正常"访问Main.html,只需将其放在Firefox的位置栏上,那么它将对其功能有限制(否则,任意网页都可以完全相同)。
如果要创建firefox插件,请将代码放在XUL叠加层中。
如果我们确实希望允许任何网页执行插件所做的任何事情,则可以通过该页面建立某种机制,该页面可以要求插件使用其chrome权限进行操作,然后将结果发送到该页面。
如果我们不使用Firefox扩展程序...那么恐怕我误解了一些内容,我们能进一步解释一下吗?
首先,C ++代码是否真的是插件或者XPCOM组件,可能是扩展的一部分?听起来好像是晚了。
如果是这样,则无法通过不受信任的JS代码在任何网页或者本地HTML文件中使用它。它可以从特权代码中完全使用,特权代码中最常见的类型是扩展代码。
在使用enablePrivilege('UniversalXPConnect')
调用创建组件时,我们正在解决此问题。确实不建议这样做,除非不会将其分发给用户(因为此调用会弹出一个混乱的框,并且如果我们将首选项设置为始终允许file://脚本使用XPCOM,则可能是安全问题,因为并非所有本地页面是可信任的,请认为已保存的网页)。
出于相同的原因,Write
调用失败,原因是不信任file://页面使用XPCOM组件。如果我们在与Write调用本身相同的函数中添加另一个enablePrivilege
调用,则可能可以使其工作。
根据情况,可能有更好的解决方案。
如果文件必须被视为受信任的文件,则可能需要将其打包为扩展名并通过chrome:// URL进行访问。这使这些页面中的代码具有调用任何XPCOM组件(包括XPCOM组件)的权限。
如果可以从任何页面安全使用组件的方法,或者如果环境受到控制并且浏览器中没有加载不受信任的页面,则可以使组件可以访问内容(例如,在mozilla代码中搜索nsSidebar以及nsISecurityCheckedComponent `)。
哦,当我们在这里没有很好的答案时,绝对应该尝试使用mozilla新闻组/邮件列表。
[编辑以回复评论]考虑将需要调用组件的代码放在chrome://脚本中。另外,我们应该能够使用如下代码使用chrome特权"祝福"页面(请注意,它的作用与我们删除chrome特权的相反)。