यह है कि आप एक फ़ाइल सिस्टम के लिए कैसे पूछ सकते हैं
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;
}
एक फाइलसिस्टम में बाकी सभी चीजों की अनुमति है, इसलिए प्रश्न पूरी तरह से उत्तर दिया गया है ...
... लेकिन फ़ाइल नाम में एकल उद्धरण के लिए अनुमति देना खतरनाक हो सकता है '
यदि आप इसे बाद में असुरक्षित HTML संदर्भ में उपयोग करते हैं क्योंकि यह बिल्कुल कानूनी फ़ाइल नाम है:
' onerror= 'alert(document.cookie).jpg
एक XSS छेद बन जाता है :
<img src='<? echo $image ?>' />
// output:
<img src=' ' onerror= 'alert(document.cookie)' />
उसके कारण, लोकप्रिय सीएमएस सॉफ्टवेयर Wordpress उन्हें हटा देता है, लेकिन उन्होंने कुछ अपडेट के बाद ही सभी प्रासंगिक वर्णों को कवर किया :
$special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0));
// ... a few rows later are whitespaces removed as well ...
preg_replace( '/[\r\n\t -]+/', '-', $filename )
अंत में उनकी सूची में अब वे अधिकांश वर्ण शामिल हैं जो URI rerserved-characters और URL असुरक्षित वर्णों का हिस्सा हैं सूची का हिस्सा हैं।
बेशक आप बस HTML आउटपुट पर इन सभी वर्णों को एन्कोड कर सकते हैं, लेकिन अधिकांश डेवलपर्स और मुझे भी, मुहावरे का पालन करें "सॉरी से बेहतर" और उन्हें पहले से हटा दें।
तो अंत में मैं इसका उपयोग करने का सुझाव दूंगा:
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;
}
सब कुछ जो फ़ाइल सिस्टम के साथ समस्याएं पैदा नहीं करता है, एक अतिरिक्त फ़ंक्शन का हिस्सा होना चाहिए:
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;
}
और इस बिंदु पर आपको एक फ़ाइल नाम उत्पन्न करने की आवश्यकता है यदि परिणाम खाली है और आप यह तय कर सकते हैं कि क्या आप UTF-8 वर्णों को एनकोड करना चाहते हैं। लेकिन आपको इसकी आवश्यकता नहीं है कि वेब होस्टिंग संदर्भों में उपयोग किए जाने वाले सभी फ़ाइल सिस्टमों में UTF-8 की अनुमति है।
केवल एक चीज जो आपको करनी है, वह है urlencode()
(जैसा कि आप उम्मीद करते हैं कि यह आपके सभी URL के साथ है) इसलिए फ़ाइल नाम საბეჭდი_მანქანა.jpg
इस URL के रूप में आपके <img src>
या <a href>
:
http://www.maxrev.de/html/img/%E1%83% पर आता है ए 1% ई 1% 83% 90% ई 1% 83% 91% ई 1% 83% 94% ई 1% 83% ई% ई 1% 83% 93% ई 1% 83% 98_% ई 1% 83% 9B% ई 1% 83% 90% ई 1% 83% 9% ई 1% 83% A5% ई 1% 83% 90% ई 1% 83% 9% ई 1% 83% 90.jpg
Stackoverflow करता है, इसलिए मैं इस लिंक को पोस्ट कर सकता हूं क्योंकि एक उपयोगकर्ता यह करेगा:
http://www.maxrev.de/html/img/ im_მანქანა। Jpg
तो यह पूरी तरह से कानूनी फ़ाइल नाम और है नहीं एक समस्या के रूप में अपने जवाब में बताया गया @ SequenceDigitale.com ।