Welche Zeichen sollten von einem Unix-Dateinamen eingeschränkt werden?

71

Stellen Sie sich ein Dialogfeld Speichern unter mit einem Freitexteintrag vor, in dem der Benutzer einen Dateinamen als Freitext eingibt und dann auf die Schaltfläche Speichern klickt . Die Software überprüft dann den Dateinamen und speichert die Datei, wenn der Name gültig ist.

Welche Regeln sollten auf einem Unix-Dateisystem bei der Validierung angewendet werden, sodass:

  • Der Name wird später nicht schwer zu manipulieren sein, um Sonderzeichen usw. zu entkommen.
  • Die Regeln sind nicht so restriktiv, dass das Speichern einer Datei nicht mehr benutzerfreundlich ist.

Was ist also im Grunde die Mindestanzahl von Zeichen, die von einem Unix-Dateinamen eingeschränkt werden sollten?

barrymc
quelle

Antworten:

60

Das Minimum sind Schrägstrich ('/') und NULL ('\ 0').

Mouviciel
quelle
1
Das Minimum ist / ,; und | um zu vermeiden, dass der Benutzer beliebige Befehle
ausführt
3
Diese. Außer '/' dürfen keine Zeichen unzulässig sein.
niemand
3
Und ASCII NUL '\ 0', da dies das Ende des Dateinamens markiert: D
Jonathan Leffler
5
Dies ist die rigorose Antwort. Die Anwendung sollte so codiert sein, dass davon ausgegangen wird, dass der Benutzer so uneingeschränkt war (beim Öffnen von Dateien sollte daher ein beliebiger Name akzeptiert werden). Es ist keine so gute Antwort zum Speichern von (neuen) Dateien. Es ist sinnvoll, den Dateinamen einige Grenzen zu setzen.
Jonathan Leffler
@mouviciel: Einige Dateisysteme wie ꜰᴀᴛ unterstützen das Zeichen ɴᴜʟʟ. Was würde passieren, wenn das Zeichen ɴᴜʟʟ in der Mitte eines Dateinamens vorhanden ist?
user2284570
40

Erstens beschreiben Sie eine schwarze Liste . Ihre bessere Option ist es, Ihre Zeichen auf eine weiße Liste zu setzen , da es (aus Benutzersicht) einfacher ist, Zeichen einzufügen, als sie wegzunehmen.

In Bezug auf das, was in einer Unix-Umgebung gut wäre:

  • az
  • AZ
  • 0-9
  • Unterstrich ( _)
  • dash ( -)
  • Punkt ( .)

Sollte Ihre Grundlagen abdecken. Räume können in Ordnung sein, machen es aber schwierig. Windows-Benutzer lieben sie, Unix / Linux nicht. Wählen Sie also je nach Zielgruppe entsprechend.

Gavin Miller
quelle
2
Zeilenumbrüche sind ein Ärgernis. Kommas sind ziemlich harmlos. Colon würde unter Unix keinen Schaden anrichten, ist jedoch problematisch, wenn der Name nach Windows kopiert wird - oder wenn die 'Datei' ein Verzeichnis ist, das möglicherweise zu PATH hinzugefügt werden muss.
Jonathan Leffler
2
Es gibt einige Gründe zu argumentieren, dass alle Zeichen, die im aktuellen Gebietsschema als 'isalpha ()' klassifiziert sind, in Ordnung sind - dies ermöglicht es den Benutzern, Zeichen mit Akzent in den Namen zu verwenden. Es kompliziert jedoch die Geschichte.
Jonathan Leffler
28
Ich jedenfalls werde alles, was akzentuierte Zeichen prüft, als benutzerunfreundlich betrachten
4
Was passiert mit Dateinamen in verschiedenen Sprachen?
Dr. Koutheir Attouchi
23

