0

這是一個我認爲我理解的概念,但最近發現我錯了。我查看了互聯網上的所有內容,並找到大量小細節和代碼片段的示例,但我仍然缺乏對它的阻止以及爲什麼阻止它以及爲什麼阻止它的理解。所以這更多的是要求高層次的解釋而不是問題。交叉來源xhr和同源政策

不管怎麼說,這裏就是我想我瞭解:

比方說,我有域A.com和域B.com。每個人都擁有自己的IP地址的apache服務器。 我從域A.com加載一個HTML文件到瀏覽器中。瀏覽器執行POST XMLHttpRequest到B.com/doStuff.php,由於設置了相同的域策略而失敗。

所以: 誰是同域名政策是相關的?我認爲答案是B.com/doStuff.php ...對不對?因此,當A發送請求時,B檢查請求標頭的來源,並說「哎呀,不同的域,不會聽你的」。或者A發送請求,B響應指定「same-domain-policy」的頭部,然後瀏覽器檢查該請求,因爲指定了same-domain-policy,並且A請求頭部的域不匹配來自B的請求BROWSER拒絕發送xhr?

如果是這樣的話,似乎不允許跨原點請求的一點是,因爲「我不想比我之外的任何人訪問我的API」。這就是全部?因爲你不想用某種認證來解決這個問題嗎?難道有人只是構造一個假源頭的HTTP請求(簡單地說謊)?

或者這是否應該保護用戶?如果是這樣的話,如何防止他們調用你的API來保護任何人?

我很困惑...

+0

不會搶奪使用URL,例如停止機器,捲曲,它只是試圖阻止基於瀏覽器的抓取。要阻止非js威脅,您必須​​進行身份驗證。關鍵是一個網站的內容不能通過未經簽名的JS重新嵌入,而不需要你明確地允許它。 – dandavis

+0

@dandavis不是那麼容易迴避嗎?只需要你的服務器獲得它的javascript請求(例如curl),然後將它傳遞迴javascript ...有什麼意義? – Phildo

+0

重點是控制和問責:服務器/ php代碼註冊到信用卡,普通舊網頁不是。在你的例子中,執行curl的服務器可以很容易地識別和阻止,但是如果流量來自廣告注入的javascript,請求可能來自任何地方... – dandavis

回答

0

的想法是,你不希望通過JavaScript從服務器A訪問服務器B。如果您正在使用API​​進行交互,則可以使用JavaScript調用您自己的服務器的後端代碼,然後再調用其他服務器。

+0

但爲什麼? 「我不希望有人從JavaScript訪問我的API,但是如果他們從PHP中獲得它,那麼這似乎是一個完全膚淺的理由來證明這個基礎設施...... – Phildo

1
Who's same-domain-policy is relevant? 

服務器接收到該請求決定。

... the BROWSER refuses to send out the xhr? 

否,服務器拒絕迴應。更準確地說,在現代瀏覽器中,它由preflighted requests完成。這意味着對於每個跨源請求,首先由瀏覽器自動發送一個OPTIONS請求,該瀏覽器的頭部與預期請求的頭部完全相同,但沒有請求主體。服務器只響應頭文件。響應中的訪問控制標題將讓客戶端瀏覽器知道請求是否會根據服務器的策略得到滿足。從某種意義上說,瀏覽器阻止了請求,但僅僅是因爲它已經與服務器交換了一個請求/響應對,並且知道沒有任何要求嘗試請求。如果您在這種情況下僞造請求,服務器仍然拒絕提供服務。

+0

好吧,這樣纔有意義。謝謝你澄清! 但是,我然後糾正這整個事情的唯一目的是不允許人們訪問您的API,但只有通過特定的JavaScript? (IE-你的API仍然可以被其他任何東西訪問,而JavaScript不能做到這一點的唯一原因是因爲瀏覽器不支持JS編輯它的源頭的方式)。誰在保護?您的API仍然可以訪問 - 它只需要一個簡單的解決方法(告訴您的服務器進行調用,然後將它傳回給您的js)。 – Phildo

+0

「僅僅需要一個簡單的解決方法」是一個不太小的「正義」,僅僅是這種區分形成了基本的客戶端網絡安全的基礎。一個PHP服務器可以關閉,一個胭脂腳本更難以撲滅,並且造成比curl或php任何人以及他們的兄弟可以寫的更大的問題。 – dandavis

+0

@dandavis - 基本的客戶端網絡安全的基石?!如果存在一種解決方法,我(一個被允許的新手)可以很容易地利用(這又可能不是這種情況 - 我仍然在等待/希望能夠糾正,但是...),客戶端網站被搞砸了!充其量,這似乎只是懶惰黑客的前線障礙......?如果這就是全部,那就這樣吧。但我覺得我一直聽到喋喋不休,好像這種事情是一件大事。 (我的意思是沒有不尊重 - 我只是在努力去掌握所有這些,並且確信有些東西我仍然缺少......) – Phildo