標籤:

為什麼要禁止跨域的 Ajax 請求?


原文地址:Understanding the Web-Same Origin Policy, Restrictions, Purpose, and Workarounds

作者將「同源策略」分為:

  • DOM同源策略:禁止對不同源頁面DOM進行操作

  • XmlHttpRequest同源策略:禁止向不同源的地址發起HTTP請求

AJAX同源策略主要用來防止CSRF攻擊。如果沒有AJAX同源策略,攻擊過程如下:

我們發起的每一次HTTP請求都會全額發送request地址對應的cookie,那麼

  1. 用戶登錄了自己的銀行頁面http://MyBank.com,http://MyBank.com向用戶的cookie中添加用戶標識
  2. 用戶瀏覽了惡意頁面 http://Evil.com。執行了頁面中的惡意AJAX請求代碼
  3. http://Evil.com向http://MyBank.com發起AJAX HTTP請求,請求同時http://MyBank.com對應cookie也同時發送過去
  4. 銀行頁面從發送的cookie中提取用戶標識,驗證用戶標識無誤,response中返回請求數據。此時數據泄露。
  5. 由於Ajax的後台執行,此時用戶沒有意識這一過程。


簡單的說,你把Cookie託付給瀏覽器保存,瀏覽器要保證你的Cookie不被惡意網站利用。

同源策略並不能防止DDos,因為跨域的Ajax也會被請求,如果http://Evil.com用Ajax請求http://MyBank.com,瀏覽器會先發出請求,並且帶上http://MyBank.com的Cookie。拿到http://MyBank.com的響應之後(可能有敏感數據),瀏覽器才會根據Header里的Access-Control-Allow-Origin決定是否把結果交給http://Evil.com里的腳本。(或者先發一個OPTIONS請求看一下CORS設置,再決定是否要發真正的請求。)

因此瀏覽器只是起到了最基本的防禦,在寫程序的時候還是要注意防禦CSRF,比如關鍵操作不要用GET,POST請求要做額外的驗證(驗證碼,隨機數,Refer,Token)等等。


因為 Same origin policy ,詳原因自己看看wiki吧


推薦閱讀:

開了N個知乎窗口,標題都有(1 條消息),點開其中一個窗口的消息提示後,(1 條消息)消失,緊接著其他所有標題都會陸續更新,什麼技術?
知乎長貼只有「更多」按鈕的瀏覽方式,是否影響帖子的易讀性?
新版新浪微博的個人首頁左側的「首頁」、「提到我的」、「評論」、「私信」、「收藏」等導航是如何做到局部刷新的?
傳送門:React Portal

TAG:前端開發 | Ajax |