溫馨提示×

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

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

10個(gè)React安全的使用方法教程

發(fā)布時(shí)間:2021-10-19 09:29:04 來(lái)源:億速云 閱讀:148 作者:iii 欄目:web開發(fā)

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

  1.  數(shù)據(jù)綁定( Data Binding)默認(rèn)的xss保護(hù)

  2.  危險(xiǎn)的URL

  3.  渲染html

  4.  直接訪問(wèn)dom

  5.  服務(wù)端渲染

  6.  檢測(cè)依賴項(xiàng)中的漏洞

  7.  JSON State

  8.  檢測(cè)React易受攻擊版本

  9.  linter工具

  10.  危險(xiǎn)的庫(kù)代碼

1、數(shù)據(jù)綁定( Data Binding)默認(rèn)的 xss 保護(hù)

使用默認(rèn)的{}進(jìn)行數(shù)據(jù)綁定,React會(huì)自動(dòng)對(duì)值進(jìn)行轉(zhuǎn)義以防止XSS攻擊。但注意這種保護(hù)只在渲染textContent時(shí)候有用,渲染HTML attributes的時(shí)候是沒(méi)用的。

使用數(shù)據(jù)綁定語(yǔ)法{}將數(shù)據(jù)在組件中。

這樣做:

<div>{data}</div>

避免沒(méi)有經(jīng)過(guò)自定義驗(yàn)證的動(dòng)態(tài)HTML attributes值。

別這樣做:

<form action={data}>...

2、危險(xiǎn)的URL

URL是可以通過(guò)javascript:協(xié)議來(lái)引入動(dòng)態(tài)腳本的。所以需要驗(yàn)證你的連接是否是http:或者h(yuǎn)ttps:以防止javascript:url的腳本注入。使用原生的URL parsing方法進(jìn)行URL驗(yàn)證,判斷其協(xié)議是否在你的白名單中。

這樣做:

function validateURL(url) {    const parsed = new URL(url)    return ['https:', 'http:'].includes(parsed.protocol)  }  <a href={validateURL(url) ? url : ''}>Click here!</a>

別這樣做:

<a href={attackerControlled}>Click here!</a>

3、渲染html

React是可以通過(guò)dangerouslySetInnerHTML將html代碼直接渲染到dom節(jié)點(diǎn)中的。但以這種方式插入的任何內(nèi)容都必須事先消毒。

在將任何值放入dangerouslySetInnerHTML屬性之前,需要用dompurify對(duì)其消毒。

在插入html時(shí)用dompurify進(jìn)行處理

import purify from "dompurify";  <div dangerouslySetInnerHTML={{ __html:purify.sanitize(data) }} />

4、直接訪問(wèn)dom

應(yīng)該避免訪問(wèn)DOM然后直接將內(nèi)容注入DOM節(jié)點(diǎn)。如果你一定要插入HTML,那就先用dompurify消毒,然后再用dangerouslySetInnerHTML屬性。

這樣做:

import purify from "dompurify";  <div dangerouslySetInnerHTML={{__html:purify.sanitize(data) }} />

不要使用refs 和findDomNode()去訪問(wèn)渲染出來(lái)的DOM元素,然后用類似innerHTML的方法或者屬性去注入內(nèi)容。

別這樣做:

this.myRef.current.innerHTML = attackerControlledValue;

5、服務(wù)端渲染

在使用像ReactDOMServer.renderToString()和ReactDOMServer.renderToStaticMarkup()這類方法的時(shí)候,數(shù)據(jù)綁定會(huì)自動(dòng)提供內(nèi)容轉(zhuǎn)義的功能。

避免在將字符串發(fā)送到客戶端瀏覽器進(jìn)行注水(hydration)之前,把其他的一些(未經(jīng)檢驗(yàn)的)字符串連接到renderToStaticMarkup()的輸出上。

不要把未經(jīng)消毒的數(shù)據(jù)連接到renderToStaticMarkup()的輸出上,以防止XSS

app.get("/", function (req, res) {    return res.send(      ReactDOMServer.renderToStaticMarkup(        React.createElement("h2", null, "Hello World!")      ) + otherData    );  });

6、檢測(cè)依賴項(xiàng)中的漏洞

一些第三方組件的某些版本可能包含安全問(wèn)題。檢查您的依賴關(guān)系,并及時(shí)更新到更好的版本。

使用類似snyk CLI[1]的工具進(jìn)行漏洞檢查。

snyk CLI 還可以與代碼管理系統(tǒng)集成,然后自動(dòng)修復(fù)漏洞:

$ npx snyk test

7、JSON state

將JSON數(shù)據(jù)與SSR后的React頁(yè)面一起發(fā)送是常見做法。一定要用無(wú)害的等價(jià)字符轉(zhuǎn)移<字符。

使用良性等效字符轉(zhuǎn)義JSON中的HTML有效值:

window.__PRELOADED_STATE__ =   ${JSON.stringify(preloadedState).replace( /</g, '\\u003c')}

8、易受攻擊的React版本

React庫(kù)在過(guò)去有一些嚴(yán)重性很高的漏洞,因此最好保持最新版本。

使用npm outdated查看是否處于最新版本,從而避免使用react和react dom的易受攻擊版本。

9、linter工具

安裝能自動(dòng)檢測(cè)代碼中的安全問(wèn)題并提供修正建議的Linter配置和插件。

使用 ESLint React security config[2] 來(lái)檢查安全漏洞。

配置能在使用husky這樣的庫(kù)檢測(cè)到安全相關(guān)的問(wèn)題時(shí),會(huì)失敗的pre-commit鉤子。

使用Snyk自動(dòng)更新版本[3] 當(dāng)其檢查到你當(dāng)前的版本有安全問(wèn)題。

10、危險(xiǎn)的庫(kù)代碼

庫(kù)代碼通常會(huì)進(jìn)行危險(xiǎn)的操作,如直接將HTML插入DOM。人工或使用linter工具來(lái)檢查庫(kù)代碼,以檢測(cè)是否有對(duì)React機(jī)制的不安全使用。

避免那些使用dangerouslySetInnerHTML、innerHTML、未驗(yàn)證的URL或其他不安全模式的庫(kù)。使用linter工具對(duì)node_modules目錄進(jìn)行檢查。

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

向AI問(wèn)一下細(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