string sanitizer mit dem Namen
Ich bin auf der Suche nach einer php-Funktion, bereinigen, einen string und machen es bereit für einen Dateinamen. Wer weiß, der ein handy?
( Ich könnte es schreiben, aber ich bin besorgt, dass ich werde übersehen, ein Zeichen! )
Edit: für die Speicherung von Dateien auf eine Windows-NTFS-Dateisystem.
InformationsquelleAutor der Frage user151841 | 2010-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt sich Gedanken über den Blick auf Zeichen - wie wäre es mit einer whitelist von Zeichen, die Sie gerne eingesetzt werden? Sie könnten zum Beispiel erlauben, einfach good ol'
a-z
0-9
_
und eine einzelne Instanz einer Periode (.
). Das ist natürlich mehr, als die Begrenzung der meisten Dateisysteme, aber sollten Sie sicher zu halten.InformationsquelleAutor der Antwort Dominic Rodger
Machen eine kleine Anpassung an Tor-Valamo Lösung um das problem zu beheben, bemerkte Dominic Rodger, Sie könnte verwenden:
InformationsquelleAutor der Antwort Sean Vieira
Was ist mit rawurlencode() ?
http://www.php.net/manual/en/function.rawurlencode.php
Hier ist eine Funktion, die desinfizieren auch chinesische Zeichen:
Hier ist die Erklärung
OK, manche mit dem Namen nicht releavant, aber in den meisten Fällen wird es funktionieren.
ex.
Ursprünglicher Name: "საბეჭდი-და-ტიპოგრაფიული.jpg"
Ausgabe Name: "-E1-83-A1-E1-83-90-E1-83-91-E1-83-94-E1-83-AD-E1-83-93-E1-83-98--E1-83-93-E1-83-90--E1-83-A2-E1-83-98-E1-83-9E-E1-83-9D-E1-83-92-E1-83-A0-E1-83-90-E1-83-A4-E1-83-98-E1-83-A3-E1-83-9A-E1-83-98.jpg"
Ist es besser so, als ein 404-Fehler.
Hoffe, das war hilfreich.
Carl.
InformationsquelleAutor der Antwort SequenceDigitale.com
LÖSUNG 1 - einfach und effektiv
$file_name = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $url ) );
[^a-z0-9]+
wird dafür sorgen, die mit dem Namen verfolgt nur Buchstaben und zahlen'-'
hält die Dateinamen lesbarBeispiel:
LÖSUNG 2 - für sehr lange URLs
Sie Zwischenspeichern möchten, die URL, Inhalte und müssen nur eindeutige Dateinamen.
Ich würde diese Funktion verwenden:
$file_name = md5( strtolower( $url ) )
dies erzeugt einen Dateinamen mit fester Länge. Der MD5-hash ist in den meisten Fällen eindeutig genug für diese Art der Nutzung.
Beispiel:
InformationsquelleAutor der Antwort Philipp
Dies ist, wie Sie bereinigen kann für ein Dateisystem da fragte
Alles andere ist erlaubt in einem Dateisystem, also ist die Frage perfekt beantwortet...
... aber es könnte gefährlich sein, zu ermöglichen, zum Beispiel einfache Anführungszeichen
'
Sie einen Namen ein, wenn Sie diese für den späteren Gebrauch in eine unsichere HTML-Kontext, weil:wird ein XSS-Loch:
Grund, auf dem beliebten CMS-software WordPress entfernt, und Sie lernten Jahr von Jahr durch die harte Art und Weise (viele bug-reports), dass es sinnvoll ist, Sie mehr und mehr Zeichen:
Endlich Ihre Liste umfasst nun die meisten von den Zeichen, die Teil des URI rerserved-Zeichen und URL unsichere Zeichen Liste.
Natürlich können Sie einfach codieren Sie alle diese chars auf die HTML-Ausgabe, aber die meisten Entwickler und ich auch, befolgen Sie die idiom "Better safe than sorry" und löschen Sie Sie im Voraus.
Also abschließend würde ich empfehlen diese:
Alles andere, was nicht dazu führt Probleme mit der Datei system sollte Teil einer zusätzlichen Funktion:
Und an diesem Punkt müssen Sie, einen Dateinamen zu generieren, wenn das Ergebnis leer ist und Sie entscheiden, ob Sie wollen encode UTF-8-Zeichen. Aber man muss das nicht als UTF-8 erlaubt ist, in der alle file-Systeme, die im web-hosting zusammenhängen.
Das einzige, was Sie tun müssen, ist die Verwendung
urlencode()
(wie Sie es hoffentlich tun Sie es mit all Ihren URLs), so dass die mit dem Namenსაბეჭდი_მანქანა.jpg
wird diese URL als Ihre<img src>
oder<a href>
:http://www.maxrev.de/html/img/%E1%83%A1%E1%83%90%E1%83%91%E1%83%94%E1%83%AD%E1%83%93%E1%83%98_%E1%83%9B%E1%83%90%E1%83%9C%E1%83%A5%E1%83%90%E1%83%9C%E1%83%90.jpg
Stackoverflow macht das, so kann ich nach diesem link als Benutzer es tun würde:
http://www.maxrev.de/html/img/საბეჭდი_მანქანა.jpg
So ist dies eine vollständige, rechtlich mit dem Namen und kein problem als @SequenceDigitale.com erwähnt in seiner Antwort,.
InformationsquelleAutor der Antwort mgutt
Hinzufügen/entfernen mehrere mögliche Zeichen abhängig von dem, was erlaubt ist für Ihr system.
Alternativ können Sie versuchen, die Datei zu erzeugen und dann einen Fehler zurück, wenn es schlecht ist.
InformationsquelleAutor der Antwort Tor Valamo
Gut, tempnam() wird es für Sie tun.
http://us2.php.net/manual/en/function.tempnam.php
aber das schafft eine völlig neue Namen.
Zur Bereinigung von einem vorhandenen string nur beschränken, was die Nutzer eingeben können, und machen es Buchstaben, zahlen, Punkt, Bindestrich und Unterstrich dann desinfizieren mit einem einfachen regex. Überprüfen Sie, welche Zeichen müssen maskiert werden, oder Sie können falsch positive Ergebnisse.
InformationsquelleAutor der Antwort Mark Moline
Der folgende Ausdruck erzeugt ein schönes, sauberes und brauchbares string:
Drehen der heutigen Finanz: Fakturierung in heute-s-Finanz-Rechnungs -
InformationsquelleAutor der Antwort Sampson
Machen eine kleine Anpassung Sean Vieira die Lösung, dass einzelne Punkte, die man verwenden könnte:
InformationsquelleAutor der Antwort CarlJohnson
PHP bietet eine Funktion zum bereinigen, einen text in verschiedene format
filter.Filter.desinfizieren
Wie :
InformationsquelleAutor der Antwort 120DEV
Diese können sein ein bisschen schwer, aber Sie sind flexibel genug um das zu bereinigen, was auch immer-string in einen "sicheren"
en
Stil mit dem Namen des Ordners oder Teufel, auch geschrubbt Schnecken und Dinge, wenn Sie es zu biegen).1) Aufbau einer vollständigen Dateinamen (mit fallback auf name bei Eingang ist völlig abgeschnitten):
2) Oder nur mit den filter-util ohne den Aufbau einer vollständigen Dateinamen (strict-Modus
true
wird nicht zulassen, [] oder () im Dateinamen):3) Und hier sind die Funktionen:
Also sagen wir mal einigen user input:
.....<div></div><script></script>& Weiß Göbel 中文百强网File name %20 %20 %21 %2C Décor \/. /. . z \... y \...... x ./ “This name” is & 462^^ not = that grrrreat -][09]()1234747) საბეჭდი-და-ტიპოგრაფიული
Und wir wollen, konvertieren Sie es in etwas freundlicher zu machen tar.gz mit einer Dateinamenlänge 255 chars. Hier ist ein Beispiel verwenden. Hinweis: dieses Beispiel enthält eine fehlerhafte tar.gz Erweiterung als proof-of-concept, sollten Sie noch filtern, die extern nach der Zeichenfolge erstellt, die gegen Ihre whitelist(s).
Die Ausgabe wäre:
_wei_gbel_file_name_dcor_._._._z_._y_._x_._this_name_is_462_not_that_grrrreat_][09]()1234747)_.tar.gz
Können Sie spielen mit ihm hier: https://3v4l.org/iSgi8
Oder ein Gist: https://gist.github.com/dhaupin/b109d3a8464239b7754a
EDIT: aktualisierte Skript-filter für
statt Raum, aktualisiert 3v4l linkInformationsquelleAutor der Antwort dhaupin
Die besten, die ich heute wissen, ist die statische Methode Saiten::webalize von Nette framework.
BTW, diese übersetzt alle diakritischen Zeichen, um Ihre grundlegenden.. š=>s ü=>u, ß=>ss etc.
Für Dateinamen, die Sie Hinzugefügt haben, um die dot "." , zulässige Zeichen, parameter.
InformationsquelleAutor der Antwort DnD
Es scheint, dass diese alle Scharniere auf die Frage, ist es möglich, erstellen Sie einen Dateinamen, der verwendet werden kann, um das eindringen in einen server (oder einige-wie andere Beschädigung). Wenn nicht, dann scheint es die einfache Antwort ist, versuchen Sie, erstellen Sie die Datei, wo er will, letztlich verwendet werden (da wird das Betriebssystem der Wahl, kein Zweifel). Lassen Sie das Betriebssystem zu Sortieren Sie es aus. Wenn es meckert, der port, die Beschwerde zurück an den Benutzer als ein Fehler bei der Überprüfung.
Dies hat den Vorteil, dass Sie zuverlässig, portabel, da alle (ich bin mir ziemlich sicher) Betriebssysteme wird sich beschweren, wenn der Dateiname nicht richtig gebildet, die für dieses OS.
Wenn es ist möglich zu tun schändlichen Dinge, die mit einem Dateinamen, vielleicht gibt es Maßnahmen die angewendet werden können, vor der Prüfung der mit dem Namen der Bewohner Betriebssystem-Maßnahmen weniger kompliziert, als eine vollständige "Sanierung" der mit dem Namen.
InformationsquelleAutor der Antwort ReverseEMF
einen Weg
InformationsquelleAutor der Antwort ghostdog74
/
und..
in der Benutzer-Datei-Namen, die schädlich sein können. So sollten Sie loswerden diese durch etwas wie:InformationsquelleAutor der Antwort gameover
Da Benutzer möglicherweise verwenden Sie den Schrägstrich zum trennen von zwei Wörtern, es wäre besser zu ersetzen durch einen Bindestrich anstelle von NULL
InformationsquelleAutor der Antwort user2246924