PHP-Escape-Benutzereingabe für Dateinamen

Lesezeit: 3 Minuten

Ich habe ein Formular, in das Benutzer Dateien hochladen können, und ich möchte der Datei einen Namen in der Art von geben [id]_[lastname]_[firstname].pdf. Der Name wird vom Benutzer eingegeben, und ich habe Angst, dass er etwas mit einem Schrägstrich eingibt. Ansonsten sowas wie $path = $dir.$filename dazu führen könnte $path="uploads/2_smith_john/hahaimajerk.pdf" wenn der Vorname ist john/hahaimajerk.

Ich möchte Benutzer nicht wirklich zwingen, ihre Namen auf irgendetwas zu beschränken; Es macht mir nichts aus, ihre Namen im Dateinamen ein wenig zu ändern, solange ich den ursprünglichen Namen erkennen kann. Welche Zeichen muss ich entkommen, oder gibt es eine andere Möglichkeit, dies zu tun? Oder … benutze ich einfach mysql_real_escape_string?

  • Wie Alex N. sagt, ist escapeshellarg genau das, wonach Sie suchen, aber ich würde dringend in Erwägung ziehen, bekanntermaßen sichere Dateinamen zuzuweisen und sie über Ihre Datenbank zuzuordnen, möglicherweise zu benutzerfreundlichen Dateinamen.

    – Stefan

    27. November 2010 um 3:09 Uhr

  • schlimmer: Stellen Sie sich einen Vornamen von “/../../../etc/passwd” vor

    – Greg

    3. Februar 2012 um 16:55 Uhr

  • Allgemein gesagt “.” und “..” sind ebenfalls wichtig zu berücksichtigen.

    – Asmecher

    20. September 2013 um 18:33 Uhr

Normalerweise verwende ich dafür reguläre Ausdrücke. Und anstatt bestimmte spezifische Zeichen (wie Schrägstriche, Punkte usw.) zu entfernen, ziehe ich es vor, nur bestimmte Zeichen (wie alphanumerische Zeichen) zuzulassen.

Dadurch wird beispielsweise jedes Zeichen, das kein Buchstabe, keine Zahl, kein Bindestrich oder Unterstrich ist, durch einen Unterstrich ersetzt:

$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw);

Der Backslash vor dem Bindestrich dient als Escapezeichen für den Bindestrich im regulären Ausdruck, da Bindestriche ansonsten zur Angabe von Zeichenbereichen (z. B. AZ) verwendet werden.

  • Bindestrich am Ende (oder Anfang) gelten nicht als Reichweitenanzeige

    – luxem

    4. September 2013 um 7:53 Uhr

  • Auf diese Weise wird auch der Punkt zwischen Dateiname und Dateierweiterung maskiert.

    – SAMPro

    6. Juli 2014 um 19:17 Uhr

  • @SAMPro stimmt, aber es ist ein Dateiname, über den wir sprechen, Sie sollten immer Ihre eigene Erweiterung erstellen, nachdem Sie MIME-TYPE auf zuverlässige Weise überprüft haben (z Fileinfo-Modul)

    – jave.web

    25. September 2014 um 5:15 Uhr


  • /[^\w-]/ reicht !

    – Drasil

    30. März 2016 um 16:45 Uhr

mysql_real_escape_string entgeht Schrägstrichen nicht. Eben escapeshellarg werde es nicht tun. Sie müssen verwenden str_replace:

$path = str_replace("https://stackoverflow.com/", '_', $path);

  • Ich war besorgt, dass es andere Symbole gibt, die gefährlich sein könnten – hoffentlich ist / das einzige Problem.

    – munchybunch

    27. November 2010 um 3:12 Uhr

  • escapeshellarg und dies ist nur nützlich, wenn Shell-Befehle gesendet werden (mit Shell_exec, exec und dergleichen), um sicherzustellen, dass andere Operatoren (wie ;, && oder Backticks) werden maskiert, um Shell Command Injection zu verhindern (ähnlich wie SQL Injection, aber in einer Shell und VIEL schädlicher). Die Dateisystemfunktionen von PHP (fopen, file_put_contents und so) müssen Dateinamen nicht maskieren. Im schlimmsten Fall in Ihrer Situation (dh: ohne str_replace) kann PHP die Datei nicht mit einem Fehler “Keine solche Datei oder kein solches Verzeichnis” schreiben.

    – Netcoder

    27. November 2010 um 3:16 Uhr

  • Das Betriebssystem lässt möglicherweise auch bestimmte Zeichen in Dateinamen nicht zu (z. B. lässt Windows den Doppelpunkt nicht zu :, sowie verschiedene andere Zeichen), was ein Problem ist, das diese Antwort nicht löst. Wenn Sie sich nicht sicher sind, in welcher Serverumgebung Ihr Code ausgeführt wird, ist die Antwort von Tommy Lacroix weitaus besser.

    – JMTyler

    20. April 2014 um 18:21 Uhr

Das einzige “unsichere” Zeichen in einem Dateinamen ist / – So können Sie Probleme bei der Verwendung leicht vermeiden str_replace("https://stackoverflow.com/","",$filename)

  • “.” und “..” können ebenfalls Probleme verursachen.

    – Asmecher

    20. September 2013 um 17:58 Uhr

  • . und .. sind ohne die harmlos /.

    – Niet the Dark Absol

    20. September 2013 um 18:18 Uhr

  • … sind aber immer noch reservierte Namen und sollten meiner Meinung nach berücksichtigt werden.

    – Asmecher

    20. September 2013 um 18:44 Uhr

  • . kann schädlich sein, wenn es sich um Ihren gesamten Dateinamen handelt. Zum Beispiel, rmdir(realpath($pathToWeb . '../uploads/' . $userInput)) oder eine ähnliche Situation

    – Marius Balčytis

    27. Januar 2014 um 23:09 Uhr

  • Sie sollten also verwenden $filename = preg_replace('((^\.)|\/|(\.$))', '_', $filename) — die entkommt irgendein Schrägstrich und jeden Punkt am Anfang oder Ende.

    – kräh

    27. September 2014 um 20:23 Uhr

1256260cookie-checkPHP-Escape-Benutzereingabe für Dateinamen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy