使用跨框架脚本获取所选文本

时间:2009-03-13 07:02:16

标签: javascript jquery security dom xss

我几个小时以来一直在努力解决问题,我希望在实现目标方面有所帮助,或者确认我正在尝试做的事实际上是不可能的。

我有一个webapp,它从任意网页中选择所选文本(document.getSelection())作为输入。虽然可以使用书签来相当容易地进行这样的脚本编写,但如果我可以使用iframe完成此操作,那么对最终用户来说是最好的。

父框架是我的网站:

$('#frame').load(function(){
    // this event won't be triggered
    $(window).mouseup(function(){
        doStuff(window.getSelection()); 
    });

    // this will throw a security error
    $(window.frames[0].document).mouseup(function(){
        doStuff(window.frames[0].document.getSelection()); 
    });                  
});

任意网站都位于子框架中。除非子文档来自我的域,否则出于XSS安全原因禁止访问。我尝试了多种变体和尝试黑客攻击,包括将iframe src设置为我的域名,并将第三方网址作为参数,然后重定向到第三方网址。从某种意义上说,我很高兴它不起作用(因为如果确实如此,那么XSS安全性还有很长的路要走......)

另一种选择是下载第三方页面并像我的代理服务器一样从我的域中提供它,但我已经遇到了一些文件相对路径的问题,这些问题有时很容易变得绝对,但有时候傻瓜的差事(例如通过脚本访问文件时)。

我的结论是,我可能只是运气不好。也许我的情况的一个重要区别是我只想访问孩子的.getSelection()方法。无需访问cookie或击键或与DOM交互。也许它没有什么区别,但也许它确实如此。

3 个答案:

答案 0 :(得分:0)

您可以尝试代理方法,但插入指向原始域的base标记。那时应该注意这些路径。

即使你能找到它们,我也不会依赖任何XSS黑客攻击 - 它们很可能会得到纠正,而且很可能不会被交叉浏览器。

答案 1 :(得分:0)

一种可能性是使用来自XHR的文本编写iframe的文档,或者使用jQuery的load()函数,这只有在iframe中没有导航的情况下才有效。

答案 2 :(得分:0)

我没有完全阅读你的答案:-)但也许我有一个解决方案, 它涉及两种方式在父框架和子框架之间传递数据。

您可以从子级写入(而不是READ)父级的哈希(哈希是http://url#HASH_PART)。 所以,在父iframe上,只需设置间隔来检查值,比如说每50ms。

function checkHash() {
    if (window.location.hash == "#something") {
        // my child frame set this value using: 
        //parent.window.location.hash = "something";
        doSomething();
    }
}

有关详细信息,或许可以进行父母与子女之间的沟通,那么 可以找到解释此内容(也有演示链接)的完整文章here