XSS(跨站腳本攻擊 cross-site scripting)
XSS的攻擊方式就是想辦法“教唆”用戶的瀏覽器去執(zhí)行一些這個網(wǎng)頁中原本不存在的前端代碼。
攻:獲取當(dāng)前域名下Cookie信息
防:Cookie增加Http-Only屬性,只能用在網(wǎng)絡(luò)請求中
CSRF(跨站請求偽造 cross-site request forgery)
瀏覽器目前都有同源策略
所謂瀏覽器同源策略,即:不允許瀏覽器訪問跨域的Cookie,ajax請求跨域接口等。
也就是說,凡是訪問與自己不在相同域的數(shù)據(jù)或接口時,瀏覽器都是不允許的。
另外,除了DOM,Cookie,XMLHttpRequest(AJAX本質(zhì)上就是XMLHttpRequest)會受到同源策略的限制外,存儲在瀏覽器中的數(shù)據(jù),如LocalStorage和IndexedDB,以源進行分割。每個源都擁有自己單獨的存儲空間,一個源中的Javascript腳本不能對屬于其它源的數(shù)據(jù)進行讀寫操作。
最常見的例子:對于前后端完全分離的Web項目,前端頁面通過rest接口訪問數(shù)據(jù)時,會出現(xiàn)如下問題:
- 不允許發(fā)送POST請求:在發(fā)送POST請求之前會發(fā)送OPTIONS請求,HTTP響應(yīng)狀態(tài)碼為403(Forbidden)。
- 允許發(fā)送GET請求:HTTP響應(yīng)狀態(tài)碼為200,但是不能讀取服務(wù)器返回的數(shù)據(jù)。
那么如何做到CSRF呢?
<script>,<img>,<iframe>,<link>等標(biāo)簽都可以跨域加載資源,而不受同源策略的限制。
這些帶src屬性的標(biāo)簽每次加載時,實際上是由瀏覽器發(fā)起了一次GET請求。CORS(Cross-Origin Resource Sharing),
Response Header中加入Access-Control-Allow-Origin
如何防護
- 阻止不明外域的訪問,進行同源檢測,檢測
Request Header中的Referer或者Origin - 利用CSRF攻擊只能使用Cookie而不能得到Cookie中內(nèi)容的特點,在請求的參數(shù)中添加token。例如把Token中的一部分放到請求中,后端只需要進行對比,減少性能消耗。缺點是每一個請求包括能繞開跨域限制的請求需要都攜帶這個Token,增加前端服務(wù)工作量。