2012-05-11 5 views
5

Ich habe eine Frage, wenn ich darf. Ich habe eine Variable mit dem Namen $source und diese sollte einen relativen Pfad zu einer Datei enthält, zum Beispiel ./uploads/2012/some-document.pdfEine Zeichenkette prüfen, um zu sehen, ob die Datei lokal existiert

Nun, diese $source Variable Benutzereingabe enthält, über $ _GET und $ _POST. Ich möchte nicht, dass Menschen URLs eingeben und ich möchte nur etwas tun, wenn die Datei existiert nur auf dem lokalen Server.

Meine Frage ist, was ist der beste Weg zu prüfen, ob eine Datei nur auf dem lokalen Server existiert?


Das ist, was ich bisher habe:

1) file_exists kann je nach Serverkonfiguration true zurück, so konnte ich dies, wenn die ersten paar charatcers der Zeichenfolge zu überprüfen, neben stripos verwenden http: // etwa so:

if(file_exists($source) && stripos($source,'http://')!==0) { 
    echo 'File exists on local'; 
} 

wäre jedoch der Nachteil muss ich all die verschiedenen URL-Typen wie https angeben würde: // http: // und ftp: // nur zu sicher sein.

2) Ich benutze realpath, um den absoluten Pfad der Datei zu erhalten, und dies gibt false zurück, wenn es nicht gefunden werden kann. Dies scheint ziemlich solide, aber nicht 100% Dies ist die beste Anwendung für sie

3) Verwenden Sie preg_replace, um alle URL-Erwähnungen in der Zeichenfolge zuerst zu entfernen, und verwenden Sie einfach file_exists. Während dies wahrscheinlich die sicherste wäre, wäre es höchstwahrscheinlich die intensivste und ich würde es vorziehen, diese Methode nicht zu verwenden.

Antwort

3

Zusätzlich zu den anderen Antworten, können Sie Pfade leugnen, dass ein System einfach mit verwenden:

if (parse_url($path, PHP_URL_SCHEME)) { 
    // has something:// so ignore 
} 

Dies würde mit Spezialverpackungen auch funktionieren wie php://, zlib://, etc ...

Sie können auch eine lokale Überprüfung der Eingangsvariablen durch Voranstellen mit file://:

file_exists('file://' . $path); 
+0

Das ist ein ausgezeichneter Vorschlag parse_url zu verwenden, ich denke, dass und file_exists wäre gut. Danke –

+0

Es kann Probleme unter Windows mit file_exists() und is_file() in Kombination mit Remote-Dateien geben. Es scheint, als würde Windows es herunterladen oder so ähnlich. Verwenden Sie besser parse_url() und suchen Sie nach einem leeren Host. – redaxmedia

2

Gehen Sie mit realpath() (in Verbindung mit file_exists). Es wird URLs für Sie herausfiltern, und Sie sollten ein solides zuverlässiges Ergebnis darüber erhalten, ob die Datei existiert oder nicht.

+0

erzwingen Danke, habe nicht daran gedacht, diese beiden zu kombinieren, ich Ich denke, sie werden gut zusammenarbeiten. Prost –

Verwandte Themen