PHP-Sicherheit erklärt · defensiv
PHP File Inclusion (LFI/RFI): was es ist und wie Sie es beheben
include und require führen jede Datei aus, die sie bekommen. Stammt ein Teil des Pfads aus dem Request, entscheidet der Besucher, was läuft.
Zuletzt aktualisiert
Worum es geht
Bei Local File Inclusion (LFI) zeigt ein Request include oder require auf vorhandene Dateien wie Konfigurationen oder Logs; zusammen mit einem Upload oder Logeintrag kann daraus Codeausführung werden. Remote File Inclusion (RFI) lädt Code von einem anderen Server und funktioniert nur mit aktiviertem allow_url_include, das laut php.net standardmäßig aus ist. MITRE führt das als CWE-98.
So finden Sie es
- Suchen Sie
include,require,include_onceundrequire_oncemit einer Variable im Argument und verfolgen Sie die Variable bis zu Request-Daten zurück. - Prüfen Sie mit
php -i, dassallow_url_includeOff ist und obopen_basedirgesetzt ist. - Sehen Sie in den Webserver-Logs nach Parametern mit
../,php://oderdata:; das zeigt Sondierung, keinen Beweis für eine Kompromittierung.
So beheben Sie es
- Bauen Sie Include-Pfade nie aus Eingaben. Ordnen Sie einen erlaubten Schlüssel einem festen Dateinamen zu, wie im Beispiel unten.
- Lassen Sie
allow_url_include = Off; erwägen Sieallow_url_fopen = Off, wenn die App keine entfernten Lesezugriffe braucht. - Setzen Sie
open_basedirauf das Site-Verzeichnis, damit PHP keine anderen Dateien öffnen kann. - Speichern Sie Uploads außerhalb des Web-Roots und binden Sie sie nie ein.
Lesende Prüfungen und sichere Muster
# Find include/require with a variable path (read-only)
grep -rnE "(include|require)(_once)?\s*\(?\s*\$" --include=*.php . | grep -v /vendor/
php -i | grep -E "allow_url_include|allow_url_fopen|open_basedir"
; php.ini hardening
allow_url_include = Off
open_basedir = /var/www/example:/tmp
// Map user choices to fixed files instead of building paths
$pages = ['home' => 'home.php', 'about' => 'about.php'];
require __DIR__ . '/pages/' . ($pages[$_GET['p'] ?? 'home'] ?? 'home.php');Macht basename() ein include sicher?
Es entfernt Verzeichnisanteile, lässt aber jede Datei in diesem Verzeichnis wählbar. Eine explizite Allowlist ist sicherer.
Ist RFI in modernem PHP noch ein Risiko?
Nur wenn allow_url_include eingeschaltet wurde. LFI bleibt häufig, weil es keine besondere Einstellung braucht.
Weitere PHP-Schwachstellenklassen
- PHP Object Injection: was es ist und wie Sie es behebenPHP Object Injection entsteht, wenn benutzerkontrollierte Eingaben unserialize() erreichen, das Objekte erzeugen kann, deren magische Methoden vom Angreifer gewählte Logik ausführen.
- SSRF in PHP: was es ist und wie Sie es behebenServer-Side Request Forgery (SSRF) entsteht, wenn eine PHP-App eine vom Benutzer gesteuerte URL abruft, sodass Angreifer über Ihren Server interne Dienste oder Cloud-Metadaten-Endpunkte erreichen.
- XSS in PHP: was es ist und wie Sie es verhindernCross-Site Scripting (XSS) entsteht, wenn eine PHP-Seite benutzerkontrollierte Daten ohne Escaping in HTML ausgibt, sodass das Skript eines Angreifers im Browser anderer Besucher läuft.
- phpinfo()-Offenlegung: warum sie zählt und wie Sie sie behebenEine öffentliche phpinfo()-Seite verrät die genaue PHP-Version, geladene Module, Dateipfade und oft Umgebungsvariablen oder Geheimnisse, was Angreifern hilft, Fehler wie PHP2Shell gezielt auszunutzen.
Quellen
Externe Links verlassen diese Website. Wir hosten keinen Exploit-Code.
- CWE-98: PHP Remote File Inclusion — MITRE CWE
- Testing for Local File Inclusion — OWASP Web Security Testing Guide
- Filesystem runtime configuration (allow_url_fopen, allow_url_include) — PHP Manual
- Core php.ini directives (open_basedir, expose_php) — PHP Manual