我正在使用Add-on SDK创建Firefox插件。我想从远程URL获取数据并将其注入当前的html。截至目前,我可以使用Firefox插件sdk的请求模块获取数据,但是无法将其注入当前页面。
例如:我正在从网站“abc.com”获取回复。在获取回复之后我将通过回复扩充当前页面
// main.js
var widgets = require("sdk/widget");
var tabs = require("sdk/tabs");
var Request = require("sdk/request").Request;
//create addon widget
var widget = widgets.Widget({
id: "div-show",
label: "Show divs",
contentURL: "http://www.mozilla.org/favicon.ico",
onClick: function() {
//initializing request module to fetch content
quijote.get();
}
});
//fetch content of requested page
var quijote = Request({
url: "http://localhost/abc/",
overrideMimeType: "text/plain; charset=latin1",
onComplete: function (response) {
//check if content is fetched successfully
addContent(response);
}
});
//try and modify current page
function addContent(response){
//initialize page modification module
var pageMod = require("sdk/page-mod");
tabs.activeTab.attach({
contentScript: 'document.body.innerHTML = ' + ' "<h1>'+response.text+'</h1>";'
});
}
他们可以通过哪种方式扩充我当前的页面???
答案 0 :(得分:1)
您的代码会严重失败,例如当response.text
包含双引号时。
那么你的代码就是(假设它是<a href="hello">world</a>
):
document.body.innerHTML = "<h1><a href="hello">world</a></h1>";
这显然是无效的代码。
您的代码基本上是根据未经过处理的数据构建动态脚本,这是一个坏主意,因为(除了上面的转义问题)
这是一个等同于SQL注入攻击的网页....
var worker = tabs.activeTab.attach({
contentScript: 'self.port.on("setdom", function(data) { ' +
+ 'document.body.innerHTML = data; /* still a security issue! */'
+ '});'
});
worker.port.emit("setdom", response.text);
这可以保证内容脚本有效(甚至可以运行)并且不会运行任意代码。
然而2.)仍然是个问题。阅读DOM Building and HTML insertion。