- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- 怎么在React中防范XSS攻擊
本篇內容介紹了“怎么在React中防范XSS攻擊”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
跨站點(diǎn)腳本(XSS)攻擊是一種將惡意代碼注入網(wǎng)頁(yè)然后執行的攻擊。這是前端Web開(kāi)發(fā)人員必須應對的最常見(jiàn)的網(wǎng)絡(luò )攻擊形式之一,因此了解攻擊的工作原理和防范方法非常重要。
在本文中,我們將查看幾個(gè)用React編寫(xiě)的代碼示例,這樣您也可以保護您的站點(diǎn)和用戶(hù)。
示例1:React中成功的XSS攻擊
對于我們所有的示例,我們將實(shí)現相同的基本功能。我們將在頁(yè)面上有一個(gè)搜索框,用戶(hù)可以在其中輸入文本。點(diǎn)擊“Go”按鈕將模擬運行搜索,然后一些確認文本將顯示在屏幕上,并向用戶(hù)重復他們搜索的術(shù)語(yǔ)。這是任何允許你搜索的網(wǎng)站的標準行為。
很簡(jiǎn)單,對吧?會(huì )出什么問(wèn)題呢?
好吧,如果我們在搜索框中輸入一些HTML怎么辦?讓我們嘗試以下代碼段:
<img src="1" onerror="alert('Gotcha!')" />
現在會(huì )發(fā)生什么?
哇,onerror 事件處理程序已執行!那不是我們想要的!我們只是不知不覺(jué)地從不受信任的用戶(hù)輸入中執行了腳本。
然后,破碎的圖像將呈現在頁(yè)面上,那也不是我們想要的。
那么我們是怎么到這里的呢?好吧,在本例中渲染搜索結果的JSX中,我們使用了以下代碼:
<p style={searchResultsStyle}>You searched for: <b><span dangerouslySetInnerHTML={{ __html: this.state.submittedSearch }} /></b></p>
用戶(hù)輸入被解析和渲染的原因是我們使用了 dangerouslySetInnerHTML 屬性,這是React中的一個(gè)特性,它的工作原理就像原生的 innerHTML 瀏覽器API一樣,由于這個(gè)原因,一般認為使用這個(gè)屬性是不安全的。
示例2:React中的XSS攻擊失敗
現在,讓我們看一個(gè)成功防御XSS攻擊的示例。這里的修復方法非常簡(jiǎn)單:為了安全地渲染用戶(hù)輸入,我們不應該使用 dangerouslySetInnerHTML 屬性。相反,讓我們這樣編寫(xiě)輸出代碼:
<p style={searchResultsStyle}>You searched for: <b>{this.state.submittedSearch}</b></p>
我們將輸入相同的輸入,但這一次,這里是輸出:
很好!用戶(hù)輸入的內容在屏幕上只呈現為文字,威脅已被解除。
這是個(gè)好消息!React默認情況下會(huì )對渲染的內容進(jìn)行轉義處理,將所有的數據都視為文本字符串處理,這相當于使用原生 textContent 瀏覽器API。
示例3:在React中清理HTML內容
所以,這里的建議似乎很簡(jiǎn)單。只要不要在你的React代碼中使用dangerouslySetInnerHTML 你就可以了。但如果你發(fā)現自己需要使用這個(gè)功能呢?
例如,也許您正在從諸如Drupal之類(lèi)的內容管理系統(CMS)中提取內容,而其中某些內容包含標記。(順便說(shuō)一句,我可能一開(kāi)始就不建議在文本內容和來(lái)自CMS的翻譯中包含標記,但對于本例,我們假設您的意見(jiàn)被否決了,并且帶有標記的內容將保留下來(lái)。)
在這種情況下,您確實(shí)想解析HTML并將其呈現在頁(yè)面上。那么,您如何安全地做到這一點(diǎn)?
答案是在渲染HTML之前對其進(jìn)行清理。與完全轉義HTML不同,在渲染之前,您將通過(guò)一個(gè)函數運行內容以去除任何潛在的惡意代碼。
您可以使用許多不錯的HTML清理庫。和任何與網(wǎng)絡(luò )安全有關(guān)的東西一樣,最好不要自己寫(xiě)這些東西。有些人比你聰明得多,不管他們是好人還是壞人,他們比你考慮得更多,一定要使用久經(jīng)考驗的解決方案。
我最喜歡的清理程序庫之一稱(chēng)為sanitize-html,它的功能恰如其名。您從一些不干凈的HTML開(kāi)始,通過(guò)一個(gè)函數運行它,然后得到一些漂亮、干凈、安全的HTML作為輸出。如果您想要比它們的默認設置提供更多的控制,您甚至可以自定義允許的HTML標記和屬性。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站