溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

有哪些前端安全編碼規(guī)范

發(fā)布時(shí)間:2021-10-25 14:39:24 來(lái)源:億速云 閱讀:132 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“有哪些前端安全編碼規(guī)范”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“有哪些前端安全編碼規(guī)范”吧!

1. 跨站腳本攻擊(Cross Sites Script)

跨站腳本攻擊,Cross Site Script(簡(jiǎn)稱 CSS或)。指黑客通過(guò)“HTML注入”篡改了網(wǎng)頁(yè),插入了惡意的腳本(主要是JavaScript腳本),從而在用戶瀏覽網(wǎng)頁(yè)時(shí),控制用戶瀏覽器的一種攻擊。

了解了什么是XSS,那你一定想知道,它有什么危害以及如何去防御

這里羅列一張列表:

  •  掛馬

  •  盜取用戶Cookie。

  •  釣魚攻擊,高級(jí)的釣魚技巧。

  •  刪除目標(biāo)文章、惡意篡改數(shù)據(jù)、嫁禍。

  •  劫持用戶Web行為,甚至進(jìn)一步滲透內(nèi)網(wǎng)。

  •  爆發(fā)Web2.0蠕蟲。

  •  蠕蟲式掛馬攻擊、刷廣告、刷瀏量、破壞網(wǎng)上數(shù)據(jù)

  •  其它安全問題

常見的跨站腳本攻擊也可分為:反射型XSS、存儲(chǔ)型XSS、DOM Based XSS

下面針對(duì)這三種常見的類型做具體的分析

1.1 反射型XSS--也可被稱為是HTML注入

反射型XSS,也稱為"非持久型XSS"簡(jiǎn)單的把用戶輸入的數(shù)據(jù)"反射"給瀏覽器,即黑客往往需要誘使用戶"點(diǎn)擊"一個(gè)惡意鏈接攻擊才能成功,用戶通過(guò)點(diǎn)擊這個(gè)惡意鏈接,攻擊者可以成功獲取用戶隱私數(shù)據(jù)的一種方式。如:"盜取用戶Cookie信息"、"破壞頁(yè)面結(jié)構(gòu)"、"重定向到其他網(wǎng)站",盜取內(nèi)網(wǎng)IP等。

那么既然反射型XSS也可以是HTML注入,那么它注入的關(guān)鍵自然也就從前端的HTML頁(yè)面開始下手:

1. 用戶能夠與瀏覽器頁(yè)面產(chǎn)生交互動(dòng)作(輸入搜索的關(guān)鍵詞,點(diǎn)擊按鈕,點(diǎn)擊鏈接等等),但這些都需要去誘使用戶去操作,說(shuō)起來(lái)容易,做起來(lái)難。  2. 用戶輸入的數(shù)據(jù)會(huì)被攻擊方拼接出合適的html去執(zhí)行惡意的js腳本,這樣的過(guò)程就像是"一次反射"

1.2 存儲(chǔ)型XSS

存儲(chǔ)型XSS,也稱為"`持久型XSS`",它與`反射型XSS`不同之處在于,它會(huì)將用戶輸入的數(shù)據(jù)"存儲(chǔ)"在攻擊方的服務(wù)器上,具有很強(qiáng)的"穩(wěn)定性"。  例如:訪問某黑客寫下的一篇含有惡意JavaScript代碼的博客文章,黑客把惡意腳本保存到服務(wù)端。

1.3 DOM based XSS

從效果上來(lái)說(shuō),也是"反射型XSS",單獨(dú)劃分出來(lái),是因?yàn)槠湫纬墒峭ㄟ^(guò)修改頁(yè)面的"DOM節(jié)點(diǎn)"形成的XSS。  例如:通過(guò)修改DOM節(jié)點(diǎn)上的綁定方法,用戶無(wú)意間通過(guò)點(diǎn)擊、輸入等行為執(zhí)行這些方法獲取到用戶的相關(guān)信息

1.4 如何去檢測(cè)是否存在XSS

