同源策略/SOP(Same origin policy)是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。
同源策略限制以下幾種行為: 1.) Cookie、LocalStorage 和 IndexDB 無法讀取 2.) DOM 和 Js對象無法獲得 3.) AJAX 請求不能發送
#處理方法:
# 1.通過JSONP跨域
# JSON是一種數據交換格式
# JSONP是一種非官方的跨域數據交互協議
# jsonp是包含在函數調用中的json
# script標簽不受同源策略的影響,手動創建一個script標簽,傳遞URL,同時傳入一個回調函數的名字
# 服務器得到名字后,返回數據時會用這個函數名來包裹住數據,客戶端獲取到數據之后,立即把script標簽刪掉
# 2.cors:跨域資源共享
# 使用自定義的HTTP頭部允許瀏覽器和服務器相互通信
# 1.如果是簡單請求,直接設置允許訪問的域名:
# 允許你的域名來獲取我的數據
# response['Access-Control-Allow-Origin'] = "*"
# 2.如果是復雜請求,首先會發送options請求做預檢,然后再發送真正的PUT/POST....請求
# 因此如果復雜請求是PUT等請求,則服務端需要設置允許某請求
# 如果復雜請求設置了請求頭,則服務端需要設置允許某請求頭
#簡單請求:
# 一次請求
#非簡單請求:
# 兩次請求,在發送數據之前會先發一次請求用於做“預檢”,
# 只有“預檢”通過后才再發送一次請求用於數據傳輸。
#只要同時滿足以下兩大條件,就屬於簡單請求。
# (1) 請求方法是以下三種方法之一:HEAD GET POST
# (2)HTTP的頭信息不超出以下幾種字段:
# Accept
# Accept-Language
# Content-Language
# Last-Event-ID
# Content-Type:只限於三個值application/x-www-form-urlencoded、multipart/form-data、 text/plain
#JSONP和CORS:
# 1.JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求
# 2.jsonp需要client和server端的相互配合
# 3.cors在client端無需設置,server端需要針對不同的請求,來做head頭的處理
CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源(協議 + 域名 + 端口)服務器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制
pip install django-cors-headers #安裝cors
INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE_CLASSES = ( ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # 房租common前面 ... ) #跨域增加忽略 CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_WHITELIST = ( '*' ) CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) CORS_ALLOW_HEADERS = ( 'XMLHttpRequest', 'X_FILENAME', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'Pragma', ) #增加settings配置