| | | | |
| | |
| Erfahrener Benutzer Registriert seit: 14.06.2009
Beiträge: 1.711
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Hallo. Ich arbeite daran, Verzeichnispfade mit Bestandteilen ".", ".." und "//" in eine normalisierte Form zu bringen. realpath ist keine Option, da die Pfade nicht zwangsläufig existieren. Beispielsweise folgende Umformungen sollen vorgenommen werden: Code: ///dir1/../dir1/dir2/ => /dir1/dir2 ./dir1/.//dir2/../dir3//dir4/.././/.. => dir1 dir1/../../ => .. /./dir1/./dir2///../../../// => /
Erläuterungen: Zu 2 und 3: Anwender sollen gezwungen werden, beim Konkatenieren von Teilpfaden explizit einen Slash einzufügen. Die Idee ist, dass ein überzähliger Slash nie zu einem Fehler führt, ein vergessener aber schon. PHP-Code: Zu 5: Hier wird der Punkt gewählt, um bei einer Konkatenation nicht versehentlich einen absoluten Pfad zu erzeugen. PHP-Code: Ein PHPUnit-Test dazu, der einige Fälle abdeckt, die mir in den Sinn gekommen sind: PHP-Code: PHP-Code: PHP-Code:
Meine Fragen dazu sind:
Meine Paranoia kennt beim Zusammenbau von Pfaden keine Grenzen. Geändert von mermshaus (02.02.2012 um 05:01 Uhr). |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer | Die umformung ist die eine Sache, wie gewährleistes du das die Pfade auch valide sind ? Wenn du in die Luft normalisieren willst ( ../../../../../../../ ), kennt deine Function nicht die Basis worauf der Pfad läuft oder was er überhaupt darstellt und würde entsprechend normalisiert ebendso auf "../../../../../../../" weiterlauten. Mein Path-Normalizierer würde wohl in etwa so aussehen: PHP-Code: Anwendung: PHP-Code: Wie schon bereits erwähnt kannst du zwar einfach vor dir hin normalisieren aber die Pfade an sich basieren auf irgend eine Ebene ( Root-Knoten, Root-Verzeichnis, ... ), sie sollten also auch real validiert werden bevor du sie irgendwo hinklebst. Hier als Beispiel mal Windows: base path: Code: C:\a\b\c Code: ../../../../../ base path: Code: C:\ Code: ..\ Code: C:\ Seh ich aber als "lazy implemention" an, aus "strict" sicht bist du dann eine ebene über dem Root-Directory, aus Windowssicht dann in der Device-Ebene: hd0 Code: c:\ Code: ..\ Code: \\
__________________ Geändert von tr0y (02.02.2012 um 09:44 Uhr). Grund: *code einfüg* |
| | |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Pfadnormalisierungen ohne real existierende Ordner oder Dateien sind eigentlich relativ sinnlos. jeder Pfad hat irgendwo ein Wurzelverzeichnis, bei dem es nicht mehr weiter geht. Deine Pfade können aber theoretisch in der Hierarchie unendlich nach oben steigen. Wie willst du das unterbinden? /.. ist nun einmal eindeutig Quatsch und damit äquivalent zu /. Allerdings kannst du bei der Form ../.. nicht mehr erkennen, ob der Pfad gültig sein könnte oder nicht. D.h. du müsstest von vornherein ein Basis-Verzeichnis angeben, über das Pfade nicht hinausdürfen. Hierfür müsstest du jeweils die einzelnen Levels zählen. Ferner weiß du nicht, was aus symbolischen Links wird. Nun könnte ./bla durchaus ein gültiger Pfad innerhalb deines Basis-Verzeichnisses sein, aber was ist, wenn er auf einen symbolischen Link verweist, der zu einem ganz anderen Verzeichnis außerhalb deines Basis-Verzeichnisses führt? Mit realpath() kannst du das prüfen, mit einer hypothetischen Normalisierung eines "in der Luft hängenden" Teilpfades ist das jedoch nicht möglich. Mein Ansatz wäre da eher, auf existierende Dateien zu setzen. Relative Pfade kann man ja immer noch dadurch validieren, dass man die Überschneidung des Pfads zum Basis-Verzeichnis und des gerade überprüften realpaths herausrechnet. Das ist mit String-Operationen ja recht einfach.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 10.01.2010
Beiträge: 382
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
Außerdem fehlt der Fall /dir/.. Aber ich kann verstehen wenn dir eine andere Lösung besser gefällt. Wollte eben nur einen recht kurzen Ansatz liefern, der mir nicht ganz so komplex erschien. | |
| | |
| | |||||||
| Erfahrener Benutzer Registriert seit: 14.06.2009
Beiträge: 1.711
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | @Manko: Zitat:
Mein konkretes Anliegen ist derzeit die Ausgabe von Meldungen mit zusammengesetzten Pfaden (ein Anteil "../../export/helloworld" kommt aus einer Konfigurationsdatei) wie „Trying to create directory: /home/user/projects/export/helloworld“, wobei alles ab „export“ nicht existiert. „Trying to create directory: /home/user/projects/demos/helloworld/../../export/helloworld“ würde ich gern vermeiden. Eine normalisierte Form ist auch für die Funktion günstig, die das Verzeichnis dann tatsächlich erstellen soll. Dass die Funktion auch in der Lage sein soll, relative Pfade zu normalisieren, ist der Wunsch nach einer allgemeinen Lösung. Es spricht in meinen Augen nichts dagegen. Dass es wahrscheinlich sinnvoll ist, existierende Pfade in der kanonisch absoluten Variante anzugeben, ist eine andere Frage. Das ist eine relevante Überlegung bei jedem Einsatz von Pfaden. Zitat:
Zitat:
Zitat:
Dass ein Pfad, mit dem auf Dateisystemebene gearbeitet wird, absolut sein muss, ist logisch. Umgekehrt macht das relative Pfadangaben aber nicht überflüssig. Zitat:
Zitat:
Für eine möglichst lesbare Ausgabe von nicht existierenden Pfaden brauche ich sie aber. @ChrisvA: Ja, wie gesagt, meiner Einschätzung nach müssten bei regulären Ausdrücken so viele Feinheiten beachtet werden, dass gegenüber dem Ansatz von tr0y oder mir am Ende nichts gewonnen ist – wahrscheinlich wohl im Gegenteil. Das ist übrigens ein häufig auftretender Effekt bei Regex. 97 % der Einsatzfälle schafft man locker flockig aus dem Handgelenk, der Rest wird richtig knifflig. | ||||||
| | |
| | ||
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.695
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Zitat:
In dem Falle würde ich das auch in etwa so machen wie du es oben tust: den Base-Path in seine Bestandteile splitten und dann den relativen Pfad durchgehen und dessen Einzelteile auf den Basepath-Stack schmeißen. Triffst du dabei auf . tust du schlicht nichts, triffst du auf .., schmeißt du das letzte Element wieder vom Stack runter.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” | |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.879
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | tl;dr ich würde jedenfalls damit anfangen: PHP-Code:
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | ||
| Moderator Registriert seit: 11.05.2008
Beiträge: 6.247
![]() ![]() ![]() ![]() ![]() ![]() ![]() | Zitat:
Deine Vorbedingungen sind schön und gut, aber wozu? Das erhöht nur die Fehleranfälligkeit und nimmt Implikationen vor ("meine Pfade dürfen nicht mit ./ beginnen"), die man eigentlich nicht vornehmen braucht. Außerdem wird die Funktion dann bei Webpfaden ungültig, wenn du den führenden Slash nur alleinstehend akzeptierst. 1. ACK, aber dann bitte alle gültigen Varianten 2. Wozu die Einschränkung? Du reduzierst die Verwendung damit auf deine Schreibweise, die ich beispielsweise schon nicht nachvollziehen kann 3. Damit wird die Funktion unverwendbar für Webpfade, wieder eine unnötige Einschränkung. Wenn du Pfadinjection o.ä. vermeiden willst, solltest du NACH der Umwandlung gesondert prüfen, ob du den gültigen Dateipfad verlassen hast (~ open_base_dir restriction) 4. ACK, dass "" zu "." wird, aber warum wird "../" zu "/"? Das ist falsch. Zusatz: Die Angabe "//" ist einfach falsch! Höchstens "\\" könnte eine gültige Windowsnetzwerkadresse sein, aber falsch bleibt falsch => Exception. Ich würde es wie folgt aufbauen: PHP-Code: PHP-Code:
__________________ "Nuschel ich?" - "Was?" | |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| [Erledigt] In Basispfad wechseln und von dort Pfade aufrufen | Phil7789 | PHP Einsteiger | 4 | 11.09.2011 21:24 |
| [Erledigt] Php Pfade | S@ndviper | PHP Einsteiger | 17 | 18.08.2011 13:31 |
| [Erledigt] Pfade für Anwendung definieren | chunky | PHP Einsteiger | 7 | 09.05.2011 17:49 |
| Apache und relative Pfade | Cyron | Server, Hosting und Workstations | 5 | 09.11.2010 07:35 |
| Pfade in der Webentwicklung | Asipak | Wiki Diskussionsforum | 0 | 30.04.2010 08:06 |
| Schrägstriche und Pfade | chunky | PHP Tipps 2010 | 10 | 19.02.2010 07:53 |
| relative Pfade von Grafiken bei modrewrite | jjkkll | HTML, Usability und Barrierefreiheit | 1 | 03.12.2009 16:43 |
| filemtime+relative Pfade | kanti | PHP Tipps 2008 | 5 | 19.12.2008 08:17 |
| PHP: Falsche Pfade bei include/require ohne include_path | Zergling-new | Tutorials | 4 | 20.05.2008 09:55 |
| welche pfade denn nun für welche funktion? | Promaetheus | PHP Tipps 2006 | 6 | 08.11.2006 21:33 |
| opendir() auf externe pfade anwenden | PHP-Fortgeschrittene | 4 | 14.09.2005 00:10 | |
| Pfade nicht Erkannt | Server, Hosting und Workstations | 1 | 29.07.2005 13:56 | |
| Pfade in einem Formular angeben | HTML, Usability und Barrierefreiheit | 2 | 05.01.2005 10:58 | |
| Nested Set Trees und Pfade | Datenbanken | 0 | 16.12.2004 16:51 | |
| Wie gebe ich die Pfade bei lokaler installation an??? | PHP Tipps 2004 | 1 | 23.08.2004 11:29 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| pfad normalisieren php, kanonisierung php, php extends slashes, kanonisierung normalisierung, pfad normalisieren, php slash im pfad zählen, php pfad normalisieren, mermshaus pfade, php funktion kanonisieren, kanonisieren javascript |