前言
最近同事詢問透過 Checkmarx 掃程式碼時,會報 Improper Restriction of XXE Ref 。
程式是透過 XmlDocument.LoadXml 來載入 XML 。
但在這之前,已有設定 XmlResolver = null,而且 .NET 版本來到了 4.7 跟本不會有 XXE 的問題。
- 環境: Checkmarx V8.9, .NET 4.7
研究
因為專案是 .NET 4.7 ,有可能會有 XXE 的問題是在 .NET 4.5.1(含以前版本),但 Checkmarx 並不知目前的專案是幾版的,所以有 XML 的操作就會把它列出來。
所以,如果要透過程式來排除這問題的話,XmlDocument 要設定 XmlResolver 值為 null 。
而如果使用 XmlReader ,則需要將 XmlReaderSettings 屬性 DtdProcessing 設定為 DtdProcessing.Prohibit。
在被掃的程式碼中,有蠻多地方有使用到 XmlDocument ,一般使用以下的方式,是不會被 checkmarx 掃出有問題的,
1 | var xmlDomInXml = new XmlDocument(); |
會有問題的地方是在較早的地方宣告 XmlDocument 後,在 Loop 迴圈中去 new XmlDocument 物件,然後才設定 xmlDomInXml.XmlResolver = null 。
可能是程式太複雜,所以 Checkmarx 無法正確找到它有設定 XmlResolver = null 。
所以就請同登在要使用時,才去建立並同時設定 XmlResolver = null。
另外有種寫法,Checkmarx 也是無法判斷的,例如,
1 |
|
所以如果有以上的問題,而一定要修正時,可以參考上面的方式來調整哦!
就是宣告並建立時,就要立馬設定 XmlResolver or DtdProcessing.Prohibit 。
其實 Checkmarx 也是透過程式來掃我們的程式,所以當程式太複雜時,難免會有出錯之時。
只是有時客戶並不會相信我們所說的,反而只相信工具產生出來的報表。