微信支付回调,XXE攻击漏洞防止方法
最近微信支付回调发现的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包的,我也不知道了,囧...
更加简单的做法就是过滤关键字,如果包含则直接丢弃之