Auf diese Weise können Sie nach Bedarf ein Dateisystem bereinigen
function filter_filename($name) {
// remove illegal file system characters https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
$name = str_replace(array_merge(
array_map('chr', range(0, 31)),
array('<', '>', ':', '"', '/', '\\', '|', '?', '*')
), '', $name);
// maximise filename length to 255 bytes http://serverfault.com/a/9548/44086
$ext = pathinfo($name, PATHINFO_EXTENSION);
$name= mb_strcut(pathinfo($name, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($name)) . ($ext ? '.' . $ext : '');
return $name;
}
Alles andere ist in einem Dateisystem erlaubt, daher ist die Frage perfekt beantwortet ...
... aber es könnte gefährlich sein, beispielsweise einfache Anführungszeichen 'in einem Dateinamen zuzulassen, wenn Sie ihn später in einem unsicheren HTML-Kontext verwenden, da dieser absolut legale Dateiname:
' onerror= 'alert(document.cookie).jpg
wird ein XSS-Loch :
<img src='<? echo $image ?>' />
// output:
<img src=' ' onerror= 'alert(document.cookie)' />
Aus diesem Grund entfernt die beliebte CMS-Software Wordpress sie, deckte jedoch erst nach einigen Updates alle relevanten Zeichen ab :
$special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0));
// ... a few rows later are whitespaces removed as well ...
preg_replace( '/[\r\n\t -]+/', '-', $filename )
Schließlich enthält ihre Liste jetzt die meisten Zeichen, die Teil der Liste der URI-reservierten Zeichen und der URL-unsicheren Zeichen sind .
Natürlich können Sie all diese Zeichen einfach in der HTML-Ausgabe codieren, aber die meisten Entwickler und auch ich folgen der Redewendung "Besser sicher als leid" und löschen sie im Voraus.
Schließlich würde ich vorschlagen, dies zu verwenden:
function filter_filename($filename, $beautify=true) {
// sanitize filename
$filename = preg_replace(
'~
[<>:"/\\|?*]| # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
[\x00-\x1F]| # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx
[\x7F\xA0\xAD]| # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN
[#\[\]@!$&\'()+,;=]| # URI reserved https://tools.ietf.org/html/rfc3986#section-2.2
[{}^\~`] # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt
~x',
'-', $filename);
// avoids ".", ".." or ".hiddenFiles"
$filename = ltrim($filename, '.-');
// optional beautification
if ($beautify) $filename = beautify_filename($filename);
// maximize filename length to 255 bytes http://serverfault.com/a/9548/44086
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$filename = mb_strcut(pathinfo($filename, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($filename)) . ($ext ? '.' . $ext : '');
return $filename;
}
Alles andere, was keine Probleme mit dem Dateisystem verursacht, sollte Teil einer zusätzlichen Funktion sein:
function beautify_filename($filename) {
// reduce consecutive characters
$filename = preg_replace(array(
// "file name.zip" becomes "file-name.zip"
'/ +/',
// "file___name.zip" becomes "file-name.zip"
'/_+/',
// "file---name.zip" becomes "file-name.zip"
'/-+/'
), '-', $filename);
$filename = preg_replace(array(
// "file--.--.-.--name.zip" becomes "file.name.zip"
'/-*\.-*/',
// "file...name..zip" becomes "file.name.zip"
'/\.{2,}/'
), '.', $filename);
// lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625
$filename = mb_strtolower($filename, mb_detect_encoding($filename));
// ".file-name.-" becomes "file-name"
$filename = trim($filename, '.-');
return $filename;
}
Zu diesem Zeitpunkt müssen Sie einen Dateinamen generieren, wenn das Ergebnis leer ist, und Sie können entscheiden, ob Sie UTF-8-Zeichen codieren möchten. Dies ist jedoch nicht erforderlich, da UTF-8 in allen Dateisystemen zulässig ist, die in Webhosting-Kontexten verwendet werden.
Das einzige, was Sie tun müssen, ist zu verwenden urlencode()(wie Sie es hoffentlich mit all Ihren URLs tun), damit der Dateiname საბეჭდი_მანქანა.jpgzu Ihrer URL wird <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, also kann ich diesen Link so posten, wie es ein Benutzer tun würde:
http://www.maxrev.de/html/img/ საბეჭდი_მანქანა. Jpg
Dies ist also ein vollständiger legaler Dateiname und kein Problem, wie @ SequenceDigitale.com in seiner Antwort erwähnt .