XSS
跨網(wǎng)站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網(wǎng)站應(yīng)用程式的安全漏洞攻擊赞弥,是代碼注入的一種。它允許惡意使用者將程式碼注入到網(wǎng)頁上堕战,其他使用者在觀看網(wǎng)頁時(shí)就會(huì)受到影響默刚。這類攻擊通常包含了 HTML 以及使用者端腳本語言。
XSS 分為三種:反射型芭毙,存儲(chǔ)型和 DOM-based
如何攻擊
XSS 通過修改 HTML 節(jié)點(diǎn)或者執(zhí)行 JS 代碼來攻擊網(wǎng)站筋蓖。
例如通過 URL 獲取某些參數(shù)
<!-- http://www.domain.com?name=<script>alert(1)</script> -->
<div>{{name}}</div>
上述 URL 輸入可能會(huì)將 HTML 改為 <div><script>alert(1)</script></div>
,這樣頁面中就憑空多了一段可執(zhí)行腳本退敦。這種攻擊類型是反射型攻擊粘咖,也可以說是 DOM-based 攻擊。
也有另一種場景侈百,比如寫了一篇包含攻擊代碼 <script>alert(1)</script>
的文章瓮下,那么可能瀏覽文章的用戶都會(huì)被攻擊到翰铡。這種攻擊類型是存儲(chǔ)型攻擊,也可以說是 DOM-based 攻擊讽坏,并且這種攻擊打擊面更廣锭魔。
如何防御
最普遍的做法是轉(zhuǎn)義輸入輸出的內(nèi)容,對于引號(hào)路呜,尖括號(hào)迷捧,斜杠進(jìn)行轉(zhuǎn)義
function escape(str) {
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
str = str.replace(/"/g, "&quto;");
str = str.replace(/'/g, "'");
str = str.replace(/`/g, "`");
str = str.replace(/\//g, "/");
return str
}
通過轉(zhuǎn)義可以將攻擊代碼 <script>alert(1)</script>
變成
// -> <script>alert(1)</script>
escape('<script>alert(1)</script>')
對于顯示富文本來說,不能通過上面的辦法來轉(zhuǎn)義所有字符胀葱,因?yàn)檫@樣會(huì)把需要的格式也過濾掉漠秋。這種情況通常采用白名單過濾的辦法,當(dāng)然也可以通過黑名單過濾抵屿,但是考慮到需要過濾的標(biāo)簽和標(biāo)簽屬性實(shí)在太多庆锦,更加推薦使用白名單的方式。
var xss = require("xss");
var html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>');
// -> <h1>XSS Demo</h1><script>alert("xss");</script>
console.log(html);
以上示例使用了 js-xss
來實(shí)現(xiàn)轧葛》世螅可以看到在輸出中保留了 h1
標(biāo)簽且過濾了 script
標(biāo)簽
CSP
內(nèi)容安全策略 (CSP) 是一個(gè)額外的安全層,用于檢測并削弱某些特定類型的攻擊朝群,包括跨站腳本 (XSS) 和數(shù)據(jù)注入攻擊等燕耿。無論是數(shù)據(jù)盜取、網(wǎng)站內(nèi)容污染還是散發(fā)惡意軟件姜胖,這些攻擊都是主要的手段誉帅。
我們可以通過 CSP 來盡量減少 XSS 攻擊。CSP 本質(zhì)上也是建立白名單右莱,規(guī)定了瀏覽器只能夠執(zhí)行特定來源的代碼蚜锨。
通常可以通過 HTTP Header 中的 Content-Security-Policy
來開啟 CSP
-
只允許加載本站資源
Content-Security-Policy: default-src ‘self’
-
只允許加載 HTTPS 協(xié)議圖片
Content-Security-Policy: img-src https://*
-
允許加載任何來源框架
Content-Security-Policy: child-src 'none'
更多屬性可以查看 這里
CSRF
跨站請求偽造(英語:Cross-site request forgery)慢蜓,也被稱為 one-click attack 或者 session riding亚再,通常縮寫為 CSRF 或者 XSRF晨抡, 是一種挾制用戶在當(dāng)前已登錄的Web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法氛悬。[1] 跟跨網(wǎng)站指令碼(XSS)相比,XSS 利用的是用戶對指定網(wǎng)站的信任耘柱,CSRF 利用的是網(wǎng)站對用戶網(wǎng)頁瀏覽器的信任如捅。
簡單點(diǎn)說,CSRF 就是利用用戶的登錄態(tài)發(fā)起惡意請求调煎。
如何攻擊
假設(shè)網(wǎng)站中有一個(gè)通過 Get 請求提交用戶評論的接口镜遣,那么攻擊者就可以在釣魚網(wǎng)站中加入一個(gè)圖片,圖片的地址就是評論接口
<img src="http://www.domain.com/xxx?comment='attack'"/>
如果接口是 Post 提交的士袄,就相對麻煩點(diǎn)悲关,需要用表單來提交接口
<form action="http://www.domain.com/xxx" id="CSRF" method="post">
<input name="comment" value="attack" type="hidden">
</form>
如何防御
防范 CSRF 可以遵循以下幾種規(guī)則:
- Get 請求不對數(shù)據(jù)進(jìn)行修改
- 不讓第三方網(wǎng)站訪問到用戶 Cookie
- 阻止第三方網(wǎng)站請求接口
- 請求時(shí)附帶驗(yàn)證信息谎僻,比如驗(yàn)證碼或者 token
SameSite
可以對 Cookie 設(shè)置 SameSite
屬性。該屬性設(shè)置 Cookie 不隨著跨域請求發(fā)送寓辱,該屬性可以很大程度減少 CSRF 的攻擊艘绍,但是該屬性目前并不是所有瀏覽器都兼容。
驗(yàn)證 Referer
對于需要防范 CSRF 的請求讶舰,我們可以通過驗(yàn)證 Referer 來判斷該請求是否為第三方網(wǎng)站發(fā)起的鞍盗。
Token
服務(wù)器下發(fā)一個(gè)隨機(jī) Token(算法不能復(fù)雜),每次發(fā)起請求時(shí)將 Token 攜帶上跳昼,服務(wù)器驗(yàn)證 Token 是否有效般甲。
密碼安全
密碼安全雖然大多是后端的事情,但是作為一名優(yōu)秀的前端程序員也需要熟悉這方面的知識(shí)鹅颊。
加鹽
對于密碼存儲(chǔ)來說敷存,必然是不能明文存儲(chǔ)在數(shù)據(jù)庫中的,否則一旦數(shù)據(jù)庫泄露堪伍,會(huì)對用戶造成很大的損失锚烦。并且不建議只對密碼單純通過加密算法加密,因?yàn)榇嬖诓屎绫淼年P(guān)系帝雇。
通常需要對密碼加鹽涮俄,然后進(jìn)行幾次不同加密算法的加密。
// 加鹽也就是給原密碼添加字符串尸闸,增加原密碼長度
sha256(sha1(md5(salt + password + salt)))
但是加鹽并不能阻止別人盜取賬號(hào)彻亲,只能確保即使數(shù)據(jù)庫泄露,也不會(huì)暴露用戶的真實(shí)密碼吮廉。一旦攻擊者得到了用戶的賬號(hào)苞尝,可以通過暴力破解的方式破解密碼。對于這種情況宦芦,通常使用驗(yàn)證碼增加延時(shí)或者限制嘗試次數(shù)的方式宙址。并且一旦用戶輸入了錯(cuò)誤的密碼,也不能直接提示用戶輸錯(cuò)密碼调卑,而應(yīng)該提示賬號(hào)或密碼錯(cuò)誤抡砂。