前端面試題(五)安全篇

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, "&amp;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/"/g, "&quto;");
    str = str.replace(/'/g, "&#39;");
    str = str.replace(/`/g, "&#96;");
    str = str.replace(/\//g, "&#x2F;");
    return str
}

通過轉(zhuǎn)義可以將攻擊代碼 <script>alert(1)</script> 變成

// -> &lt;script&gt;alert(1)&lt;&#x2F;script&gt;
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>&lt;script&gt;alert("xss");&lt;/script&gt;
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ī)則:

  1. Get 請求不對數(shù)據(jù)進(jìn)行修改
  2. 不讓第三方網(wǎng)站訪問到用戶 Cookie
  3. 阻止第三方網(wǎng)站請求接口
  4. 請求時(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ò)誤抡砂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市令野,隨后出現(xiàn)的幾起案子舀患,更是在濱河造成了極大的恐慌,老刑警劉巖气破,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異餐抢,居然都是意外死亡现使,警方通過查閱死者的電腦和手機(jī)低匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碳锈,“玉大人顽冶,你說我怎么就攤上這事∈厶迹” “怎么了强重?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贸人。 經(jīng)常有香客問我间景,道長,這世上最難降的妖魔是什么艺智? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任倘要,我火速辦了婚禮,結(jié)果婚禮上十拣,老公的妹妹穿的比我還像新娘封拧。我一直安慰自己,他們只是感情好夭问,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布泽西。 她就那樣靜靜地躺著,像睡著了一般缰趋。 火紅的嫁衣襯著肌膚如雪捧杉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天埠胖,我揣著相機(jī)與錄音糠溜,去河邊找鬼。 笑死直撤,一個(gè)胖子當(dāng)著我的面吹牛非竿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谋竖,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼红柱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓖乘?” 一聲冷哼從身側(cè)響起锤悄,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉抒,沒想到半個(gè)月后零聚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年隶症,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了政模。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁涤。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡学歧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唆垃,到底是詐尸還是另有隱情胁住,我是刑警寧澤趁猴,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站彪见,受9級(jí)特大地震影響儡司,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜企巢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一枫慷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浪规,春花似錦或听、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缸濒,卻和暖如春足丢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庇配。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工斩跌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捞慌。 一個(gè)月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓耀鸦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啸澡。 傳聞我的和親對象是個(gè)殘疾皇子袖订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容