過去防止 XSS 攻擊都是透過 htmlspecialchars() 將「<」、「>」等符號編碼,但若是前端有使用 CKEditor 之類工具,文章中的樣式也會全部被洗掉。
最近用 CodeIgniter Input class 提供的 XSS filter 時,無意間發現 filter 不是將所有特殊符號過濾掉,而是經過 parser 以後才決定哪些標籤和屬性需要刪除。
一般常見用來測試 XSS 的字串:
<script>alert(123)</script>
輸出:
[removed]alert(123)[removed]
若是將 javascript 嵌在屬性當中,CodeIgniter 會將標籤留下、屬性刪除:
<a href="#" onclick="alert(123)">test</a>
輸出:
<a >test</a>
parser 好像會 pa 錯 XD
一些正常的中文字符會被過濾掉