微信支付回調,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包的,我也不知道了,囧...

更加簡單的做法就是過濾關鍵字,如果包含則直接丟棄之

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM