在開發(fā)一個(gè)應(yīng)用軟件的時(shí)候,安全性其實(shí)一直都是一個(gè)平時(shí)見不到,但是一旦出現(xiàn)就非常要命的問題,在軟件開發(fā)中比較常見的就是XSS(跨站腳本攻擊),是一種常見的網(wǎng)絡(luò)安全漏洞,攻擊者通過在網(wǎng)頁中注入惡意腳本,當(dāng)其他用戶瀏覽該頁面時(shí),這些腳本會(huì)在用戶的瀏覽器中執(zhí)行。XSS攻擊通常分為三類:反射型(惡意腳本來自當(dāng)前HTTP請(qǐng)求)、存儲(chǔ)型(惡意腳本被保存到服務(wù)器數(shù)據(jù)庫中)和DOM型(通過修改頁面DOM樹觸發(fā))。攻擊者可利用XSS竊取用戶Cookie、會(huì)話令牌等敏感信息,篡改網(wǎng)頁內(nèi)容,甚至進(jìn)行釣魚欺詐。
那么如何才能防御這種網(wǎng)絡(luò)攻擊呢,在PHP中htmlspecialchars函數(shù)就是抵御這類攻擊的核心方法。
htmlspecialchars的核心功能
htmlspecialchars()函數(shù)將HTML中的特殊字符轉(zhuǎn)換為對(duì)應(yīng)的HTML實(shí)體,使瀏覽器將這些字符識(shí)別為普通文本而非可執(zhí)行代碼:
他會(huì)把字符進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換規(guī)則:
< 轉(zhuǎn)換為 <
> 轉(zhuǎn)換為 >
" 轉(zhuǎn)換為 "
' 轉(zhuǎn)換為 ' (當(dāng)使用ENT_QUOTES時(shí))
& 轉(zhuǎn)換為 &
這樣轉(zhuǎn)換之后帶代碼,通過特殊字符實(shí)體化之后,內(nèi)容始終被解釋為文本數(shù)據(jù)而非可執(zhí)行代碼,這樣就沒有辦法通過這樣的方式來攻擊我們的程序。
那么必須使用htmlspecialchars的場(chǎng)景有哪些呢?
1. 用戶生成內(nèi)容輸出
當(dāng)顯示用戶提交的文本(如評(píng)論、留言、用戶名)時(shí),必須使用htmlspecialchars:
2. 表單值回顯
在表單提交后回顯用戶輸入時(shí),防止惡意腳本執(zhí)行:
3. 動(dòng)態(tài)生成HTML屬性
當(dāng)變量值用于HTML屬性時(shí),防范屬性注入攻擊:
由此可以得到一些結(jié)論,在將任何不可信數(shù)據(jù)輸出到HTML上下文時(shí),必須使用htmlspecialchars進(jìn)行轉(zhuǎn)義