2015-08-25 8 views
6
var xDoc = XDocument.Load(fileName); 

Używam powyższego kodu w funkcji do załadowania pliku XML. Funkcjonalność jest sprawna, ale działa zgodnie z Veracode Flaw po sprawdzeniu Veracode.Jak skonfigurować analizator składni XML, aby wyłączyć zewnętrzną rozdzielczość jednostki w C#

Opis

Produkt przetwarza dokument XML, który może zawierać podmioty XML z adresami URL, które rozwiązują dokumentów poza zamierzonego sferze kontroli, powodując produkt osadzić błędnych dokumentów do jej produkcji. Domyślnie przelicznik encji XML próbuje rozwiązać i pobrać odniesienia zewnętrzne. Jeśli XML kontrolowany przez atakującego może być przesłany do jednej z tych funkcji, wówczas atakujący może uzyskać dostęp do informacji o sieci wewnętrznej, lokalnym systemie plików lub innych poufnych danych. Jest to znane jako atak XML eXternal Entity (XXE).

Zalecenia

Konfiguracja parsera XML wyłączyć rozdzielczość zewnętrznego podmiotu.

Co muszę zrobić, aby go rozwiązać.

Odpowiedz

3

Wykonaj niestandardowy XmlResolver i użyj go do odczytu XML. Domyślnie używana jest wersja XmlUrlResolver, która automatycznie pobiera rozwiązane odwołania.

public class CustomResolver : XmlUrlResolver 
{ 
    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
    { 
     // base calls XmlUrlResolver.DownloadManager.GetStream(...) here 
    } 
} 

i używać go tak:

var settings = new XmlReaderSettings { XmlResolver = new CustomResolver() }; 
var reader = XmlReader.Create(fileName, settings); 
var xDoc = XDocument.Load(reader); 
+1

Używam tego kodu w projekcie Windows. Czy to ma jakieś znaczenie? –

+1

Co wchodzi w skład metody GetEntity()? – gene

+0

@gene: Normalnie powinieneś zwrócić strumień zawierający DTD lub inne zewnętrzne źródło. Na przykład, jeśli masz typ dokumentu podobny do tego '', 'GetEntity' jest wywoływane z' absoluteUri == "MyDTD.dtd" ', i powinieneś zwrócić strumień z jego treść. Możesz po prostu zwrócić pusty DTD, aby podmioty zdefiniowane w DTD pozostały nierozwiązane. – taffer

6

Jeśli nie używasz zewnętrznych odniesień podmiotem w swojej XML, można wyłączyć resolverowi przez ustawienie go na null, od How to prevent XXE attack (XmlDocument in .net)

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.XmlResolver = null; 
xmlDoc.LoadXml(OurOutputXMLString); 

Jeśli spodziewasz się, że dokument będzie zawierał odniesienia do jednostek, musisz utworzyć niestandardowy przelicznik i umieścić na białej liście oczekiwane elementy. Zwłaszcza, wszelkie odniesienia do stron internetowych, nad którymi nie masz kontroli.

Powiązane problemy