最近微信支付回調發現的XXE攻擊漏洞(什么是XXE攻擊,度娘、bing去搜,一搜一大把),收到通知后即檢查代碼,
微信給的解決方法是如果你使用的是:
XmlDocument:
XmlDocument xd = new XmlDocument { XmlResolver = null, };
我們做微信支付沒有使用他們的SDK,底層解析XML沒有使用XmlDocument,用的是序列化XmlSerializer.Deserialize
XmlSerializer:
1)、如果你使用的是Stream、TextReader通過源碼可以得知,已禁用XmlResolver
/// <include file='doc\XmlSerializer.uex' path='docs/doc[@for="XmlSerializer.Deserialize"]/*' /> /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public object Deserialize(Stream stream) { XmlTextReader xmlReader = new XmlTextReader(stream); xmlReader.WhitespaceHandling = WhitespaceHandling.Significant; xmlReader.Normalization = true; xmlReader.XmlResolver = null; return Deserialize(xmlReader, null); } /// <include file='doc\XmlSerializer.uex' path='docs/doc[@for="XmlSerializer.Deserialize1"]/*' /> /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public object Deserialize(TextReader textReader) { XmlTextReader xmlReader = new XmlTextReader(textReader); xmlReader.WhitespaceHandling = WhitespaceHandling.Significant; xmlReader.Normalization = true; xmlReader.XmlResolver = null; return Deserialize(xmlReader, null); }
2)、如果你使用的是XmlReader,那么需要Setting一下
using (XmlReader xr = XmlReader.Create(s, new XmlReaderSettings() { XmlResolver = null, })) { XmlSerializer xs = new XmlSerializer(typeof(T)); return xs.Deserialize(xr) as T; }
這里可以防止實體注入,另外如果想要更加安全一點的去禁用一部分Uri外部引用,過濾安全的鏈接,那么
根據上圖可以重寫XmlResolver
3)、使用其他lib包的,我也不知道了,囧...
更加簡單的做法就是過濾關鍵字,如果包含則直接丟棄之