In der modernen Webentwicklung wird XML in Datenaustausch, Konfigurationsdateien und vielen anderen Szenarien häufig verwendet. Wenn dies während der XML -Parsen nicht verhindert wird, kann dies jedoch zu einer Quelle der Anfälligkeit für externe Entitätsangriffe (XXE, XML -externer Entitätsangriff) werden. XXE -Angriffe ermöglichen es den Angreifern, böswillige Inhalte über XML -Dateien zu injizieren, was zu einem Informationsverlust, der Verweigerung von Dienstangaben (DOS) oder zur Ausführung böswilliger Code führt.
Um dieses Problem zu lösen, bietet PHP einige integrierte Funktionen, um externe Entitätsangriffe zu verhindern. Unter ihnen sind libxml_use_internal_errors () und libxml_disable_entity_loader () zwei sehr effektive Schutzmethoden. In diesem Artikel wird ausführlich erläutert, wie diese beiden Funktionen kombiniert werden können, um externe Entitätsangriffe zu verhindern.
External Entity Attack (XXE) ist ein Angriff, der von einer externen Entitätserklärung in einer XML -Datei ausgeführt wird. XML -Dateien können sich auf externe Ressourcen beziehen, die Systemdateien, URLs oder andere externe Ressourcen sein können. Ein Angreifer kann den Dateiinhalt auf sensible Informationen verweisen oder den Server über eine bösartig konstruierte XML -Datei unsichere Operationen ausführen.
Beispielsweise könnte ein Angreifer eine XML -Datei in das folgende Formular aufbauen:
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>
Zu diesem Zeitpunkt versucht der XML -Parser, die Datei des Systems /etc /passwd zu lesen und seinen Inhalt in das Datenelement zu injizieren. Solche Angriffe können zu sensiblen Datenverletzungen führen.
Bei der Verarbeitung von XML -Daten wirft PHP eine Warnung oder einen Fehler bei, wenn ein Fehler standardmäßig analysiert wird, was zu viel Fehlermeldung aufdecken kann. Verwenden Sie libxml_use_internal_errors (), um diese Standardfehlerausgänge auszuschalten, und verwenden Sie die internen Fehlerbehandlungsmechanismen. Auf diese Weise, selbst wenn die XML -Daten falsch sind oder eine potenzielle Anfälligkeit vorliegt, enthält das Programm keine detaillierten Fehlerinformationen.
libxml_use_internal_errors(true);
$xmlString = '<root><data>&xxe;</data></root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "laden XML Es ist ein Fehler aufgetreten, während。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
In diesem Beispiel stellt libxml_use_internal_errors (truors) sicher, dass das Programm keine Warnung direkt wirft, wenn ein Problem mit der XML -Datei vorliegt. Die Fehlermeldung wird intern gespeichert und kann über libxml_get_errors () erhalten werden.
libxml_disable_entity_loader () ist eine weitere Schlüsselfunktion, mit der Entwickler die Ladefunktion der externen Entität des XML -Parsers deaktivieren können, wodurch XXE -Angriffe effektiv vermieden werden. Wenn das Laden der externen Entität deaktiviert ist, kann der XML -Parser nicht in der Lage sein, Remote -Ressourcen oder Systemdateien zu laden.
libxml_disable_entity_loader(true);
$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "XML laden失败,Externe Einheiten sind deaktiviert。\n";
}
In diesem Beispiel deaktiviert libxml_disable_entity_loader (true) das Laden externer Entitäten und macht es einem Angreifer unmöglich, externe Ressourcen über eine XML -Datei zu laden, und der Parser wird sie nicht ausführt, selbst wenn die XML -Datei eine externe Entitätserklärung enthält.
Um externe Entitätsangriffe effektiv zu verhindern, können wir diese beiden Funktionen in Kombination verwenden, um sicherzustellen, dass die Fehlerausgabe unterdrückt werden kann und die Belastung der externen Entität beim Analysieren von XML deaktiviert werden kann.
libxml_use_internal_errors(true);
libxml_disable_entity_loader(true);
$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "XML laden失败。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
In diesem Beispiel wird libxml_use_internal_errors (truors) verwendet, um Fehlermeldungen während des Parsens auszublenden, während libxml_disable_entity_loader (true) sicherstellt, dass externe Entitäten deaktiviert sind. Auch wenn die XML -Datei externe Entitäten enthält, werden keine vertraulichen Informationen oder böswillige Operationen verursacht.
External Entity Attack (XXE) ist eine häufige und gefährliche Art von Anfälligkeit, die bei unsachgemäßer Handhabung zu schwerwiegenden Sicherheitsproblemen führen kann. Um solche Angriffe effektiv zu verhindern, bietet PHP zwei Funktionen: libxml_use_internal_errors () und libxml_disable_entity_loader () , die den Entwicklern helfen können, die Fehlerausgabe des XML -Parsens zu kontrollieren und externe Entitätsladen zu deaktivieren. Durch die Verwendung dieser beiden Funktionen in Kombination kann die Sicherheit von PHP -Anwendungen erheblich verbessert und die Angriffe externer Einheiten vermieden werden.