2013-06-22 1 views
1

Я пытаюсь понять ту же самую исходную политику браузеров. Теоретически все выглядит нормально. Поэтому я пытаюсь практически понять это, используя небольшую демоверсию.java-скрипт и ту же самую исходную политику путаницы

Я 2 доменов, размещенных на WAMP, а именно domain1.com и domain2.com

domain1.com состоит из 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 состоит из 2-х версиях index.php, а именно, 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 в браузере. Это устанавливает файл cookie domain1. Затем я перешел в domain2.com/index.php Как и ожидалось, скрипт на домен2/index.php устанавливает файл cookie домена2. Затем загружается javascript из домена1, который говорит

alert(document.cookie) 

Выполнение этого скрипта предупреждает о значении cookie домена2.

Assumption1: - Так что мое понимание в том, что из-за того же происхождения политики браузера, даже при том, что сценарий был вызван из domain1, он не предупредит domain1 печенье, но вместо того, чтобы насторожить домен2 печенье.

Пожалуйста, дайте мне знать, если я прав в приведенном выше предположении?

Теперь я очищаю кеш браузера и удаляю все файлы cookie из браузера. Запустите domain1.com снова, который снова устанавливает файл cookie domain1. А потом, на этот раз я Гото domain2.com/index1.php, который устанавливает куки для domain2 и затем обращается скрипт, присутствующий в

domain1.com/javascript/dom1_normal.js 

Теперь, если мой assumption1 было правильно, (т.е. Javascript от domain1.com, когда импортированный в домен2.com, будет выполняться только со ссылкой на домен2, а не с его входящим доменом, в соответствии с той же политикой происхождения), тогда в этом случае также должно быть то же самое с dom1_normal.js. Итак, javascript в dom1_normal.JS должны иметь доступ ко всем HTML-элементов в domain2/index1.php Это на самом деле не так случиться, что подтверждается

bdy=document.getElementById("mydiv"); 
alert(bdy); 

в domain1.com/javascript/dom1_normal.js, который предупреждает нуль

пожалуйста, сообщите я знаю, где я иду не так. И я провел более десятка дискуссий (о переполнении стека и в других местах, включая MDN, wiki, google и т. Д.) И статьи о той же политике происхождения, но ни одна из них не дала мне понять эту идею.

ответ

1

Политика одинакового происхождения не имеет особого отношения к загрузке JavaScript. Независимо от того, откуда приходит сценарий, его действия происходят под доменом aegis главной страницы. Таким образом, если ваша главная страница поступает из «domain1», все сценарии выполняются в контексте «domain1», независимо от того, пришли ли они из этого домена или любого другого домена.

Обратите внимание, что доступ к исходному коду скрипта, загружаемого из какого-либо другого домена, невозможно.

Причина, по которой ваш сценарий «dom1_normal» сообщает «null» для этой ссылки на элемент, вероятно, потому, что вы импортируете скрипт перед <body>. DOM создается инкрементально, но скрипты выполняются синхронно, когда они загружаются, поэтому, если вы вызываете getElementById() для некоторого элемента после тега <script>, его там не будет.

+0

(На самом деле я не думаю, что вы можете получить источник любого сценария, загружаемого с помощью атрибута «src». У меня есть лихорадка на данный момент, поэтому я не думаю, что попробую: /) – Pointy

+0

" эгида "? кто здесь это получит? Как насчет «в области» вместо «под щитом»;) – mplungjan

+2

@mplungjan Я боролся с этим предложением, честно :-) – Pointy