使用Greasemonkey进行跨源资源共享&儿童窗口

时间:2014-01-22 07:17:54

标签: javascript cross-browser xss greasemonkey tampermonkey

我有100%的客户端解决方案。我提出了一个网页请求。 Greasemonkey(GM)脚本被插入页面&重新组织页面(包含一个表)。该表现在具有带有javascript的按钮,以启动与每行相关的窗口,如下所示:

//在父页面中:

var companyTable = data; // a table acquired with XMLHTTPRequest
var chartCode = chartGenFunct.toString(); // funct to gen a chart inserted by GM
var win = window.open('data:text/html;base64,'+ window.btoa(childWindow), '_blank');

其中childWindow字符串包含:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>GM Script Info</title>
        <style type="text/css"></style>
</head>
<body bgcolor="#FFFFFF">


<div id="companyTableDiv"></div>
<div id="companyChartDiv"></div>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>

<script id="XXswScriptInitXX" type="application/javascript">
document.getElementById("companyTableDiv").innerHTML = window.opener.companyTable;
eval(window.opener.chartCode +"showTimeLine()"); // fills CompanyChartDiv

</script>
</body>
</html>

来自上述父母&amp;子代码,你可以看到的想法是将window.opener.chartCode和window.opener.companyTable传递给打开的子窗口。子窗口的多功能框看起来像:

data:text/html;base64,PCFET0NUWVBFIGh0bWwgU...

父窗口的多功能框所在的位置:

http://somewebsite.com/table

这就是我说“一切都在Firefox中运行”的地方。这不适用于使用Tampermonkey(TM)的Chrome。它不起作用的原因是Chrome会根据错误控制台日志记录阻止它,因为它似乎是一个跨源资源共享问题:

  

Uncaught SecurityError:阻止来自“null”的原始帧   访问原点为“http://somewebsite.com”的框架。框架   请求访问具有“数据”协议,正在访问该帧   有一个协议“http”。协议必须匹配。

在线:

document.getElementById("companyTableDiv").innerHTML = window.opener.companyTable;

请记住,这是一个100%的客户端解决方案。如何欺骗Chrome让孩子看到开场白(父母)的数据? (我已经尝试插入document.domain = http://somewebsite.com但这不起作用。)

2 个答案:

答案 0 :(得分:1)

我今天遇到了同样的问题,我的工作解决方案是使用GM值。

以一种触发相同用户脚本的方式打开新窗口。然后你可以创建两个流&#39;数据:在父母和孩子的方向。

例如,这听起来如何在父脚本部分中显示:

var messageFromChild, childStreamControl;
childStreamControl = setInterval(function(){
    messageFromChild = GM_getValue('childStream', 0);
    if(messageFromChild != 0){
        GM_deleteValue('childStream');
        eval(messageFromChild);
    }
}, 50);

广播:

// stream = [preparedMessage1, preparedMessage2...]
var ownStreamControl;
ownStreamControl = setInterval(function(){
    if(GM_getValue('parentStream', 0) != 0 && stream.length > 0){
        GM_setValue('parentStream', stream.unshift());
    }
}, 50);

答案 1 :(得分:0)

我遇到了同样的问题,但我认为我知道一个解决办法,至少在父窗口中可能希望子窗口访问的最多5MB的静态数据。利用“local storage”机制。打开子窗口时,请同时对本地存储执行数据转储。然后子窗口可以访问那里的数据,而不是试图直接从父级获取数据。

请注意,本地存储可能非常短暂,如果在首先对所有内容进行“清除”后,多个网页想要保存一些东西!您的子窗口应该尽可能快地抓取整个数据块 - 然后故意删除它。如果父窗口在后台运行JavaScript,即使子窗口正在执行操作,它也可能会注意到删除,并将新内容放在本地存储中以供子窗口查找....