我试图了解浏览器的相同原始政策。事实上,事情似乎没问题。所以我现在正尝试使用一个小型演示来实际理解它。
我在wamp上托管了2个域名,即域名网站1和域名网站
domain1.com由javascript文件夹中的index.php,innocent.php和2个js文件组成,即dom1_javascript.js和dom1_normal.js
以下是上述文件的详细信息: -
的index.php
<?php
$value = "domain 1 cookie";
// send a simple cookie
setcookie("Dom1Cookie",$value);
?>
<html>
<script type="text/javascript" src="../javascript/dom1_javascript.js">
</script>
<body>
this is from doamin 1
</body>
</html>
innocent.php
<?php
$userSecret=$_GET['userCreds'];
if($userSecret)
{
echo "the user's secret is "+$userSecret;
}
else
{
echo "sorry user secret not found";
}
?>
dom1_javascript.js
alert(document.cookie);
dom1_normal.js
alert("alert domain 1");
alert(document.cookie);
//referring the div
var bdy=null;
// creating the form
var secretForm=document.createElement("form");
secretForm.id="goodForm";
secretForm.method="get";
var myQryStr="http://domain1.com/innocent.php?userCreds=abcd";
alert(myQryStr);
secretForm.action=myQryStr;
//creating the text box in the form
var hiddenBox=document.createElement("input");
hiddenBox.type="text";
hiddenBox.name="secBox";
hiddenBox.value="abhinav";
//appending the box to the form
secretForm.appendChild(hiddenBox);
//appending the form to the div
bdy=document.getElementById("mydiv");
alert(bdy);
bdy.appendChild(secretForm);
//submitting the form
document.getElementById("goodForm").submit();
domain2.com由index.php的两个版本组成,即viz,index.php和index1.php
以上是php文件的详细信息: -
的index.php
<?php
$value = "domain 2 cookie";
// send a simple cookie
setcookie("Dom2Cookie",$value);
?>
<html>
<head>
<script type="text/javascript" src="http://domain1.com/javascript/dom1_javascript.js">
</script>
</head>
<body>
<div id="mydiv">
<img src="http://domain1.com/images/dom1.bmp"/>
this is from doamin 2
</div>
</body>
</html>
index1.php
<?php
$value = "domain 2 cookie";
// send a simple cookie
setcookie("Dom2Cookie",$value);
?>
<html>
<head>
<script type="text/javascript" src="http://domain1.com/javascript/dom1_normal.js">
</script>
</head>
<body>
<div id="mydiv">
<img src="http://domain1.com/images/dom1.bmp"/>
this is from doamin 2
</div>
</body>
</html>
我使用firefox作为浏览器来测试这些scritps。 首先,我在浏览器中转到domain1.com。这将设置domain1 cookie。然后我转到domain2.com/index.php 正如所料,domain2 / index.php上的脚本设置了domain2 cookie。然后加载来自domain1的javascript,说明
alert(document.cookie)
此脚本的执行会警告domain2 cookie值。
假设1: - 所以我的理解是,由于浏览器的原始策略相同,即使脚本是从domain1调用的,它也不会警告domain1 cookie,而是警告domain2 cookie。
如果我在上述假设中是正确的,请告诉我?
现在我清除浏览器缓存并从浏览器中删除所有cookie。再次运行domain1.com,再次设置domain1 cookie。然后,这次我转到domain2.com/index1.php,为domain2设置cookie,然后访问
中的脚本domain1.com/javascript/dom1_normal.js
现在,如果我的假设1是正确的,(即在domain2.com中导入时来自domain1.com的javascript将仅参考domain2执行,而不是根据相同的原始策略执行其传入域),在这种情况下也应该与dom1_normal.js相同。所以dom1_normal.js中的javascript应该可以访问domain2 / index1.php中的所有HTML元素。事实并非如此确认
bdy=document.getElementById("mydiv");
alert(bdy);
在domain1.com/javascript/dom1_normal.js中提醒null
请告诉我哪里出错了。我已经经历了十几次讨论(关于堆栈溢出和其他地方,包括MDN,wiki,谷歌等)以及关于相同来源政策的文章,但没有一个能让我明白这个想法。
答案 0 :(得分:1)
Same-Origin策略与加载JavaScript没有太大关系。无论脚本来自何处,其操作都在主页的 aegis 域下进行。因此,如果您的主页来自“domain1”,那么所有脚本都在“domain1”的上下文中执行,无论它们来自该域还是任何其他域。
请注意,无法访问从其他域加载的脚本的源代码。
您的“dom1_normal”脚本为该元素引用报告“null”的原因可能是因为您在<body>
之前导入了脚本。 DOM是以增量方式构建的,但脚本在加载时会同步运行,因此如果您在<{em> getElementById()
标记之后为某个元素调用<script>
,则不会那里。