一般方法是,用戶可以在有關(guān)鍵字輸入搜索的地方輸入<script>alert(123)</script>后點(diǎn)擊搜索,若彈框出現(xiàn)展示123,說(shuō)明存在XSS漏洞,這就說(shuō)明前端并沒有對(duì)用戶輸入的內(nèi)容過(guò)濾處理。

1.5 XSS的攻擊方式

1.Cookie劫持

通過(guò)偽裝一些`圖片和按鈕`等,誘使用戶對(duì)其操作,使網(wǎng)頁(yè)執(zhí)行了攻擊者的惡意腳本,使攻擊者能夠獲取當(dāng)前用戶的Cookie信息

2.構(gòu)造GET和POST請(qǐng)求

若某攻擊者想刪除某網(wǎng)站的一篇文章,首先獲得當(dāng)前文章的id,然后通過(guò)使用腳本`插入圖片`發(fā)送一個(gè)`GET請(qǐng)求`,或`構(gòu)造表單`,`XMLHTTPRequest`發(fā)送`POST請(qǐng)求`以達(dá)到刪除該文章的目的

3.XSS釣魚

`釣魚`這個(gè)詞一般認(rèn)識(shí)是起源于`社會(huì)工程學(xué)`,黑客使用這個(gè)這門學(xué)科的理念思想,在未授權(quán)不知情的情況下誘騙用戶,并得到對(duì)方對(duì)方的姓名、年齡、郵箱賬號(hào)、甚至是銀行卡密碼等私人信息。  比如:"某用戶在某網(wǎng)站(已被攻擊)上操作黑客偽造的一個(gè)登錄框,當(dāng)用戶在登錄框中輸入了用戶名(這里可能是身份證號(hào)等)和密碼之后,將其信息上傳至黑客的服務(wù)器上(該用戶的信息就已經(jīng)從該網(wǎng)站泄漏)"

4.獲取用戶真實(shí)的IP地址

通過(guò)第三方軟件獲取,比如客戶端安裝了Java環(huán)境(JRE),則可通過(guò)調(diào)用`Java Applet`的接口獲取客戶端本地的IP地址

1.6 XSS的防御方式

1.HttpOnly

原理:瀏覽器禁止頁(yè)面的Javascript訪問帶有HttpOnly屬性的cookie。(實(shí)質(zhì)解決的是:XSS后的cookie劫持攻擊)如今已成為一種“標(biāo)準(zhǔn)”的做法

解決方案:  JavaEE給Cookie添加HttpOnly的方式為:  response.setHeader("Set-Cookie","cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

2.輸入檢查(XSS Filter)

原理:讓一些基于特殊字符的攻擊失效。(常見的Web漏洞如XSS、SQLInjection等,都要求攻擊者構(gòu)造一些特殊字符)  * 輸入檢查的邏輯,必須在服務(wù)端實(shí)現(xiàn),因?yàn)榭蛻舳说臋z查也是很容易被攻擊者繞過(guò),現(xiàn)有的普遍做法是兩端都做同樣的檢查,客戶端的檢查可以阻擋大部分誤操作的正常用戶,從而節(jié)約服務(wù)器的資源。  解決方案:  檢查是否包含"JavaScript","<script></script>"等敏感字符。以及對(duì)字符串中的<>:"&/'等特殊字符做處理

3.輸出檢查

原理:一般來(lái)說(shuō)除了富文本輸出之外,在變量輸出到HTML頁(yè)面時(shí),使用編碼或轉(zhuǎn)義的方式來(lái)防御XSS攻擊  解決方案:  *   針對(duì)HTML代碼的編碼方式:HtmlEncode  *   PHP:htmlentities()和htmlspecialchars()兩個(gè)函數(shù)  *   Javascript:JavascriptEncode(需要使用""對(duì)特殊字符進(jìn)行轉(zhuǎn)義,同時(shí)要求輸出的變量必須在引號(hào)內(nèi)部)  *   在URL的path(路徑)或者search(參數(shù))中輸出,使用URLEncode

4.更嚴(yán)格的做法

除了數(shù)字和字母外的所有字符,都使用十六進(jìn)制的方式進(jìn)行編碼

