mrjerk: file_get_contents und Sicherheit

Beitrag lesen

Hallo,
Ich stand kürzlich für ein Hobby-Projekt auch vor einem ähnlichen Problem (bei mir ging es um HTML statt XML, aber die Grundproblematik ist die gleiche).
Was mir noch einfiele, was Du noch machen könntest (ohne Anspruch auf Vollständigkeit zu erheben):

1.) Prüfe vor dem Herunterladen, ob die URL gültig ist und sich nicht um lokale Pfade o.ä. handelt, das kannst du z.b. mit parse_url() bewerkstelligen.
So sieht das bei mir aus:

  
$parseResult = parse_url($this->url);  
if ((($parseResult["scheme"] != "http") && ($parseResult["scheme"] != "https")) || (!isset($parseResult["host"]))) {  
... (keine gueltige URL)...  
} else {...}  

Je nach Konfiguration deines Webservers solltest Du ggf. sicherstellen, dass die URL nicht auf dem lokalen server liegt (oft sind ja Webserver so konfiguriert, dass sie bestimmte HTTP-Dienste ohne Authentifizierung anbieten, wenn der Aufruf vom Localhost kommt, das könnten sich Angreifer zu Nutze machen)

2.) Gib file_get_contents eine Maximal-Länge mit. Somit vermeidest Du, dass man mit zu großen Datenmengen deinen Service lahmlegen kann.

3.) Prüfe die heruntergeladenen Daten auf den korrekten File-Typ. Ich mache das bei mir durch Untersuchung des Mimetypes (was nicht 100%tig zuverlässig ist, aber zumindest verhindert, dass das S<kript jeden Mist akzeptiert):

  
...  
// Fetch HTML page  
$html = file_get_contents ($this->url, false, null, -1 , $this->maxSize);  
// Check mimetype  
$finfo = finfo_open(FILEINFO_MIME);  
if (!preg_match ("/^text\/html/", finfo_buffer($finfo, $html))) {  
... (herunter geladene Datei ist kein HTML)...  
}  
...  

Viele Grüße,
Jörg