當前位置: 首頁> 最新文章列表> 如何結合mb_scrub 和htmlspecialchars 防止XSS 攻擊?

如何結合mb_scrub 和htmlspecialchars 防止XSS 攻擊?

gitbox 2025-07-17

在Web 開發中,跨站腳本攻擊(XSS)是一種常見且危險的安全威脅。攻擊者通過注入惡意腳本代碼,使得瀏覽器執行非預期的行為,竊取用戶信息、劫持會話,甚至控制用戶的瀏覽器。為了防止XSS,開發者通常會對用戶輸入進行嚴格的過濾和編碼處理。在PHP 中, htmlspecialchars()是最常用的防護手段之一。然而,若用戶提交的內容中包含無效或非法的字符序列,僅使用htmlspecialchars()可能無法完全防止漏洞,這時候就需要結合mb_scrub()來進行更穩健的處理。

什麼是mb_scrub?

mb_scrub()是PHP 8.2 引入的函數,作用是“清洗”包含非法字符的多字節字符串,使其成為一個合法的字符串。多字節字符在傳輸或處理過程中如果被截斷,可能形成無效的字符序列。這種非法序列若直接傳入htmlspecialchars() ,在某些條件下可能會繞過預期的轉義機制。

例如,一個非法的UTF-8 字節序列可能在瀏覽器中被錯誤解析,從而導致腳本注入。

 <span><span><span class="hljs-comment">// 示例:包含非法字節的輸入</span></span><span>
</span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"\xC0&lt;script&gt;alert('XSS');&lt;/script&gt;"</span></span><span>;

</span><span><span class="hljs-comment">// 直接使用 htmlspecialchars(不安全)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span></span>

上面的例子中,如果$input包含非法的UTF-8 字節,瀏覽器可能忽略這些字節並執行後續的<script>標籤。

如何結合mb_scrub 與htmlspecialchars 使用?

為了解決這個問題,我們可以先使用mb_scrub()清洗字符串,再傳遞給htmlspecialchars()進行HTML 實體轉義。

 <span><span><span class="hljs-comment">// 安全做法:先清洗,再轉義</span></span><span>
</span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-variable">$safe</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$clean</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$safe</span></span><span>;
</span></span>

這種組合的優勢在於:

  1. mb_scrub() 保證字符序列的合法性:無效字符被修復或剔除,防止瀏覽器在處理非法編碼時出錯。

  2. htmlspecialchars() 提供標籤轉義:將< , > , " , '等字符轉換為HTML 實體,防止HTML 注入。

實戰建議

  1. 總是指定字符集為UTF-8 ,確保跨平台一致性。

  2. 對所有用戶輸入進行清洗和轉義,尤其是輸出到HTML 時。

  3. 配合Content-Security-Policy (CSP) 使用,進一步降低XSS 風險。

  4. 升級到PHP 8.2 或更高版本,以使用mb_scrub()函數。

小結

雖然htmlspecialchars()是防止XSS 的基礎工具,但它並非萬能。如果用戶輸入中包含非法字符編碼,有可能引發安全漏洞。通過在其之前加入mb_scrub() ,可以有效清除非法字符,增強防護強度。對於追求更高安全標準的PHP 開發者來說,這種組合值得推廣使用。