2. 跨站點(diǎn)請(qǐng)求偽造(Cross Sites Request Forgery)

跨站點(diǎn)請(qǐng)求偽造,指利用用戶身份操作用戶賬戶的一種攻擊方式,即攻擊者誘使用戶訪問一個(gè)頁(yè)面,就以該用戶身份在第三方有害站點(diǎn)中執(zhí)行了一次操作,泄露了用戶的身份信息,接著攻擊者就可以使用這個(gè)偽造的,但真實(shí)存在的身份信息,到某網(wǎng)站冒充用戶執(zhí)行惡意操作。

但是,攻擊者只有預(yù)測(cè)到URL的所有參數(shù)與參數(shù)值,才能成功地偽造一個(gè)請(qǐng)求(當(dāng)然了,他可以在安全站點(diǎn)里以自己的身份實(shí)際去操作一下,還是能拿到參數(shù)的);反之,攻擊者無(wú)法攻擊成功

我們可以總結(jié),完成一次CSRF攻擊,必須滿足兩個(gè)條件

  •  用戶登錄受信任網(wǎng)站A,并且在本地生成Cookie

  •  在不登出網(wǎng)站A的情況下,訪問有害網(wǎng)站B

2.1 CSRF的原理

CSRF攻擊是攻擊者利用**`用戶身份`**操作用戶賬戶的一種攻擊方式  如電影速度與激情5中吉賽爾使用內(nèi)褲獲取巴西大佬指紋,最后成功使用偽造指紋的手法打開保險(xiǎn)柜,CSRF只不過(guò)是網(wǎng)絡(luò)上這個(gè)手法的實(shí)現(xiàn)。

2.2 CSRF的攻擊方式

1.瀏覽器的Cookie策略

瀏覽器所持有的策略一般分為兩種:  Session Cookie,臨時(shí)Cookie。保存在瀏覽器進(jìn)程的內(nèi)存中,瀏覽器關(guān)閉了即失效。  Third-party Cookie,本地Cookie。服務(wù)器在Set-Cookie時(shí)指定了Expire Time。過(guò)期了本地Cookie失效,則網(wǎng)站會(huì)要求用戶重新登錄。

* 在瀏覽網(wǎng)站的過(guò)程中,即使瀏覽器打開了Tab頁(yè),Session Cookie都是有效的,因此發(fā)起CSRF攻擊是可行的。

2.P3P頭的副作用

"P3P Header"是 "W3C" 制定的一項(xiàng)關(guān)于隱私的標(biāo)準(zhǔn),全稱是 "The Platform for Privacy Preference"(隱私偏好平臺(tái))  如果網(wǎng)站返回給瀏覽器的 HTTP 頭包含有 P3P 頭,則在某種程度上來(lái)說(shuō),將允許 瀏覽器發(fā)送第三方 Cookie。在 IE 下即使是"<iframe>"、`<script>`等標(biāo)簽頁(yè)將不再攔截第三方 Cookie 的發(fā)送。主要應(yīng)用在類似廣告等需要跨域訪問的頁(yè)面。

3.GET,POST請(qǐng)求

* 這里有個(gè)誤區(qū)  大多數(shù) CSRF 攻擊,都是通過(guò) <img> 、 <iframe> 、 <script> 等帶 src 屬性的標(biāo)簽,這類標(biāo)簽只能發(fā)送一次 GET 請(qǐng)求,而不能發(fā)送 POST 請(qǐng)求,由此也有了認(rèn)為 CSRF 攻擊只能由 GET 請(qǐng)求發(fā)起的錯(cuò)誤觀點(diǎn)。 構(gòu)造一個(gè) POST 請(qǐng)求,只需要在一個(gè)不可見的iframe窗口中,構(gòu)造一個(gè)form表單,然后使用JavaScript自動(dòng)提交這個(gè)表單。那么整個(gè)自動(dòng)提交表單的過(guò)程,對(duì)于用戶來(lái)說(shuō)就是不可見的。

2.3 CSRF的防御方式

1.驗(yàn)證碼

