【问题标题】:Firefox XPCOM component - Permission denied to call method UnnamedClassFirefox XPCOM 组件 - 调用方法 UnnamedClass 的权限被拒绝
【发布时间】:2008-09-24 15:00:37
【问题描述】:

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。

我收到一个错误:

Permission denied to call method UnnamedClass.Write

【问题讨论】:

  • 您确定要标记此“c++”吗?也许“Javascript”会更合适......就实际问题而言,对不起,我不知道:(
  • 我标记为 C++,因为这是一个 C++ 插件,希望答案是针对 C++ 解决方案的。

标签: firefox xpcom firefox-3


【解决方案1】:

首先,您的 C++ 代码是否真的是 pluginXPCOM component,可能作为 extension 的一部分安装?好像是后者。

如果是这样,它就不能在不受信任的 JS 代码中使用——任何网页或本地 HTML 文件。它完全可以从特权代码中使用,其中最常见的类型是 extension 代码。

您在使用enablePrivilege('UniversalXPConnect') 调用创建组件时正在解决这个问题。这不是真正推荐的,除非它不会分发给用户(因为这个调用会弹出一个令人困惑的框,并且如果您将首选项设置为始终允许 file:// 脚本使用 XPCOM,这可能是一个安全问题,因为并非所有本地页面是可信的 - 想想保存的网页)。

您的Write 调用因同样的原因而失败 - file:// 页面不被信任以使用 XPCOM 组件。如果您在与 Write 调用本身相同的函数中添加另一个 enablePrivilege 调用,您可能可以让它工作。

视情况而定,可能会有更好的解决方案。

如果您的文件必须被视为可信文件,您可能需要将它们打包为扩展程序并通过 chrome:// URL 访问它们。这使这些页面中的代码有权调用任何 XPCOM 组件,包括您的组件。

如果组件的方法可以从任何页面安全使用,或者如果环境受到控制并且浏览器中没有加载不受信任的页面,则可以使组件可访问内容(例如,在 mozilla code 中搜索 nsSidebar 和也适用于nsISecurityCheckedComponent)。

哦,当你在这里没有得到好的答案时,你一定要试试 Mozilla 新闻组/邮件列表。

[编辑回复评论] 考虑将需要调用组件的代码放在 chrome:// 脚本中。或者,您应该能够使用像 this 这样的代码为您的页面“祝福”您的页面(请注意,它与您需要的相反 - 剥夺了 chrome 权限)。

【讨论】:

  • 你是对的。 c++ 代码实际上是一个 XPCOM 组件。这些页面是从自定义协议返回的,是的,它们总是安全的。该组件仅在从协议处理程序返回的页面上下文中是安全的。
  • (在答案正文中回复。评论限于300个字符...)
【解决方案2】:

Main.html 和其他窗口是否以 chrome 权限运行? 如果您“正常”访问 Main.html,只需将其放在 Firefox 的地址栏上,那么它的功能就会受到限制(否则,任意网页都可以完全一样)。

如果您正在创建一个 firefox 插件,请将您的代码放在 XUL 覆盖中。

如果您真的想允许任何网页执行您的插件所做的任何事情,您可以建立一些机制,通过该机制页面可以要求插件使用其 chrome 权限执行操作,然后将结果发送到页面.

如果你不是在做一个 Firefox 扩展......那么我恐怕我误解了一些东西,你能解释一下吗?

【讨论】:

  • main.html 是否以 chrome 权限运行:否。我不确定您将我的代码放在 XUL 覆盖中是什么意思。代码是本机 C++。编译后的 dll 放在 firefox/components 目录下,并在 main.html 中的 javascript 创建它时加载。现在正在研究 XUL 覆盖。谢谢!
猜你喜欢
  • 2014-03-31
  • 2011-08-04
  • 2010-10-28
  • 1970-01-01
  • 2022-11-05
  • 2018-08-19
  • 2015-08-30
相关资源
最近更新 更多