Strings bereinigen, um sie URL und Dateinamen sicher zu machen?
Ich versuche zu kommen mit einer Funktion, die einen guten job zu bereinigen bestimmte Zeichenfolgen, so dass Sie sicher in der URL (wie ein post slug) und auch sicher zu verwenden, als Datei-Namen. Zum Beispiel, wenn jemand eine Datei hochlädt, die ich will, um sicherzustellen, dass ich entfernen Sie alle gefährlichen Zeichen aus dem Namen.
Bisher habe ich folgende Funktion, die ich hoffe, dass löst dieses problem und ermöglicht es ausländischen UTF-8-Daten auch.
/**
* Convert a string to the file/URL safe "slug" form
*
* @param string $string the string to clean
* @param bool $is_filename TRUE will allow additional filename characters
* @return string
*/
function sanitize($string = '', $is_filename = FALSE)
{
//Replace all weird characters with dashes
$string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string);
//Only allow one dash separator at a time (and make string lowercase)
return mb_strtolower(preg_replace('/--+/u', '-', $string), 'UTF-8');
}
Hat jemand eine knifflige sample-Daten die ich ausführen kann gegen diese - oder wissen Sie einen besseren Weg, um zu gewährleisten, unsere apps von schlechten Namen?
$ist-mit dem Namen können einige zusätzliche Zeichen wie temp-vim Dateien
update: entfernt die Sterne-Charakter, da konnte ich nicht daran denken, eine gültige verwenden
InformationsquelleAutor der Frage Xeoncross | 2010-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Beobachtungen über Ihre Lösung:
Erstellen der slug
Sollten Sie wahrscheinlich nicht gehören akzentuiert usw. Zeichen in deinem post slug da, technisch gesehen, sollten Sie Prozent-kodiert (URL-encoding-Regeln), so werden Sie hässlich aussehende URLs.
Also, wenn ich du wäre, nach der Kleinschreibung, ich würde wandeln Sie alle "besonderen" Zeichen, deren äquivalent (z.B. é -> e) und ersetzen nicht [a-z] Zeichen, die mit '-', die Begrenzung zu läuft einem einfachen '-' wie Sie getan haben. Es gibt eine Implementierung der Umwandlung von Sonderzeichen hier: https://web.archive.org/web/20130208144021/http://neo22s.com/slug
- Bereinigung im Allgemeinen
OWASP haben eine PHP-Umsetzung Ihrer Enterprise Security API, die unter anderem beinhaltet Methoden für die sichere Codierung und Decodierung der input-und output-in Ihrer Anwendung.
Den Encoder-interface bietet:
https://github.com/OWASP/PHP-ESAPI
https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
InformationsquelleAutor der Antwort Alan Donnelly
Fand ich diese größeren Funktion, in der Chyrp code:
und diese in der wordpress code
Update Sept 2012
Alix Axel getan hat einige unglaubliche Arbeit in diesem Bereich. Seine phunction framework enthält mehrere große text-Filter und Transformationen.
InformationsquelleAutor der Antwort Xeoncross
Diese sollten Ihre Dateinamen sicher...
und eine tiefere Lösung für dieses ist:
Dies setzt Voraus, dass Sie möchten, dass ein Punkt im Dateinamen.
wenn Sie möchten, übertragen Sie zu den Kleinbuchstaben zu wechseln, verwenden Sie einfach
für die Letzte Zeile.
InformationsquelleAutor der Antwort SoLoGHoST
Versuchen Sie dies:
Auf der Grundlage der ausgewählten Antwort in diesem thread: URL-Freundlich Username in PHP?
InformationsquelleAutor der Antwort John Conde
Das ist nicht gerade eine Antwort, wie es bietet keine Lösungen (noch!), aber es ist zu groß, um zu passen auf einen Kommentar...
Ich habe einige Tests (über Datei-Namen) auf Windows 7 und Ubuntu 12.04, und was ich herausfand, war, dass:
1. PHP Kann nicht mit nicht-ASCII-Dateinamen
Obwohl sowohl Windows als auch Ubuntu umgehen kann mit Unicode-Dateinamen (auch RTL, wie es scheint) PHP 5.3 erfordert hacks beschäftigen selbst mit dem plain old ISO-8859-1, so ist es besser, es zu halten ASCII-nur zur Sicherheit.
2. Die Länge der Dateinamen Fragen (Speziell unter Windows)
Auf Ubuntu, die maximale Länge eines Dateinamen haben kann (incluinding Erweiterung) 255 (ohne Pfad):
Jedoch auf Windows 7 (NTFS) die maximale Länge eines Dateinamen haben kann, hängt davon ab, es ist der absolute Pfad:
Wikipedia sagt, dass:
Nach meinem besten wissen (und testen), das ist falsch.
Insgesamt (zählen Schrägstriche) alle diese Beispiele haben 259 chars, wenn Sie Streifen der
C:\
gibt 256 Zeichen (und nicht 255?!). Die Verzeichnisse, in denen Sie über die Explorer und Sie werden feststellen, dass es hemmt sich aus mit allen zur Verfügung stehenden Platz für den Namen des Verzeichnisses. Der Grund dafür ist, ermöglicht die Erstellung von Dateien mit der 8.3-Benennungskonvention für Dateien. Das gleiche geschieht für die anderen Partitionen.Dateien nicht reservieren müssen der 8.3-Länge Anforderungen:
Können Sie nicht zum erstellen sub-Verzeichnisse, wenn Sie den absoluten Pfad des übergeordneten Verzeichnisses hat mehr als 242 Zeichen, weil
256 = 242 + 1 + \ + 8 + . + 3
. Verwenden Sie Windows Explorer, Sie können nicht erstellen Sie ein anderes Verzeichnis, wenn das übergeordnete Verzeichnis hat mehr als 233 Zeichen (abhängig von der system-locale), weil256 = 233 + 10 + \ + 8 + . + 3
; die10
hier ist die Länge der ZeichenfolgeNew folder
.Windows-Datei-system stellt ein fieses problem, wenn Sie möchten gewährleisten die Interoperabilität zwischen Datei-Systemen.
3. Hüten Sie sich vor der Reservierten Zeichen und Schlüsselwörter
Abgesehen von der Beseitigung von nicht-ASCII-Zeichen, nicht druckbare und steuerzeichenmüssen Sie auch wieder(setzen/verschieben):
Nur das entfernen dieser Zeichen möglicherweise nicht die beste Idee, weil der Dateiname kann, verliert es die Bedeutung. Ich denke, dass zumindest mehrere vorkommen dieser Zeichen soll ersetzt werden durch einen einzelnen Unterstrich (
_
), oder vielleicht etwas mehr Vertreters (dies ist nur eine Idee):"*?
->_
/\|
->-
:
->[ ]-[ ]
<
->(
>
->)
Gibt es auch spezielle Schlüsselwörter, die vermieden werden sollten (wie
NUL
), obwohl ich bin mir nicht sicher, wie Sie Sie zu überwinden. Vielleicht ist eine schwarze Liste mit zufälligen Namen fallback wäre ein guter Ansatz es zu lösen.4. Case Sensitiveness
Sollte dies gehen, ohne zu sagen, aber wenn Sie wollen, so sicherzustellen, dass die Datei Eindeutigkeit auf verschiedenen Betriebssystemen sollten Sie die transform-Datei-Namen zu einer normalisierten Fall, so
my_file.txt
undMy_File.txt
auf Linux nicht beide werden die gleichemy_file.txt
- Datei auf Windows.5. Stellen Sie Sicher, Es ist Einzigartig
Wenn der Dateiname bereits vorhanden, wird ein eindeutige id angehängt werden sollenum es auf die Basis-Dateiname.
Gemeinsamen eindeutigen Bezeichner enthalten die UNIX-Zeitstempel, ein digest der Datei, die Inhalte oder die zufällige Zeichenfolge.
6. Versteckte Dateien
Nur weil es benannt werden kann, bedeutet nicht, es sollte...
Punkte sind in der Regel in der weißen Liste aufgeführt sind in Dateinamen aber in Linux eine versteckte Datei ist vertreten durch einen führenden Punkt.
7. Andere Überlegungen
Wenn Sie Streifen einige chars den Namen der Datei, die Dateiendung ist in der Regel wichtiger, als die Basis Namen der Datei. Ermöglicht eine beachtliche maximale Anzahl von Zeichen für Datei-Erweiterung (8-16) sollte man isolieren Sie die Zeichen aus dem Basis-Namen. Es ist auch wichtig zu beachten, dass in dem unwahrscheinlichen Fall, dass mehr als eine lange-Erweiterung - wie
_.graphmlz.tag.gz
-_.graphmlz.tag
nur_
sollte als die file base name in diesem Fall.8. Ressourcen
Kaliber Griffe-Datei die name manglings ziemlich anständig:
Wikipedia-Seite über Datei-name mangling und verknüpft Kapitel aus der Verwendung von Samba.
Wenn Sie beispielsweise versuchen, eine Datei zu erstellen, die gegen die Regeln 1/2/3, erhalten Sie ein sehr nützliches Fehler:
InformationsquelleAutor der Antwort Alix Axel
Habe ich immer gedacht,Kohana hat einen ziemlich guten job gemacht.
Dem praktischen
UTF8::transliterate_to_ascii()
wird wiederum Sachen wie - => n.Natürlich könnte man ersetzen, das andere
UTF8::*
Zeug mit mb_* - Funktionen.InformationsquelleAutor der Antwort alex
Hinsichtlich der Datei-uploads, Sie wäre die sicherste um zu verhindern, dass der Benutzer die Kontrolle über den Namen der Datei. Wie bereits angedeutet wurde, speichern Sie die canonicalised Dateinamen in einer Datenbank zusammen mit einem zufällig gewählten eindeutigen Namen, die Sie verwenden werden, wie der tatsächliche Dateiname.
Mittels OWASP ESAPI, diese Namen könnten erzeugt werden deshalb:
Könnten Sie einen Zeitstempel Anhängen $safeFilename, um sicherzustellen, dass die zufällig generierten Dateinamen ist einzigartig, sogar ohne überprüfung auf eine vorhandene Datei.
In Bezug auf die Kodierung für URL, und wieder mit ESAPI:
Diese Methode führt canonicalisation vor der Codierung der Zeichenfolge und alle Zeichenkodierungen.
InformationsquelleAutor der Antwort jah
Habe ich angepasst aus einer anderen Quelle und fügte hinzu, ein paar mehr, vielleicht ein wenig übertrieben
InformationsquelleAutor der Antwort John Magnolia
- und dies ist Joomla 3.3.2 version von
JFile::makeSafe($Datei)
InformationsquelleAutor der Antwort cedric.walter
Ich glaube nicht, dass eine Liste von chars zu löschen, ist sicher. Ich würde eher die folgenden:
Für Dateinamen: Verwenden Sie eine interne ID oder ein hash-Wert der filecontent. Speichern Sie das Dokument Namen in einer Datenbank. Auf diese Weise halten Sie die original-Dateiname und finden der Datei.
Für url-Parameter: Verwenden Sie
urlencode()
zu Kodieren Sonderzeichen.InformationsquelleAutor der Antwort ZeissS
Je nachdem, wie Sie es verwenden, möchten Sie vielleicht eine maximale Länge, um einen Schutz gegen buffer overflows.
InformationsquelleAutor der Antwort Tgr
Hier ist CodeIgniter Umsetzung.
Und die
remove_invisible_characters
- dependency.InformationsquelleAutor der Antwort Kevin Mark
Empfehle ich* URLify für PHP (480+ stars auf Github) - "der PHP-port von URLify.js die Django-Projekt. Transkription von nicht-ascii-Zeichen für die Verwendung in URLs".
Grundlegende Verwendung:
Zu generieren Schnecken für URLs:
Zu generieren Schnecken für Dateinamen:
*Keiner der anderen Vorschläge abgestimmt meine Kriterien:
Als bonus, URLify entfernt auch bestimmte Wörter und Streifen entfernt alle Zeichen, die nicht transliteriert.
Hier ist ein test mit Tonnen von ausländischen Zeichen transliteriert richtig mit URLify: https://gist.github.com/motin/a65e6c1cc303e46900d10894bf2da87f
InformationsquelleAutor der Antwort Motin
Dies ist ein schöner Weg, um einen laden mit dem Namen:
InformationsquelleAutor der Antwort games
Gibt es bereits mehrere Lösungen für diese Frage aber ich habe gelesen und getestet, die meisten der code hier ein und ich landete mit dieser Lösung, die eine Mischung von dem, was ich hier gelernt:
Die Funktion
Die Funktion gebündelt ist hier in einer Symfony2 bundle-aber es kann extrahiert werden, um verwendet werden, wie plain PHPes hat nur eine Abhängigkeit mit der
iconv
- Funktion, die aktiviert werden müssen:Filesystem.php:
Die unit-tests
Interessant ist, dass ich erstellt habe, PHPUnit tests, zunächst zu testen, Grenzfälle und damit Sie überprüfen können, ob es Ihren Bedürfnissen passt:
(Wenn Sie einen Fehler finden, fühlen Sie sich frei, um einen test-Fall)
FilesystemTest.php:
Den Testergebnissen: (geprüft auf Ubuntu mit PHP 5.3.2 und MacOsX mit PHP 5.3.17:
InformationsquelleAutor der Antwort COil
Habe ich den Eintrag Titel mit allen Arten von seltsamen lateinischen Zeichen sowie einige HTML-tags, die ich brauchte, um zu übersetzen, in eine nützliche Bindestrich getrennte Dateinamen-format. Ich kombinierte @SoLoGHoST Antwort mit ein paar Elemente aus @Xeoncross Antwort und ein bisschen angepasst.
Musste ich manuell hinzufügen, die em-Bindestrich ( — ), um die übersetzungs-array. Es mag andere geben, aber so weit mein Dateinamen sieht gut aus.
Also:
Teil 1: Mein Vater ist "Žurburts"?—Sie sind (nicht) der beste!
wird:
Teil-1-mein-Papa-zurburts-sind-nicht-die-beste
Ich nur hinzufügen ".html", um die zurückgegebene Zeichenfolge.
InformationsquelleAutor der Antwort cbmtrx
warum nicht einfach unter Verwendung der php -
urlencode
? es ersetzt die "gefährlichen" Charaktere mit Ihren hex-Darstellung für urls (d.h.%20
für ein Leerzeichen)InformationsquelleAutor der Antwort knittl
Dieser Beitrag scheint die beste unter allen, dass ich gebunden. http://gsynuh.com/php-string-filename-url-safe/205
InformationsquelleAutor der Antwort ktamlyn
Dies ist eine gute Funktion:
InformationsquelleAutor der Antwort joan16v
Dies ist der code von Prestashop zu desinfizieren urls :
wird von
zum entfernen von diakritischen Zeichen
InformationsquelleAutor der Antwort Armel Larcier
Gibt es 2 gute Antworten auf slugfy Ihre Daten, verwenden Sie es https://stackoverflow.com/a/3987966/971619 oder es https://stackoverflow.com/a/7610586/971619
InformationsquelleAutor der Antwort newway
InformationsquelleAutor der Antwort Brant Messenger