Frage

Hallo an alle, ich bin die Entwicklung einer Foto-sharing-Website mit der CodeIgniter-PHP-framework.Die Idee ist, dass die Menschen laden Ihre Fotos, die Sie verwalten (durch irgendeine Art von Datei browser, was es Ihnen ermöglicht, Unterordner zu erstellen, ziehen Sie um die Dateien, etc) und Bearbeiten Sie (einige grundlegende Dinge wie ändern der Größe, drehen und zuschneiden, um mit zu beginnen, und später, werde ich hinzufügen, einige der erweiterten Funktionen).

Ich habe bereits ein third party authentication-Lösung für CI (Redux-Authentifizierung 2 Beta) und ich bin jetzt die Integration eines JS/PHP-Datei-manager - (AjaxExplorer), aber das problem ist, dass das PHP-backend verwalten Sie Dateien (verschieben, kopieren, etc) zu viel Vertrauen auf die Eingabe des Benutzers aus der ajax-Aufrufe.Für Beispiel, es ist Dinge zu tun, wie dieses (vereinfachte Gründen der übersichtlichkeit):

move_uploaded_file($_FILES['upload']['tmp_name'], $root.$username.$_POST['destination_dir']);

Wie Sie sehen können, gibt es offensichtliche Sicherheitsbedenken, wie es blind akzeptiert welchen Weg der user wirft!Ich kann schon sehen, jemand senden, so etwas wie "../AnotherUser/" als $_POST['destination_dir'] - Wert.

Meine Frage ist: Was ist der beste Weg, um "sandbox" einen Benutzer, um nur ihm erlauben, zu verwalten, seine eigenen Daten? Muss ich nur überprüfen+filter der Eingänge, in der Hoffnung zu fangen jeden Versuch des Eindringens?Gibt es Bibliotheken/Pakete gewidmet Adresse dieses spezielle Problem?

Ich denke, das problem muss irgendwie gelöst in jeder (reif genug) Projekt gibt, die Ihren Benutzern die Möglichkeit, die Verwaltung Ihrer Dateien über einen web-browser, so dass ich voraussichtlich finden einige klare Richtlinien, um dieses (so gibt es eine Menge zu SQL-Injection, XSS, CSRF, usw) aber ich denke, ich bin nicht mit dem richtigen keywords.

War es hilfreich?

Lösung

Was ist der beste Weg, um "sandbox" einen Benutzer, um nur ihm erlauben, zu verwalten, seine eigenen Daten?

Erlauben Sie jedem Dateinamen/Verzeichnisnamen der user will, aber einfach nicht auf der server-Seite-Dateisystem.Stattdessen schreiben Sie den Pfad-und Dateinamen in einer Datenbank mit einer primary key, und verwenden Sie den Primärschlüssel als Dateinamen wie ‘34256.dat' in eine flache Lagerung auf ein Verzeichnis (oder sogar als BLOB in die Datenbank, wenn Sie es vorziehen).Dann servieren über einen download-Skript oder URL rewrite, um den gewünschten Dateinamen in der URL erscheinen.

Desinfizierender eingehende Dateinamen hart.Erkennung '..' ist nur der Anfang.Zu lange Dateinamen;zu kurzen Dateinamen;Kombinationen von voran-und nachgestellte Punkte;Kombinationen von führenden und nachfolgenden Leerzeichen;die anderen Verzeichnis Trennzeichen für verschiedene Plattformen;Zeichen, die ungültig sind auf einigen Plattformen;steuerzeichen;Unicode-Zeichen und Umgebung-spezifische Möglichkeiten der Behandlung;ADSs;Dateinamen (‘.htaccess') oder Erweiterungen ('.php', '.cgi'), der möglicherweise "special" auf Ihrem web-server;Windows reservierte Dateinamen...

Sie können verbringen ein Leben lang-tracking-down-lustige kleine Macken filepath Regeln auf verschiedenen Plattformen, oder Sie können einfach vergessen, und verwenden Sie die Datenbank.

Andere Tipps

Ich bin mir nicht sicher, was Ihr destination_dir sieht aus wie, aber was ich dachte, war die Zuordnung von Verzeichnissen Tasten, und dann immer das Verzeichnis basiert auf diesem Schlüssel.Zum Beispiel:

//$_POST['destination_dir'] = '4hg43h5g453j45b3';
*_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

Allerdings müssen Sie vorgeben, Schlüssel, bevor die hand.Eine weitere alternative könnte das Gegenteil sein:md5 - /sha1-der Eingang und die Verwendung der destination_dir, und speichern Sie dann, dass der key in der Datenbank mit der Bezeichnung verknüpft ist.

Es gibt keine Bibliothek, die ich kenne.
Aber in Ihrem speziellen Beispiel, Streifen alle (zurück), Schrägstriche und Punkte aus der Zeichenfolge und fügen Sie einen Schrägstrich an das Ende von es, auf diese Weise kann der Benutzer nicht ändern Ordner.

$destdir = str_replace(array('.', '/', '\\'), '', $_POST['destination_dir']); 
$destdir .= "/";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top