2010-09-01 48 views
0

只是好奇,如果任何人都可以向我解釋爲什麼我可以從一個書籤請求一個頁面像這樣的:

javascript:var%20s=document.createElement('script');var data=encodeURI(location.href)+encodeURI('\n\n')+(encodeURI(document.getElementsByTagName('body')[0].innerHTML));s.setAttribute('src','http://example.com/remote.php?id=68&act=new&data='+data);document.getElementsByTagName('body')[0].appendChild(s);void(s);

肚裏出來,請求頁面,甚至可以提供GET變量輸入。

但是,由於相同的原始策略,我無法通過jQuery之類的東西發佈/獲取帶有ajax的XHR ...爲什麼?這是瀏覽器問題還是標準的一部分?

注意:我更改了小書籤。 注2:我的問題是爲什麼這不是違反政策?

回答

3

不同之處在於,您不能(直接)讀取成爲<script>元素的響應。

如果URL恰好返回定義有用函數的Javascript,則可以使用它。
如果它包含其他任何內容(如JSON或XML數據),則無法讀取響應。

同樣,您可以製作一個<img>元素,指向不同域中的圖像。

1

這個書籤沒有違反same origin policy。只有XHTTP請求受此策略的限制,並且此小書籤正在向頁面添加腳本元素。

DOM元素(如圖像和腳本)可以從互聯網上的任何地方自由獲取資源。

儘管任何腳本都可以通過DOM構建腳本或img請求來跨域有效執行GET請求,但它將無法從該資源提取任何數據,除非返回的響應形成得當。適當形成的迴應實際上是cross-domain ajax的基礎。

0

bookmarklet不會從另一個服務器請求某些東西,而是附加一個來自該另一個服務器的腳本,這是可接受的,並且不會與same origin policy發生衝突。

其實這是做這種跨服務器通信的已知解決方法,看看jsonp

1

相同來源javascript的策略不允許來自不同域的頁面進行通信,訪問其他對象,無論是讀取還是寫入,它也不允許xmlhttprequests(ajax調用)向其他服務器請求數據。

但是,它與允許在其他服務器上引用腳本無關。正如@SLaks所說,您可以從另一臺服務器添加<script>標記,因爲您可以從另一臺服務器添加<img>標記。