-1

我正在尝试在 FireFox 的网页上使用本地图像。问题是无论我做什么,我都会看到一条安全消息并且图像不会加载:

Security Error: Content at http://domain.com/ may not load or link to file:///E:/path/to/file/file.png.

我将以下内容放入user.js并将该文件复制到 FireFox 配置文件目录中。

user_pref("capability.policy.policynames", "localfilelinks");
user_pref("capability.policy.localfilelinks.sites",  'http://domain.com');
user_pref("capability.policy.localfilelinks.checkloaduri.enabled", "allAccess");

我想要做的是添加 css 文件并使用它来设置页面样式。

编辑: 我写了一个扩展来改变 HTTP 响应并用本地文件替换远程 css 文件。但正如我所说,Firefox 会阻止加载本地 css 文件。

编辑 2
请不要这个问题 中删除firefox-addon标签。

4

3 回答 3

2

不要这样做 -file://出于某种原因,对协议的访问已被锁定。如果您的目标是用本地数据替换图像,那么就不要使用该file://协议,还有很多其他可用的协议。例如,您可以使用该data:协议。这是作为data:URL 的 SO 图标:

数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAABrUlEQVR42mNkwAOepOgxMTD9mwhk5gDxQSB2l5l15SeyGkYGAuBJMtAQ5n%2BrgcwgIF4ENCCeJAOghvADXbIHqNoEyK0BGtKK14DXU9lAThZiYPw%2FXTTr92uId3SVgKoPA8WkgNxIoCErsBrwdhoL57%2F%2FTGeATC0gfgVUMRlo%2B2zRjD8vn6RrmzH8ZT4E5IOU%2BgAN2YNhwMOJ%2FEy8bJ%2BVgGYnAQ3K%2FF%2BfkQco%2FAYYDjP%2BfeHs%2FfNQyub%2FN44NQJe0ysy5VI83DF5M5pRkY%2FmVyfCfIRtomNB%2Fpv9v%2F%2F9infbnucgZ5l%2FMW8T7HvxDMWB9hT3nXwbmrH% 2F%2FmO4Bubc4Wb%2Ff9W09%2BuNmjwQPP%2FvHNHaWXwX%2FGf7LsjD9k%2BFLZ3iKEQYbKmy1%2FjKwXIXx%2F%2F1nfPvvP%2FMVJsZ%2FRzlYfpwX4nj%2FT5zrNbtK8evlWGNhcYU3Px%2FDR%2BF%2FDExGQK4pEKsCseJ%2FoDKgF0AGMvxjZLIP79xzCMWA3Jyc%2FyB68pQpGGEyuyJEhJXhtwYLELMx%2FNL9wcDRcfqLwjOYegwDYGxcAFkNbQxgIALgNIBUQBUDAFi2whGNUZ3eAAAAAElFTkSuQmCC

这个 URL 很容易生成:

var url = "data:image/png;base64," + btoa(imageData);

或者,您可以使用resource://可以映射到磁盘上目录的 URL,nsIResProtocolHandler但这更复杂。请记住,所有网站都可以访问映射目录的所有内容。您应该确保它不包含任何敏感信息。

提问者:* 我添加了链接的内容:

var ioService = Components.classes["@mozilla.org/network/io-service;1"]
                          .getService(Components.interfaces.nsIIOService);
var resProt = ioService.getProtocolHandler("resource")
                       .QueryInterface(Components.interfaces.nsIResProtocolHandler);

var aliasFile = Components.classes["@mozilla.org/file/local;1"]
                          .createInstance(Components.interfaces.nsILocalFile);
aliasFile.initWithPath("/some/absolute/path");

var aliasURI = ioService.newFileURI(aliasFile);
resProt.setSubstitution("myalias", aliasURI);

// assuming the code modules are in the alias folder itself
于 2012-10-05T14:04:48.977 回答
0

那是对的。尝试直接从用户的文件系统中使用图像是一个安全漏洞。较新的浏览器已经实现了 FileReader API,它允许您以安全的方式访问用户的文件。

这里有一些例子:

http://www.html5rocks.com/en/tutorials/file/dndfiles/

http://html5demos.com/file-api

于 2012-10-05T12:16:26.507 回答
0

我怀疑这是否值得但您可以将httpd.js其用作 XPCOM 组件。

编辑:我刚刚意识到附加 SDK 提供httpd.js

于 2012-10-07T17:57:59.390 回答