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

问题描述 投票:0回答:3

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

我有一个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设置为我的域,并以第三方URL作为参数,然后重定向到第三方URL。从某种意义上说,我很高兴它不起作用(因为如果确实如此,那么XSS的安全性还有很长的路要走......)

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

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

javascript jquery security dom xss
3个回答
0
投票

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

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


0
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.