1

ブラウザーの同一生成元ポリシーを理解しようとしています。理論的には問題ないようです。だから私は今、小さなデモを使ってそれを実際に理解しようとしています.

wamp でホストされている 2 つのドメイン、つまり domain1.com と domain2.com があります。

domain1.com は、index.php、innocent.php、および javascript フォルダー内の 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 の 2 つのバージョンで構成されています。

上記の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を使用しています。まず、ブラウザで domain1.com にアクセスします。これにより、domain1 Cookie が設定されます。次に、domain2.com/index.php に移動します。予想どおり、domain2/index.php のスクリプトは domain2 Cookie を設定します。次に、domain1 からの JavaScript がロードされます。

alert(document.cookie)

このスクリプトを実行すると、domain2 Cookie の値が警告されます。

仮定 1: - ここでの私の理解では、スクリプトがドメイン 1 から呼び出された場合でも、ブラウザーの同じオリジン ポリシーにより、ドメイン 1 の Cookie を警告せず、代わりにドメイン 2 の 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); 

null を警告する domain1.com/javascript/dom1_normal.js で

どこが間違っているのか教えてください。そして、私は 10 を超える議論 (スタック オーバーフローや、MDN、wiki、Google などを含むその他の場所) や同じオリジン ポリシーに関する記事を調べてきましたが、どれもその考えを明確にしてくれませんでした。

4

1 に答える 1