0

我已经为一个问题苦苦挣扎了几个小时,我希望能在实现我的目标方面得到一些帮助,或者确认我正在尝试做的事情实际上是不可能的。

我有一个 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 交互。也许这没有什么不同,但也许确实如此。

4

3 回答 3

0

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

您可以从孩子中写入(而不是读取)父母的哈希(哈希是http://url#HASH_PART)。因此,在父 iframe 上,只需设置间隔来检查值,比如每 50 毫秒。

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

有关更多详细信息,或者进行父子之间的通信,则可以在此处找到解释此问题的完整文章(也有演示链接) 。

于 2011-01-18T16:11:36.240 回答
0

您可以尝试代理方法,但插入指向原始域的基本标记。然后应该注意路径。

即使你能找到它们,我也不会依赖任何 XSS 黑客——它们可能会被纠正,而且很可能不会跨浏览器。

于 2009-03-13T07:38:31.077 回答
0

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

于 2009-03-13T07:42:33.423 回答