2014-05-10 69 views
0

我已經做了一些研究,如何防止假的跨源請求,並已發現了很多有用的信息。但是,他們中沒有一個似乎直接解決了我的問題,並且由於我的應用程序必須處理這種特定情況,所以我想完全理解它。如何保護跨域請求;允許第三個網站POST數據

我有一個簡單的PHP郵件網站:mailsite.com

這個網站將允許其他預先定義的地址,例如,user.com,以POST發送數據給它,處理包含to信息和mesaage;然後從郵件發送郵件到to,郵件message

目前,我使用$_SERVER[ "HTTP_ORIGIN" ]$_SERVER[ "HTTP_REFERER" ]來檢查請求來自哪裏;並處理它們,如果它來自預定義的域。不過,我讀過一些文章,說:

  1. HTTP_ORIGIN甚至沒有索引的PHP文件中,因爲它是非常每個瀏覽器之類的事情,所以拒絕發送這些信息將無法工作的瀏覽器。 HTTP_REFERER很容易僞造。
  2. 代幣可以很好地防止CSRF。

但是,我允許的請求來自第三個預先定義的網站,令牌如何在這種情況下工作?

我的問題是:如果我允許特定域將POST數據發送到我的網站,我如何確保(或最安全的方式)這些請求來自我期望的站點? HTTP_ORIGIN不夠安全嗎?我敢於考慮允許第三方網站將數據發佈到我的網站,因爲我看到Facebook允許人們訪問他們的數據庫。必須有一些可能的解決方案來檢查請求來自哪裏。

+0

我確定你的意思是'$ _SERVER [「HTTP_REFFERAL」]'對嗎?你犯了一個錯字。 –

+0

是的。我很抱歉打字錯誤。我從手機上輸入了它。非常感謝您指出。 – user3622260

+0

不客氣。 –

回答

1

這聽起來像你有多個解決方案成爲可能:

  • 使用令牌許可制度。給user.com一個私人標記,將其作爲隱藏值添加到輸入表單中。提交此表單後,瀏覽器將爲您的服務器提供令牌,並且用戶不必知道令牌。您根據自己的數據庫檢查令牌。如果您找到令牌,請允許發送郵件。

  • 使用CORS(跨源資源共享)。當從user.com向您的服務器發送Ajax請求時,應該有多個Access-Control標題。你檢查它們是否存在以及它們的值是什麼$_SERVER['HTTP_ACCESS_CONTROL_header']其中headerAccess-Control標題名稱之一。如果這些值符合您的預期,請與多個header('Access-Control-header: value');調用進行響應,以便瀏覽器知道您接受了預檢請求,否則請勿添加任何額外的標頭。預檢後瀏覽器將發送另一個請求,這是您實際發送郵件的時間。

  • 如果這是從user.com的服務器而不是user.com的訪問者發送的,很可能服務器的IP地址不會改變(儘管它可能會或可能不會使用定義的IP範圍,請注意這一點),因此您可以驗證$_SERVER['REMOTE_ADDR']與數據庫中的值匹配。爲此,您可以在數據庫中保留一個已批准IP地址的表格。如果您在表格中找到IP地址,請允許發送郵件。

希望這會有所幫助。

+0

關於第三點,我認爲這不是一個好的做法,因爲如果user.com在共享主機上呢? –

+0

然後它變得更棘手。您可以保留一個經過批准的域名錶,然後保留該域名的IP地址。使用在cronjob上執行的腳本定期對每個域名進行查找,並將其IP映射到數據庫中,刪除該域中不再出現在查找中的舊條目,並添加查找找到的所有新IP。請求進入時,請對照任何這些IP進行驗證。您還可以添加檢查該IP的反向DNS,並查看其DNS是否在您的核準域名中。 –

+0

共享主機=多個域單個IP。 –

相關問題