PHP verfügt über eine Konfigurationsoption namens „allow_url_fopen“, die standardmäßig aktiviert ist. Es ermöglicht Ihnen, auf viele Arten von Ressourcen zu verweisen und diese wie lokale Dateien zu behandeln. Sie können beispielsweise den Inhalt (HTML) einer Seite erhalten, indem Sie die URL lesen:
<?php $contents = file_get_contents('http://example.org/'); ?>
Wie in Kapitel 5 erläutert, können schwerwiegende Schwachstellen entstehen, wenn manipulierte Daten verwendet werden, um auf Dateien in include und require zu verweisen. Tatsächlich halte ich diese Sicherheitslücke für eine der gefährlichsten in PHP-Anwendungen, da sie es einem Angreifer ermöglicht, beliebigen Code auszuführen.
Obwohl etwas weniger schwerwiegend, kann eine ähnliche Sicherheitslücke durch die Verwendung fehlerhafter Daten in einer Standarddateisystemfunktion entstehen:
<?php $contents = file_get_contents($_GET['filename']); ?>
Dieses Beispiel ermöglicht es dem Benutzer, file_get_contents( )-Verhalten, sodass der Inhalt der Remote-Ressource abgerufen wird. Betrachten Sie eine Anfrage wie die folgende:
http://www.php.cn/ … mlle.org%2Fxss.html
Dies führt dazu, dass der Wert von $content beeinträchtigt wird. Da dieser Wert indirekt ermittelt wird, wird diese Tatsache wahrscheinlich ignoriert. Aus diesem Grund behandelt das Defense-in-Depth-Prinzip das Dateisystem als Remote-Datenquelle und den Wert von $content als Eingabe, sodass Ihr Filtermechanismus möglicherweise die Situation ändern kann.
Weil der $content-Wert kontaminiert ist Dies kann zu einer Vielzahl von Sicherheitslücken führen, darunter Cross-Site-Scripting-Schwachstellen und SQL-Injection-Schwachstellen. Hier ist beispielsweise ein Beispiel für eine Cross-Site-Scripting-Schwachstelle:
<?php $contents = file_get_contents($_GET['filename']); echo $contents; ?>
Die Lösung besteht darin, niemals auf einen Dateinamen mit fehlerhaften Daten zu verweisen. Bestehen Sie einfach darauf, die Eingabe zu filtern, und stellen Sie sicher, dass die Daten gefiltert werden, bevor sie auf einen Dateinamen verweisen:
<?php $clean = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); ?>
Es gibt zwar keine Garantie dafür, dass die Daten in $content völlig fehlerfrei sind, aber dies gibt eine hinreichende Garantie dafür, dass die Datei, die Sie lesen, genau die Datei ist, die Sie lesen wollten, und nicht eine vom Angreifer angegebene Datei. Um die Sicherheit dieses Prozesses zu erhöhen, müssen Sie $content auch als Eingabe behandeln und vor der Verwendung filtern.
<?php $clean = array(); $html = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); /* Filter Input ($contents) */ $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8'); echo $html['contents']; ?>
Der obige Prozess stellt eine leistungsstarke Methode zur Verhinderung verschiedener Angriffe dar und wird für die Verwendung in der tatsächlichen Programmierung empfohlen.
Das Obige ist der Inhalt der PHP-Sicherheits-Remote-Dateirisiken. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). php.cn)!