更改html页面内容

时间:2013-09-24 11:15:22

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在使用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>";'
    });
}

他们可以通过哪种方式扩充我当前的页面???

1 个答案:

答案 0 :(得分:1)

您的代码会严重失败,例如当response.text包含双引号时。 那么你的代码就是(假设它是<a href="hello">world</a>):

document.body.innerHTML = "<h1><a href="hello">world</a></h1>";

这显然是无效的代码。

您的代码基本上是根据未经过处理的数据构建动态脚本,这是一个坏主意,因为(除了上面的转义问题)

  1. 如果该代码甚至有效且
  2. ,您将运行未经过规范化的内容脚本
  3. 如果成功,页面也可以运行未经过验证的代码。
  4. 这是一个等同于SQL注入攻击的网页....

    首先,我们使用messagingmore)来解决1.):

    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