問題
最近同事詢問為什麼程式中的Stream.ToArray()
, Stream.Read
會被 Checkmarx 判斷有Stored XSS
的問題呢?
Checkmarx 版本為V9.5.5.1007 HF14。
解法
Checkmarx 描述為,
Stream.Read
使用 Read 生成輸出,但未經過適當的消毒或編碼就將不可信資料嵌入生成的輸出中,這使得攻擊者能夠注入惡意程式碼到生成的網頁中。
Stream.ToArray()
使用 ToArray 生成輸出,但未經過適當的消毒或編碼就將不可信資料嵌入生成的輸出中,這使得攻擊者能夠注入惡意程式碼到生成的網頁中。
看 Checkmarx Rule ,如果輸出為 File 可以加入X-Content-Type-Options
Header , 值為nosniff
來避免 XSS。
但加入後,問題還是存在,應該是 Checkmarx 的 Bug 吧~
透過 Jer 測試後發現,在 CheckmarxV9.6就不會有這問題~~
所以目前的解法可以請原廠拿V9.6的 C# Stored XSS Rule 匯到V9.5中。
或是改做法來避開,Stream.ToArray()
就改用 BinaryReader
如下,
1 | //byte[] fileContent = stream.ToArray(); |
Stream.Read
就改用StreamReader
,例如
1 | using (var reader = new StreamReader(stream, Encoding.UTF8, leaveOpen: true)) |
註: X-Content-Type-Options
設為nosniff
可避免MIME 嗅探(MIME sniffing),
為什麼MIME 嗅探(MIME sniffing)會有 XSS 問題呢?
例如,如果原本Content-Type
設定為text/plain
,但裡面包含HTML
, JavaScript
,
Browser 可能會把它當成是 HTML 來執行,就有可能會執行JavaScript
,而產生XSS問題。
參考資源
一把粉抹在後頭窩: 喻人顧後不顧前,不要臉面。