為什么要進行特殊字符轉義及編碼?
在 HTML 中,有一些特殊字符不可直接使用,需要使用轉義字符或實體編碼來表示。這是為了避免這些字符與 HTML 標簽和語法產(chǎn)生沖突。同時,也是為了防范前端XSS。
例如,有些特殊字符(如 <
和 >
)作為HTML標簽的一部分,要是沒有被特殊處理可能被惡意XSS。
前端XSS的危害及轉義用處
HTML的特殊字符轉義及編碼在防范跨站腳本攻擊(Cross-Site Scripting, XSS)方面起到關鍵作用。XSS是一種常見的安全漏洞,攻擊者通過在受信任網(wǎng)站上插入惡意腳本,使其在用戶瀏覽器中執(zhí)行。
HTML的特殊字符轉義及編碼的作用如下:
(1)阻止腳本注入:
假設一個博客網(wǎng)站允許用戶發(fā)表評論,并將評論內(nèi)容直接顯示在頁面上。如果沒有進行轉義或編碼處理,攻擊者可以在評論中插入惡意腳本。例如:
用戶評論:<script>alert('XSS Attack');</script>
如果評論內(nèi)容未經(jīng)過轉義或編碼,這段惡意腳本將在其他用戶瀏覽該頁面時被執(zhí)行。
接下來以XSS-Labs靶場為例,成功執(zhí)行XSS時將彈窗“完成的不錯”
由于后端無任何過濾及轉義處理,可以看到,XSS語句執(zhí)行成功:
然而,通過將特殊字符轉義為實體編碼,將評論內(nèi)容顯示為普通文本,如下所示:
<script>alert('XSS Attack');</script>
這樣,評論內(nèi)容不再被解釋為可執(zhí)行的腳本,保護了頁面和用戶的安全。
(2)防止HTML標簽和屬性的濫用:
假設一個社交媒體網(wǎng)站允許用戶在個人簡介中添加自我介紹。如果用戶輸入的內(nèi)容未經(jīng)過轉義或編碼處理,并且在個人簡介頁面上直接顯示,那么攻擊者可以在自我介紹中插入惡意HTML標簽或屬性。例如:
用戶輸入:<img src="javascript:alert('XSS Attack');" />
如果該內(nèi)容未經(jīng)過任何處理,則圖像標簽會被解釋并執(zhí)行其中的JavaScript代碼。
舉個例子:
通過將特殊字符轉義為實體編碼,將自我介紹內(nèi)容顯示為普通文本,如下所示:
<img src="javascript:alert('XSS Attack');" />
這樣,HTML標簽和屬性不再被解析為可執(zhí)行的代碼,保護了頁面和用戶的安全。
同時,我們可以看到,在一些程序中,輸入XSS語句之后并不會被轉義,也不會被執(zhí)行:
這是運用了更高級XSS防護技術的緣故。
(3)防止URL注入:
假設一個電子商務網(wǎng)站允許用戶在評論中包含鏈接,并直接將這些鏈接顯示在頁面上。如果URL未經(jīng)過適當?shù)木幋a處理,攻擊者可以在URL中注入惡意腳本或其他惡意內(nèi)容。例如:
用戶評論:https://www.example.com?param=<script>alert('XSS Attack');</script>
如果該評論未經(jīng)過任何處理,鏈接將會被解釋并執(zhí)行其中的JavaScript代碼。
通過對URL進行編碼,如下所示:
https://www.example.com?param=%3Cscript%3Ealert('XSS%20Attack')%3C/script%3E
這樣,URL中的特殊字符被轉義為實體編碼,防止了惡意代碼的執(zhí)行。
(4)XSS過濾器的輔助作用:
例如,當瀏覽器檢測到頁面中的特殊字符被正確轉義或編碼時,它們會將其視為純文本,不會將其解析為HTML標簽或腳本。這有助于識別和阻止?jié)撛诘腦SS攻擊。
下面列舉兩個常見的瀏覽器XSS過濾器:
1.Chrome瀏覽器:
- XSS Auditor:Chrome瀏覽器內(nèi)置了名為XSS Auditor的過濾器,它嘗試檢測和阻止反射型XSS攻擊。
- Sanitizer:Chrome還使用了一種HTML Sanitizer來處理和過濾用戶輸入,以防止XSS攻擊。
2.Firefox瀏覽器:
- Content Security Policy (CSP):Firefox支持Content Security Policy,這是一種通過聲明策略限制內(nèi)容加載和執(zhí)行的機制。CSP可用于阻止XSS攻擊。
- 部分自動XSS過濾:Firefox也提供了一些內(nèi)置的自動XSS過濾功能,用于檢測和阻止?jié)撛诘腦SS攻擊。
如何進行特殊字符轉義及編碼?
(1)使用內(nèi)置函數(shù)或方法:
大多數(shù)編程語言和框架提供了內(nèi)置的函數(shù)或方法來進行字符轉義和編碼。例如:
- 在JavaScript中,可以使用
encodeURIComponent()
或encodeURI()
來對URL進行編碼,使用innerHTML
或innerText
屬性來進行HTML轉義。 - 在PHP中,可以使用
htmlspecialchars()
或htmlentities()
來進行HTML轉義。 - 在Java中,可以使用
URLEncoder.encode()
來對URL進行編碼,使用StringEscapeUtils.escapeHtml()
來進行HTML轉義。
舉個使用內(nèi)置函數(shù)或方法的例子(JavaScript):
// URL編碼
let url = 'https://www.example.com/?param=' + encodeURIComponent('<script>alert("XSS Attack");</script>');
console.log(url);
// 輸出:https://www.example.com/?param=%3Cscript%3Ealert(%22XSS%20Attack%22);%3C/script%3E
// HTML轉義
let userInput = '<script>alert("XSS Attack");</script>';
let escapedHtml = document.createElement('div');
escapedHtml.textContent = userInput;
console.log(escapedHtml.innerHTML);
// 輸出:<script>alert("XSS Attack");</script>
(2)使用專門的編碼庫:
有一些專門用于字符轉義和編碼的開源庫,可以提供更強大和全面的功能。例如:
- OWASP Java Encoder:適用于Java的開源庫,提供各種編碼器和解碼器,用于對URL、HTML、JavaScript等進行編碼和解碼。
- PHP HTML Purifier:適用于PHP的開源庫,用于過濾和轉義HTML,以防止XSS攻擊。
- Python Bleach:適用于Python的開源庫,提供HTML標簽過濾、標簽屬性過濾和標簽內(nèi)容轉義等功能。
舉個例子(Java):
import org.owasp.encoder.Encode;
// URL編碼
String url = "https://www.example.com/?param=" + Encode.forUriComponent("<script>alert(\"XSS Attack\");</script>");
System.out.println(url);
// 輸出:https://www.example.com/?param=%3Cscript%3Ealert(%22XSS%20Attack%22);%3C/script%3E
// HTML轉義
String userInput = "<script>alert(\"XSS Attack\");</script>";
String escapedHtml = Encode.forHtml(userInput);
System.out.println(escapedHtml);
// 輸出:<script>alert("XSS Attack");</script>
(3)手動實現(xiàn)轉義規(guī)則:
可以創(chuàng)建自定義的轉義表或函數(shù)來執(zhí)行特殊字符的轉義。這需要仔細研究和了解特殊字符的轉義規(guī)則,并編寫相應的代碼來替換字符。
轉義時應考慮多重編碼:當字符傳輸經(jīng)過多個層級或環(huán)節(jié)時,確保在每個層級或環(huán)節(jié)上都進行了正確的編碼和轉義處理。
常見的特殊字符轉義及編碼
1.小于號 <
:
- 轉義形式:
<
- 實體編碼:
<
2.大于號 >
:
- 轉義形式:
>
- 實體編碼:
>
3.和符號 &
:
- 轉義形式:
&
- 實體編碼:
&
4.雙引號 "
:
- 轉義形式:
"
- 實體編碼:
"
5.單引號 '
:
- 轉義形式:
'
- 實體編碼:
'
6.版權符號 ?
:
- 轉義形式:
©
- 實體編碼:
©
7.注冊商標符號 ?
:
- 轉義形式:
®
- 實體編碼:
®
8.省略號 …
:
- 轉義形式:
…
- 實體編碼:
…
9.非斷空格(不換行空格):
- 轉義形式:
- 實體編碼:
 
10.破折號 –
:
- 轉義形式:–
- 實體編碼:–
文章來源:http://www.zghlxwxcb.cn/news/detail-757994.html
在 HTML 中,使用轉義字符或實體編碼確保這些字符正確地顯示而不會被解析為 HTML 標簽或語法。文章來源地址http://www.zghlxwxcb.cn/news/detail-757994.html
到了這里,關于【網(wǎng)絡安全/前端XSS防護】一文帶你了解HTML的特殊字符轉義及編碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!