原理:  CSRF攻擊過(guò)程中,用戶在不知情的情況下構(gòu)造了網(wǎng)絡(luò)請(qǐng)求,添加驗(yàn)證碼后,強(qiáng)制用戶必須與應(yīng)用進(jìn)行交互  *  優(yōu)點(diǎn):簡(jiǎn)潔而有效  *  缺點(diǎn):網(wǎng)站不能給所有的操作都加上驗(yàn)證碼

2.Referer Check

原理:  * 利用HTTP頭中的Referer判斷請(qǐng)求來(lái)源是否合法  * Referer首部包含了當(dāng)前請(qǐng)求頁(yè)面的來(lái)源頁(yè)面的地址,一般情況下Referer的來(lái)源頁(yè)就是發(fā)起請(qǐng)求的那個(gè)頁(yè)面,如果是在iframe中發(fā)起的請(qǐng)求,那么對(duì)應(yīng)的頁(yè)面URL就是iframe的src  *  優(yōu)點(diǎn):簡(jiǎn)單易操作(只需要在最后給所有安全敏感的請(qǐng)求統(tǒng)一添加一個(gè)攔截器來(lái)檢查Referer的值就行)  *  缺點(diǎn):服務(wù)器并非什么時(shí)候都能取到Referer          1.很多出于保護(hù)用戶隱私的考慮,限制了Referer的發(fā)送。          2.比如從HTTPS跳轉(zhuǎn)到HTTP,出于安全的考慮,瀏覽器不會(huì)發(fā)送Referer

3.使用Anti CSRF Token

原理:把參數(shù)加密,或者使用一些隨機(jī)數(shù),從而讓攻擊者無(wú)法猜測(cè)到參數(shù)值,也就無(wú)法構(gòu)造請(qǐng)求的 URL,也就無(wú)法發(fā)起 CSRF 攻擊。  例子(增加token):  *  比如一個(gè)刪除操作的URL是:`http://host/path/delete?uesrname=abc&item=123`  *  保持原參數(shù)不變,新增一個(gè)參數(shù)Token,Token值是隨機(jī)的,不可預(yù)測(cè)  *  http://host/path/delete?username=abc&item=123&token=[random(seed)]  *  優(yōu)點(diǎn):比檢查Referer方法更安全,并且不涉及用戶隱私  *  缺點(diǎn):          加密          1. 加密后的URL非常難讀,對(duì)用戶非常不友好          2. 加密的參數(shù)每次都在改變,導(dǎo)致用戶無(wú)法對(duì)頁(yè)面進(jìn)行搜索          3. 普通參數(shù)也會(huì)被加密或哈希,將會(huì)給DBA工作帶來(lái)很大的困擾,因?yàn)閿?shù)據(jù)分析常常需要用到參數(shù)的明文              token          1. 對(duì)所有的請(qǐng)求都添加Token比較困難