Obwohl die akzeptierte Antwort die Wahrheit haben könnte, denke ich, dass es einen Vorteil hat, einige Einschränkungen zu haben, die für Skripte oder andere Dinge möglicherweise ärgerlich sein könnten:

  • Schrägstrich (/)
  • Backslash (\)
  • NULL (\ 0)
  • Häkchen (`)
  • beginnt mit einem Bindestrich (-)
  • Stern (*)
  • Rohre (|)
  • Semikolon (;)
  • Zitate ("oder ')
  • Doppelpunkt (:)

(- vielleicht Platz, obwohl ich das nur ungern hinzufügen möchte.)

Wie Sie sehen können, sind Sie vielleicht besser dran, wenn Sie auf der Whitelist stehen, wie @Gavin vorschlägt ...

ThinkBonobo
quelle
Dies ist eine ziemlich gute Liste. Ich würde auch vorschlagen, "!" Dies kann jedoch für die Erweiterung des Verlaufs verwendet werden, wenn es interaktiv eingegeben wird. Oh, und führende Perioden (versteckt) und "<" oder ">" (Umleitung).
Steve Jorgensen
Beachten Sie außerdem, dass Sie unter Unix möglicherweise immer noch Leerzeichen, Tabulatoren und Zeilenumbrüche in Dateinamen verwenden. Ihr Code sollte nicht explodieren, nur um das zu sehen.
Randal Schwartz
22

Oft vergessen: Der Doppelpunkt (:) ist keine gute Idee, da er häufig in Dingen wie $ PATH verwendet wird, dh in der Liste der Verzeichnisse, in denen ausführbare Dateien "automatisch" gefunden werden. Dies kann zu Verwechslungen mit DOS / Windows-Verzeichnisnamen führen, wobei der Doppelpunkt natürlich in Laufwerksnamen verwendet wird.

entspannen
quelle
Auch ldd unter Linux kann verwirrt sein, wenn es nach Doppelpunkten sucht
Jon
Wenn der Dateiname einen Doppelpunkt enthält und Sie diese Partition unter Windows verwenden und die Datei löschen, führt dies zu einer Beschädigung des Dateisystems. Es kann jedoch mit dem Windows-Tool "Reparaturdiskette" behoben werden.
Kenji
11

Vergessen Sie nicht, dass Sie .am Anfang einen Punkt ( ) hinzufügen können , um Dateien und Ordner auszublenden ... Andernfalls würde ich einer * NIX-Namenskonvention (aus Wikipedia) folgen:

Die meisten UNIX-Dateisysteme

  • Fallbearbeitung: Groß- und Kleinschreibung beachten
  • Zulässiger Zeichensatz: beliebig.
  • Reservierte Zeichen: /, null.
  • Maximale Länge: 255.
  • Anmerkungen: Eine führende. Gibt an, dass ls und Dateimanager die Datei standardmäßig nicht anzeigen

Link zum Wikipedia-Artikel über Dateinamen

Tobias Wärre
quelle
8

FTW codieren

Wie Bombe in ihrer Antwort betont, ist die Einschränkung der Benutzereingabe zumindest frustrierend, wenn nicht geradezu ärgerlich. Als Entwickler sollten wir jedoch davon ausgehen, dass jede Interaktion mit unserem Code böswillig ist, und sie als solche behandeln.

Um beide Probleme in einer praktischen Anwendung zu lösen, anstatt bestimmte Zeichen in Weiß oder Schwarz aufzulisten, sollten wir die Benutzereingabe einfach nicht als Dateinamen verwenden.

Verwenden Sie stattdessen einen sicheren Namen (hex Zeichen [a-f0-9]nur für ein Höchstmaß an Sicherheit) unserer eigenen Planens, entweder verschlüsselt von der Benutzereingabe (zB PHP bin2hex ) oder eine zufällig generierte ID (zB PHP uniqid ), die dann durch eine Methode zugeordnet wird (take Ihre Wahl) zur Benutzereingabe.

Das Codieren / Decodieren kann im laufenden Betrieb ohne Abhängigkeit vom Mapping erfolgen und ist daher praktisch ideal. Der Benutzer muss nie wissen, wie die Datei wirklich heißt. solange sie erhalten / stellen Sie die Datei, und es scheint , genannt zu werden , was sie wollten, ist jeder ein Gewinner.

Mit dieser Methode kann der Benutzer seine Datei aufrufen, wie er möchte, Hacker sind die einzigen , die frustriert sind, und Ihr Dateisystem wird Sie lieben :-)

Fred Gandt
quelle
1
Exzellenter Rat! Es ist das gleiche Prinzip wie das Speichern von Namen, nameanstatt zu versuchen, sie zu erzwingen firstund lastgetrennt (was mich dazu bringt so wütend macht ). Oder wenn ich laufe in irgendwelche Beschränkungen für Passwörter andere als Mindestlänge. ("Keine Leerzeichen erlaubt?!? Aus welchem ​​irdischen Grund!?") Offensichtlich ist dies in einigen Situationen angemessener als in anderen. Manchmal müssen Sie den Benutzer aus absolut gültigen Gründen den tatsächlichen Dateinamen angeben lassen.
DaveGauer
-4

Lassen Sie den Benutzer einen beliebigen Namen eingeben. Eine künstliche Einschränkung des Zeichenbereichs stört die Benutzer nur und dient keinem wirklichen Zweck.

Bombe
quelle
9
Oder besser: '$ (rm -fr $ HOME)' (abzüglich der einfachen Anführungszeichen) als Dateiname? Das wird eher früher als später Chaos anrichten. Backticks und $ (...) sind besonders schädlich, da sie im Gegensatz zu den meisten anderen Sonderzeichen "funktionieren", wenn der Dateiname in Anführungszeichen gesetzt wird. Eingebettete Anführungszeichen sind ebenfalls schwierig.
Jonathan Leffler
7
Dies sind alles keine Probleme beim Speichern des Dateinamens. fopen () kümmert sich nicht um Ihre Dateinamen. Bei Verwendung einer grafischen Shell (z. B. Konqueror) sind Ihre Dateinamen nicht wichtig. Wenn Sie die automatische Vervollständigung in der Shell verwenden, werden Ihre Dateinamen nicht berücksichtigt. Also, was sind deine Punkte? :)
Bombe
3
@Bombe, was ein Benutzer in vielen Fällen möchte, entfremdet andere Benutzer, unabhängig von dem Chaos, das es mit Ihrem UI-Entwicklungsprozess verursacht. Schlechte Idee.
Dkretz
9
Das ist mein Punkt: Die Auswahl seltsamer Namen wird nichts anrichten - es sei denn, Ihr „irgendetwas“ ist schlecht geschrieben. Keines der Standardwerkzeuge von UNIX ist schlecht geschrieben. Nochmals: Was ist dein Punkt?
Bombe
3
Was für eine kurzsichtige Antwort von jemandem, der es wirklich besser wissen sollte. Ihre Antwort hat die ursprüngliche Frage nicht einmal richtig beantwortet. Sie sagen The name will not be difficult to manipulate later in terms of escaping special characters, etc.. Die Menschen haben hier darauf hingewiesen , dass es durchaus ein paar Zeichen , die können in gültigen Dateinamen sein, aber realistisch eine Reihe von Problemen führen.
JamEngulfer