首先,貼上nginx work的配置
server{
listen 8099;
server_name wdm.test.cn;
location / {
// 沒有配置OPTIONS的話,瀏覽器如果是自動識別協議(http or https),那么瀏覽器的自動OPTIONS請求會返回不能跨域
if ($request_method = OPTIONS ) {
add_header Access-Control-Allow-Origin "$http_origin";
add_header Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, DELETE";
add_header Access-Control-Max-Age "3600";
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization";
add_header Access-Control-Allow-Credentials "true";
add_header Content-Length 0;
add_header Content-Type text/plain;
return 200;
}
add_header 'Access-Control-Allow-Origin' '$http_origin';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
proxy_pass http://127.0.0.1:8080;
}
}
其次,既然碰到了就想理解下為什么需要這樣,一開始腦袋還真鑽進去了。
以下引自知乎:
- DOM同源策略:禁止對不同源頁面DOM進行操作
- XmlHttpRequest同源策略:禁止向不同源的地址發起HTTP請求
我們發起的每一次HTTP請求都會全額發送request地址對應的cookie,那么
- 用戶登錄了自己的銀行頁面http://MyBank.com,http://MyBank.com向用戶的cookie中添加用戶標識
- 用戶瀏覽了惡意頁面 http://Evil.com。執行了頁面中的惡意AJAX請求代碼
- http://Evil.com向http://MyBank.com發起AJAX HTTP請求,請求同時http://MyBank.com對應cookie也同時發送過去
- 銀行頁面從發送的cookie中提取用戶標識,驗證用戶標識無誤,response中返回請求數據。此時數據泄露。
- 由於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請求要做額外的驗證(以上知乎內容轉自:https://www.zhihu.com/question/20138568/answer/52659925