需要注意的點(diǎn)

  1.  Token需要足夠隨機(jī),必須用足夠安全的隨機(jī)數(shù)生成算法

  2.  Token應(yīng)該為用戶和服務(wù)器所共同持有,不能被第三方知曉

  3.  Token可以放在用戶的Session或者瀏覽器的Cookie中

  4.  盡量把Token放在表單中,把敏感操作由GET改為POST,以form表單的形式提交,可以避免Token泄露(比如一個(gè)頁(yè)面:http://host/path/manage?username=abc&token=[random],在此頁(yè)面用戶需要在這個(gè)頁(yè)面提交表單或者單擊“刪除”按鈕,才能完成刪除操作,在這種場(chǎng)景下,如果這個(gè)頁(yè)面包含了一張攻擊者能指定地址的圖片<img src="http://evil.com/notexist" />,則這個(gè)頁(yè)面地址會(huì)作為HTTP請(qǐng)求的Refer發(fā)送到evil.com的服務(wù)器上,從而導(dǎo)致Token泄露)

2.4 XSRF

當(dāng)網(wǎng)站同時(shí)存在XSS和CSRF漏洞時(shí),XSS可以模擬客戶端瀏覽器執(zhí)行任意操作,在XSS攻擊下,攻擊者完全可以請(qǐng)求頁(yè)面后,讀取頁(yè)面內(nèi)容中的Token值,然后再構(gòu)造出一個(gè)合法的請(qǐng)求

3. 點(diǎn)擊劫持(ClickJacking)

點(diǎn)擊劫持是一種視覺上的欺騙手段。攻擊者使用一個(gè)透明的、不可見的iframe,覆蓋在一個(gè)網(wǎng)頁(yè)上,然后誘使用戶在網(wǎng)頁(yè)上進(jìn)行操作,此時(shí)用戶將在不知情的情況下點(diǎn)擊透明的iframe頁(yè)面。通過(guò)調(diào)整iframe頁(yè)面的位置,可以誘使用戶恰好點(diǎn)擊在iframe頁(yè)面的一些功能性按鈕上。

比如,程序員小王在訪問A網(wǎng)頁(yè)時(shí),點(diǎn)擊空白區(qū)域,瀏覽器卻意外打開了xx新葡京賭場(chǎng)的頁(yè)面,于是他在A網(wǎng)頁(yè)打開控制臺(tái),在空白區(qū)域發(fā)現(xiàn)了一個(gè)透明的iframe,該iframe嵌入了一個(gè)第三方網(wǎng)頁(yè)的URL

3.1 點(diǎn)擊劫持防御方式

1.X-Frame-Options HTTP響應(yīng)頭是用來(lái)給瀏覽器指示允許一個(gè)頁(yè)面能否在`<frame>、<iframe>、<object>`中展現(xiàn)的標(biāo)記  #### 有三個(gè)可選的值  1.  DENY:瀏覽器會(huì)拒絕當(dāng)前頁(yè)面加載任何frame頁(yè)面(即使是相同域名的頁(yè)面也不允許)  2.  SAMEORIGIN:允許加載frame頁(yè)面,但是frame頁(yè)面的地址只能為同源域名下的頁(yè)面  3.  ALLOW-FROM:可以加載指定來(lái)源的frame頁(yè)面(可以定義frame頁(yè)面的地址)  2.禁止iframe的嵌套  if(window.top.location !== window.loaction){window.top.location === window.self.location}

4. 其他安全問題

4.1 跨域問題處理     當(dāng)服務(wù)端設(shè)置 'Access-Control-Allow-Origin' 時(shí)使用了通配符 "*",允許來(lái)自任意域的跨域請(qǐng)求,這是極其危險(xiǎn)的  4.2 postMessage 跨窗口傳遞信息      postMessage 允許每一個(gè) window(包括當(dāng)前窗口、彈出窗口、iframes等)對(duì)象往其他的窗口發(fā)送文本消息,從而實(shí)現(xiàn)跨窗口的消息傳遞。并且這個(gè)功能不受同源策略限制。      必要時(shí),在接受窗口驗(yàn)證 Domain,甚至驗(yàn)證URL,以防止來(lái)自非法頁(yè)面的消息。實(shí)際上是在代碼上實(shí)現(xiàn)一次同源策略的驗(yàn)證過(guò)程。接受窗口對(duì)接口的信息進(jìn)行安全檢查。    4.3 Web Storage      Web Storage 分為 Session Storage 和 Local Storage。      雖然受同源策略的約束,但當(dāng)存有敏感信息時(shí),也可能會(huì)成為攻擊的目標(biāo)。

5. 總結(jié)

  1.  謹(jǐn)慎用戶輸入信息,進(jìn)行輸入檢查(客戶端和服務(wù)端同時(shí)檢查)

  2.  在變量輸出到HTML頁(yè)面時(shí),都應(yīng)該進(jìn)行編碼或轉(zhuǎn)義來(lái)預(yù)防XSS攻擊

  3.  該用驗(yàn)證碼的時(shí)候一定要添上

  4.  盡量在重要請(qǐng)求上添加Token參數(shù),注意Token要足夠隨機(jī),用足夠安全的隨機(jī)數(shù)生成算法 

到此,相信大家對(duì)“有哪些前端安全編碼規(guī)范”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI