javascript和同源策略混淆

时间:2013-06-22 13:25:15

标签: javascript html forms browser same-origin-policy

我试图了解浏览器的相同原始政策。事实上,事情似乎没问题。所以我现在正尝试使用一个小型演示来实际理解它。

我在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,谷歌等)以及关于相同来源政策的文章,但没有一个能让我明白这个想法。

1 个答案:

答案 0 :(得分:1)

Same-Origin策略与加载JavaScript没有太大关系。无论脚本来自何处,其操作都在主页的 aegis 域下进行。因此,如果您的主页来自“domain1”,那么所有脚本都在“domain1”的上下文中执行,无论它们来自该域还是任何其他域。

请注意,无法访问从其他域加载的脚本的源代码。

您的“dom1_normal”脚本为该元素引用报告“null”的原因可能是因为您在<body>之前导入了脚本。 DOM是以增量方式构建的,但脚本在加载时会同步运行,因此如果您在<{em> getElementById()标记之后为某个元素调用<script>,则不会那里。