ফাইলনামের জন্য স্ট্রিং স্যানিটাইজার


113

আমি এমন একটি পিএইচপি ফাংশন সন্ধান করছি যা একটি স্ট্রিং স্যানিটাইজ করবে এবং এটি কোনও ফাইলের নাম ব্যবহারের জন্য প্রস্তুত করবে। কেউ কি কোনও কাজের কথা জানেন?

(আমি একটি লিখতে পারি, তবে আমি চিন্তিত যে আমি একটি চরিত্রকে উপেক্ষা করব!)

সম্পাদনা করুন: উইন্ডোজ এনটিএফএস ফাইল সিস্টেমে ফাইল সংরক্ষণের জন্য।


1
আপনি কি আরও সুনির্দিষ্ট করে বলতে পারেন: উমলাউটগুলির সাথে কী ঘটবে (মুখ্য চরিত্রটিকে সরিয়ে ফেলুন বা রূপান্তর করতে হবে?) বিশেষ অক্ষরগুলির সাথে কী ঘটতে হবে?
পেক্কা

কোন ফাইল সিস্টেমের জন্য? তারা পৃথক। দেখুন en.wikipedia.org/wiki/...
গর্ডন

উইন্ডোজ :) 15 টি অক্ষর প্রয়োজন।
ব্যবহারকারী 151841

1
আমি উল্লেখ করতে চাই যে উত্তরগুলির কয়েকটিতে প্রস্তাবিত "ব্ল্যাকলিস্ট" সমাধানগুলি পর্যাপ্ত নয়, কারণ প্রতিটি সম্ভাব্য অবাঞ্ছিত চরিত্রের জন্য পরীক্ষা করা অনর্থক (বিশেষ অক্ষর ছাড়াও, অ্যাকসেন্ট এবং উমলুট সহ সমস্ত অক্ষর রয়েছে) অ-ইংরাজী / লাতিন বর্ণমালা, নিয়ন্ত্রণের অক্ষর ইত্যাদি deal সুতরাং আমি যুক্তি দিয়েছি যে একটি "শ্বেতলিস্ট" পদ্ধতি সর্বদা ভাল, এবং স্ট্রিংটিকে স্বাভাবিককরণ (ডোমিনিক রজারের উত্তর সম্পর্কে ব্লেয়ার ম্যাকমিলানের মন্তব্য অনুসারে) উচ্চারণ, উমলুট ইত্যাদির সাথে কোনও অক্ষরের প্রাকৃতিক পরিচালনা করার অনুমতি দেবে
শীন দ্য বিন

নিয়মিত এক্সপ্রেশন ব্যবহার করে একটি ভাল উপায়, আমি তৈরি এই অজগর স্ক্রিপ্টটি দেখুন: github.com/gsscoder/normalize-fn
gsscoder

উত্তর:


41

চরিত্রগুলি উপেক্ষা করার বিষয়ে চিন্তা করার পরিবর্তে - কীভাবে আপনি ব্যবহার করতে পেরে খুশি চরিত্রের শ্বেতলিস্ট ব্যবহার করবেন? উদাহরণস্বরূপ, যদি আপনি শুধু ভাল ওল অনুমতি দিতে পারে ' a-z, 0-9, _, এবং একটি নির্দিষ্ট সময়ের একটি একক উদাহরণস্বরূপ ( .)। এটি সম্ভবত বেশিরভাগ ফাইল সিস্টেমের চেয়ে সীমাবদ্ধ, তবে আপনাকে নিরাপদ রাখা উচিত।


40
উমালাতদের সাথে ভাষার জন্য ভাল নয়। এর ফলে কুইবেকের জন্য কিউবেক, ড্যাসেল্ডারফের জন্য ডেসেল্ডারফ এবং আরও কিছু হবে।
পেক্কা

15
সত্য - তবে যেমনটি আমি বলেছিলাম: "উদাহরণস্বরূপ"।
ডমিনিক রজার 17 ই

5
যা ওপিতে পুরোপুরি গ্রহণযোগ্য হতে পারে। অন্যথায়, php.net/manual/en/class.normalizer.php এর
ব্লেয়ার ম্যাকমিলান

3
এটি আসলে যা বলা হয়েছিল তা নয়। বিকল্পটি নয়, স্ট্রিংকে স্যানিটাইজ করার জন্য কোনও অপশনটি জিজ্ঞাসা করে।
i.am.michiel

3
@ আই.এম.মিচিয়েল, সম্ভবত, তবে ওপি এটি গ্রহণ করেছে, আমি ধরে নেব তারা এটি সহায়ক বলে মনে করেছে।
ডোমিনিক রজার

157

ডোমিনিক রজারের দ্বারা লক্ষ্য করা সমস্যার সমাধানের জন্য টোর ভ্যালামোর সমাধানে একটি সামান্য সামঞ্জস্য করা, আপনি এটি ব্যবহার করতে পারেন:

// Remove anything which isn't a word, whitespace, number
// or any of the following caracters -_~,;[]().
// If you don't need to handle multi-byte characters
// you can use preg_replace rather than mb_ereg_replace
// Thanks @Łukasz Rysiak!
$file = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $file);
// Remove any runs of periods (thanks falstro!)
$file = mb_ereg_replace("([\.]{2,})", '', $file);

43
আমি রেগেক্স জাঙ্কিজ পছন্দ!
-_

2
@ iim.hlk - হ্যাঁ, এটি মোড়ানোর প্রথম বন্ধনী অনুপস্থিত। আমি এখন এগুলি যোগ করেছি। ধন্যবাদ!
শন ভিয়েরা

2
সেখানে একটি ত্রুটি আছে, আপনার এটি দুটি ভাগে ভাগ করা উচিত এবং ..পরে চেক চালানো উচিত । উদাহরণস্বরূপ .?.সত্তা শেষ হবে ..। যদিও আপনি ফিল্টার করেছেন /আমি এখনই দেখতে পাচ্ছি না আপনি কীভাবে এই মুহূর্তে আরও শোষণ করবেন, তবে এটি চেক কেন ..এখানে অকার্যকর তা দেখায় । আরও ভাল সম্ভবত, প্রতিস্থাপন করবেন না, এটি যোগ্যতা না থাকলে কেবল প্রত্যাখ্যান করুন।
ফালস্ট্রো

2
কারণ এই মানগুলির কোনওটিই উইন্ডোজ ফাইল সিস্টেমে অবৈধ নয় এবং কেন আপনার নিজের থেকে আরও তথ্য আলগা করুন? আপনি [^a-z0-9_-]যদি সত্যিই সীমাবদ্ধ থাকতে চান - বা কেবল উত্পন্ন নাম ব্যবহার করুন এবং প্রদত্ত নামটি ফেলে দিতে পারেন এবং এই সমস্ত সমস্যা এড়াতে আপনি কেবল নিয়মিত ভাবটি পরিবর্তন করতে পারেন । :-)
শান ভিয়েরা

3
দ্রষ্টব্য: অবৈধ।
জেসনএক্সএ

49

আপনি যেমন অনুরোধ করেছিলেন তেমন কোনও ফাইল সিস্টেমের জন্য স্যানিটাইজ করতে পারেন

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;
}

ফাইল সিস্টেমে অন্য সমস্ত কিছুর অনুমতি রয়েছে, সুতরাং প্রশ্নের সঠিক উত্তর দেওয়া হয়েছে ...

... তবে আপনি যদি কোনও অনিরাপদ এইচটিএমএল প্রসঙ্গে এটি পরে ব্যবহার করেন তবে কোনও ফাইলনেমে উদাহরণস্বরূপ একক উক্তিগুলির জন্য অনুমতি দেওয়া বিপজ্জনক হতে পারে 'কারণ এটি একেবারে আইনী ফাইলনাম:

 ' onerror= 'alert(document.cookie).jpg

একটি এক্সএসএস হোল হয়ে যায় :

<img src='<? echo $image ?>' />
// output:
<img src=' ' onerror= 'alert(document.cookie)' />

সে কারণে, জনপ্রিয় সিএমএস সফ্টওয়্যার ওয়ার্ডপ্রেস এগুলি সরিয়ে দেয় তবে তারা কিছু আপডেটের পরে সমস্ত প্রাসঙ্গিক অক্ষর আবৃত করে :

$special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0));
// ... a few rows later are whitespaces removed as well ...
preg_replace( '/[\r\n\t -]+/', '-', $filename )

অবশেষে তাদের তালিকায় এখন বেশিরভাগ অক্ষর অন্তর্ভুক্ত রয়েছে যা ইউআরআই রিসার্ভেড-অক্ষর এবং ইউআরএল অনিরাপদ অক্ষর তালিকার অংশ।

অবশ্যই আপনি এইচটিএমএল আউটপুটে এই চারটি অক্ষরটি সহজেই এনকোড করতে পারেন তবে বেশিরভাগ বিকাশকারী এবং আমিও "আফসোসের চেয়ে ভাল নিরাপদ" প্রতিচ্ছবিটি অনুসরণ করুন এবং সেগুলি আগেই মুছুন।

সুতরাং অবশেষে আমি এটি ব্যবহার করার পরামর্শ দেব:

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;
}

এবং ফলাফলটি খালি থাকলে এই মুহুর্তে আপনাকে একটি ফাইলের নাম তৈরি করতে হবে এবং আপনি ইউটিএফ -8 টি অক্ষর এনকোড করতে চান কিনা তা সিদ্ধান্ত নিতে পারেন। তবে আপনার প্রয়োজন নেই যে ইউটিএফ -8 হিসাবে ওয়েব হোস্টিং প্রসঙ্গে ব্যবহৃত সমস্ত ফাইল সিস্টেমে অনুমোদিত।

আপনাকে কেবলমাত্র ব্যবহার করতে হবে urlencode()(যেমনটি আপনি আপনার সমস্ত ইউআরএল দিয়ে আশা করছেন) তাই ফাইলের საბეჭდი_მანქანა.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% 9c% ই 1% 83% A5% ই 1% 83% 90% ই 1% 83% 9c% ই 1% 83% 90.jpg

স্ট্যাকওভারফ্লো এটি করে, তাই ব্যবহারকারীরা যেমনটি করতে পারে তেমন আমি এই লিঙ্কটি পোস্ট করতে পারি:
http://www.maxrev.de/html/img/ საბეჭდი_მანქანა। Jpg

সুতরাং এটি একটি সম্পূর্ণ আইনী ফাইল নাম এবং @ সিকোয়েন্সডিজিটাল ডট কম হিসাবে তার উত্তরে উল্লিখিত কোনও সমস্যা নয়


3
ভাল করেছ. আমার জন্য সবচেয়ে সহায়ক উত্তর। +1

ওহ ... ফাংশনটি ভালভাবে কাজ করে, তবে কিছু সময় থেকে এটি প্রতিটি চরিত্রের মধ্যে - পছন্দ করা শুরু করে r-u-l-e-sএবং এটি কেন ঘটে তা আমার কোনও ধারণা নেই। নিশ্চিত যে এটি ফাংশনের দোষ নয়, তবে কেবল জিজ্ঞাসা করছে - এই জাতীয় আচরণের কারণ কী হতে পারে? ভুল এনকোডিং?

1
ওহ ভাল ... শুধু একটি ডিবাগ তৈরি এবং এটি শুধু পরে কি preg_replaceমধ্যে filter_filename()

এই মন্তব্যগুলি সরানোর পরে, এটি আবার কাজ শুরু করে started

আপনি কোন মন্তব্যগুলি সরিয়েছেন? এটি সহজ হলে আমাকে একটি ইমেল প্রেরণ করুন: gutt.it/contact.htm
মিলাগুট

43

Rawurlencode () ব্যবহার সম্পর্কে কী? http://www.php.net/manual/en/function.rawurlencode.php

এখানে এমন একটি ফাংশন রয়েছে যা এমনকি চীনা চরগুলি স্যানিটাইজ করে:

public static function normalizeString ($str = '')
{
    $str = strip_tags($str); 
    $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
    $str = preg_replace('/[\"\*\/\:\<\>\?\'\|]+/', ' ', $str);
    $str = strtolower($str);
    $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
    $str = htmlentities($str, ENT_QUOTES, "utf-8");
    $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
    $str = str_replace(' ', '-', $str);
    $str = rawurlencode($str);
    $str = str_replace('%', '-', $str);
    return $str;
}

এখানে ব্যাখ্যা

  1. স্ট্রিপ এইচটিএমএল ট্যাগস
  2. ব্রেক / ট্যাবগুলি / রিটার্ন ক্যারেজ সরান
  3. ফোল্ডার এবং ফাইলের নামের জন্য অবৈধ অক্ষর সরান
  4. ছোট ক্ষেত্রে স্ট্রিং রাখুন
  5. বিদেশী উচ্চারণ যেমন Éàû এটিকে এইচটিএমএল সত্তায় রূপান্তরিত করে মুছে ফেলুন এবং তারপরে কোডটি সরিয়ে পত্রটি রেখে দিন।
  6. স্থানগুলি ড্যাশ দিয়ে প্রতিস্থাপন করুন
  7. পূর্ববর্তী পদক্ষেপগুলি অতিক্রম করতে এবং সার্ভারে বিরোধী ফাইল নাম প্রবেশ করতে পারে এমন বিশেষ অক্ষরগুলি এনকোড করুন। প্রাক্তন। "中文 百强 网"
  8. "%" ড্যাশগুলির সাথে প্রতিস্থাপন করুন তা নিশ্চিত করার জন্য যে ফাইলটির লিঙ্কটি ব্রাউজার দ্বারা পুনরায় লেখা হবে না তম ফাইল সন্ধানের সময়।

ঠিক আছে, কিছু ফাইলের নাম রিলেভেন্ট হবে না তবে বেশিরভাগ ক্ষেত্রে এটি কাজ করবে।

প্রাক্তন। আসল নাম: "საბეჭდი-და-ტიპოგრაფიული। জেপিজি"

আউটপুট নাম: "-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 "

এটি 404 ত্রুটির চেয়ে ভাল।

আশা করি যে সহায়ক ছিল।

কার্ল।


1
আপনি নুল এবং নিয়ন্ত্রণের অক্ষর মুছে ফেলছেন না। 0 থেকে 32 এর ASCII সমস্ত স্ট্রিং থেকে অপসারণ করা উচিত।
তুলসী মুসা

ইউটিএফ -8 ফাইল সিস্টেমে অনুমোদিত এবং এটি ইউআরএলগুলিতে অনুমোদিত, সুতরাং কেন এটি 404 ত্রুটি তৈরি করা উচিত? শুধু আপনাকে যা করতে হবে URL টি এনকোড হয় http://www.maxrev.de/html/img/საბეჭდი_მანქანა.jpgথেকে 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এইচটিএমএল সোর্স কোডে হিসাবে আপনি আশা আপনার সব URL গুলি না।
মিগ্লুট

1
কিছু অন্যান্য বিষয়: আপনি এইচটিএমএল ট্যাগগুলি সরিয়ে ফেলেন strip_tags()এবং তারপরে আপনি মুছে ফেলেন [<>]। এর দ্বারা strip_tags()আসলেই মোটেই প্রয়োজন হয় না। একই পয়েন্টটি হল উদ্ধৃতিগুলি। আপনি যখন ডিকোড করবেন তখন কোনও উদ্ধৃতি বাকী নেই ENT_QUOTES। এবং এটি str_replace()পরপর সাদা স্থানগুলি সরিয়ে দেয় না এবং তারপরে আপনি strtolower()বহু-বাইট স্ট্রিংয়ের জন্য ব্যবহার করেন use এবং কেন আপনি মোটেও ছোট হাতের কাছে রূপান্তর করেন? এবং অবশেষে @ বাসিলমুসার উল্লিখিত হিসাবে আপনি কোনও সংরক্ষিত চরিত্রটি ধরেন নি। আমার উত্তরে আরো বিস্তারিত stackoverflow.com/a/42058764/318765
mgutt

প্রেমে পড়ে গেলাম!
যশ কুমার ভার্মা

39

সমাধান 1 - সহজ এবং কার্যকর

$file_name = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $url ) );

  • স্ট্র্টলওয়ার () ফাইলের নাম ছোট হাতের গ্যারান্টি দেয় (যেহেতু ইউআরএল-এর মধ্যে কেসটি বিবেচনা করে না, তবে এনটিএফএস ফাইলের ক্ষেত্রে)
  • [^a-z0-9]+ নিশ্চিত করবে, ফাইলের নামটি কেবল অক্ষর এবং সংখ্যা রাখে
  • অবৈধ অক্ষর সাবস্টিটিউট সঙ্গে '-'ফাইলের নাম পাঠযোগ্য রাখে

উদাহরণ:

URL:  http://stackoverflow.com/questions/2021624/string-sanitizer-for-filename
File: http-stackoverflow-com-questions-2021624-string-sanitizer-for-filename

সমাধান 2 - খুব দীর্ঘ URL গুলির জন্য

আপনি ইউআরএল বিষয়বস্তু ক্যাশে করতে চান এবং অনন্য ফাইল নাম থাকা প্রয়োজন। আমি এই ফাংশনটি ব্যবহার করব:

$file_name = md5( strtolower( $url ) )

এটি নির্দিষ্ট দৈর্ঘ্য সহ একটি ফাইল নাম তৈরি করবে। এমডি 5 হ্যাশ বেশিরভাগ ক্ষেত্রে এই ধরণের ব্যবহারের জন্য যথেষ্ট অনন্য।

উদাহরণ:

URL:  https://www.amazon.com/Interstellar-Matthew-McConaughey/dp/B00TU9UFTS/ref=s9_nwrsa_gw_g318_i10_r?_encoding=UTF8&fpl=fresh&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=desktop-1&pf_rd_r=BS5M1H560SMAR2JDKYX3&pf_rd_r=BS5M1H560SMAR2JDKYX3&pf_rd_t=36701&pf_rd_p=6822bacc-d4f0-466d-83a8-2c5e1d703f8e&pf_rd_p=6822bacc-d4f0-466d-83a8-2c5e1d703f8e&pf_rd_i=desktop
File: 51301f3edb513f6543779c3a5433b01c

4
হয়তো MD5 সমস্যা দ্বারা পারে: ইউআরএল এর সাথে হ্যাশ ব্যবহার করার সময় সতর্কতা অবলম্বন করুন। স্ক্রেনটা . com / 2007 / 08 / md5_tutorial.html ইউআরএল এর সংখ্যাটির বর্গমূল এখনও অনেক বড় তবে বর্তমান ওয়েব সাইজ যদি আপনি একটি সংঘর্ষ পান তবে আপনি যখন পৃষ্ঠাগুলি প্রত্যাশা করছিলেন তখন ব্রিটনি স্পিয়ার্স সম্পর্কে পৃষ্ঠা পেতে যাচ্ছিলেন বাগজিলা সম্পর্কে এটি সম্ভবত আমাদের ক্ষেত্রে একটি অ ইস্যু, তবে বিলিয়ন পৃষ্ঠাগুলির জন্য আমি SHA 256 এর মতো অনেক বড় হ্যাশিং অ্যালগরিদম বেছে নিতে বা এটি সম্পূর্ণভাবে এড়িয়ে যাব। সূত্র: boyter.org/2013/01/code-for-a-search-engine-in-php-part-1
adilbo

15

ভাল, টেম্পনাম () এটি আপনার জন্য করবে।

http://us2.php.net/manual/en/function.tempnam.php

তবে এটি সম্পূর্ণ নতুন নাম তৈরি করে।

একটি বিদ্যমান স্ট্রিং স্যানিটাইজ করতে কেবল আপনার ব্যবহারকারীরা কী লিখতে পারে এবং এটি অক্ষর, সংখ্যা, সময়কাল, হাইফেন এবং আন্ডারস্কোর তৈরি করতে পারে তারপরে একটি সীমাবদ্ধ করুন একটি সাধারণ রেজেক্স দিয়ে it কোন অক্ষরগুলি থেকে বাঁচতে হবে তা পরীক্ষা করুন বা আপনি মিথ্যা ধনাত্মকতা পেতে পারেন।

$sanitized = preg_replace('/[^a-zA-Z0-9\-\._]/','', $filename);

13
preg_replace("[^\w\s\d\.\-_~,;:\[\]\(\]]", '', $file)

আপনার সিস্টেমে কী অনুমোদিত তা নির্ভর করে আরও বৈধ অক্ষর যুক্ত করুন / সরান।

বিকল্পভাবে আপনি ফাইলটি তৈরি করার চেষ্টা করতে পারেন এবং তারপরে এটি খারাপ হলে একটি ত্রুটি ফিরিয়ে আনতে পারেন।


5
এটি ফাইল নাম যেমন যেমন ..কোনও সমস্যা হতে পারে বা নাও পারে তার মাধ্যমে অনুমতি দেয় ।
ডমিনিক রজার 16

@ ডোম - এটির জন্য একটি নির্দিষ্ট মান হিসাবে কেবল আলাদাভাবে এটি পরীক্ষা করুন।
টোর ভালামো

10

পিএইচপি একটি পাঠ্যকে বিভিন্ন ফর্ম্যাটে স্যানিটাইজ করার জন্য একটি ফাংশন সরবরাহ করে

filter.filters.sanitize

কিভাবে :

echo filter_var(
   "Lorem Ipsum has been the industry's",FILTER_SANITIZE_URL
); 

ব্লককোট LoremIpsumhasbeentheindustry's


1
ভাল, তবে এটি স্ল্যাশগুলি সরিয়ে ফেলবে না, যা কোনও সমস্যা হতে পারে: ডিরেক্টরি ট্র্যাভার্সিং।
func0der

6

নিম্নলিখিত প্রকাশটি একটি সুন্দর, পরিষ্কার এবং ব্যবহারযোগ্য স্ট্রিং তৈরি করে:

/[^a-z0-9\._-]+/gi

বাঁক আজকের আর্থিক: বিলিং মধ্যে আজ-এর-আর্থিক-বিলিং


সুতরাং একটি ফাইলনামের একটি পিরিয়ড বা আন্ডারস্কোর, বা এর মতো কিছু থাকতে পারে না?
টোর ভালামো

2
@ জোনাথন - ইটালিকসের কী আছে?
ডমিনিক রজার 16

@ টোর, হ্যাঁ, দুঃখিত। আপডেট করা হয়েছে। @ ডমিনিক, কেবল পাঠ্যের উপর জোর দেওয়া।
সাম্পসন

গিজম কী? আমি "সতর্কতা: প্রিগ_রেপ্লেস () [ফাংশন.প্রেগ-রিপ্লেসমেন্ট]: অজানা সংশোধক 'জি'"
ব্যবহারকারীর 151841

1
@ user151841 এর জন্য preg_replaceবিশ্বব্যাপী পতাকা অন্তর্ভুক্ত। সুতরাং প্রি_রিপ্লেস ব্যবহার করা হচ্ছে তবে জি-র দরকার নেই। আমরা যখন প্রতিস্থাপনের সংখ্যাটি নিয়ন্ত্রণ করতে চাই তখন তার জন্য একটি limitপরামিতি রয়েছে পূর্ববর্তী স্থানের । আরও জন্য পূর্ববর্তী স্থান ডকুমেন্টেশন পড়ুন।
রিনিজ

6

একক বিন্দুর জন্য অনুমতি দেওয়ার জন্য শিন ভিয়েরার সমাধানটিতে একটি ছোট সামঞ্জস্য করা, আপনি এটি ব্যবহার করতে পারেন:

preg_replace("([^\w\s\d\.\-_~,;:\[\]\(\)]|[\.]{2,})", '', $file)

6

নিরাপদ: "a-zA-Z0-9_-" এর প্রতিটি ক্রমটি ড্যাশ-এ প্রতিস্থাপন করুন; নিজেই একটি এক্সটেনশন যুক্ত করুন।

$name = preg_replace('/[^a-zA-Z0-9_-]+/', '-', strtolower($name)).'.'.$extension;

1
আপনাকে একটি "।": $ নাম = প্রেগ_রেপ্লেস ('/ [$ a-zA-Z0-9 _-] + /', '-', স্ট্র্টলওয়ার ($ নাম)) দ্বারা আলাদা করে ফাইল এক্সটেনশন যুক্ত করতে হবে '' । $ বর্ধিতাংশ;
স্মিথ

2

এগুলি কিছুটা ভারী হতে পারে তবে এগুলি "নিরাপদ" enশৈলীর ফাইলনাম বা ফোল্ডারের নাম (বা হ্যাক এমনকি স্ক্র্যাবড স্লাগস এবং আপনি যদি বাঁকিয়ে দেন তবে) যে কোনও স্ট্রিং স্যানিটাইজ করতে যথেষ্ট নমনীয় ।

1) একটি সম্পূর্ণ ফাইলের নাম তৈরি করা (ইনপুট সম্পূর্ণরূপে কেটে গেলে ফ্যালব্যাক নাম সহ):

str_file($raw_string, $word_separator, $file_extension, $fallback_name, $length);

2) অথবা একটি পূর্ণ ফাইল নাম (কড়া মোড) তৈরি না করে কেবল ফিল্টার ব্যবহার করুন true তৈরি না [] বা () ফাইল নামটিতে অনুমতি দেবে না):

str_file_filter($string, $separator, $strict, $length);

3) এবং এই ফাংশনগুলি এখানে:

// Returns filesystem-safe string after cleaning, filtering, and trimming input
function str_file_filter(
    $str,
    $sep = '_',
    $strict = false,
    $trim = 248) {

    $str = strip_tags(htmlspecialchars_decode(strtolower($str))); // lowercase -> decode -> strip tags
    $str = str_replace("%20", ' ', $str); // convert rogue %20s into spaces
    $str = preg_replace("/%[a-z0-9]{1,2}/i", '', $str); // remove hexy things
    $str = str_replace("&nbsp;", ' ', $str); // convert all nbsp into space
    $str = preg_replace("/&#?[a-z0-9]{2,8};/i", '', $str); // remove the other non-tag things
    $str = preg_replace("/\s+/", $sep, $str); // filter multiple spaces
    $str = preg_replace("/\.+/", '.', $str); // filter multiple periods
    $str = preg_replace("/^\.+/", '', $str); // trim leading period

    if ($strict) {
        $str = preg_replace("/([^\w\d\\" . $sep . ".])/", '', $str); // only allow words and digits
    } else {
        $str = preg_replace("/([^\w\d\\" . $sep . "\[\]\(\).])/", '', $str); // allow words, digits, [], and ()
    }

    $str = preg_replace("/\\" . $sep . "+/", $sep, $str); // filter multiple separators
    $str = substr($str, 0, $trim); // trim filename to desired length, note 255 char limit on windows

    return $str;
}


// Returns full file name including fallback and extension
function str_file(
    $str,
    $sep = '_',
    $ext = '',
    $default = '',
    $trim = 248) {

    // Run $str and/or $ext through filters to clean up strings
    $str = str_file_filter($str, $sep);
    $ext = '.' . str_file_filter($ext, '', true);

    // Default file name in case all chars are trimmed from $str, then ensure there is an id at tail
    if (empty($str) && empty($default)) {
        $str = 'no_name__' . date('Y-m-d_H-m_A') . '__' . uniqid();
    } elseif (empty($str)) {
        $str = $default;
    }

    // Return completed string
    if (!empty($ext)) {
        return $str . $ext;
    } else {
        return $str;
    }
}

সুতরাং এর কিছু ব্যবহারকারী ইনপুট হয় বলা যাক: .....&lt;div&gt;&lt;/div&gt;<script></script>&amp; Weiß Göbel 中文百强网File name %20 %20 %21 %2C Décor \/. /. . z \... y \...... x ./ “This name” is & 462^^ not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = that grrrreat -][09]()1234747) საბეჭდი-და-ტიპოგრაფიული

এবং আমরা এটি 255 অক্ষরের ফাইলের দৈর্ঘ্যের সাথে একটি tar.gz বানাতে আরও বন্ধুত্বপূর্ণ কিছুতে রূপান্তর করতে চাই। এখানে একটি উদাহরণ ব্যবহার। দ্রষ্টব্য: ধারণার প্রমাণ হিসাবে এই উদাহরণটিতে একটি ত্রুটিযুক্ত টর.gz এক্সটেনশন অন্তর্ভুক্ত রয়েছে, আপনার হোয়াইটলিস্ট (গুলি) এর বিপরীতে স্ট্রিং তৈরি হওয়ার পরে আপনার এখনও এক্সট ফিল্টার করা উচিত।

$raw_str = '.....&lt;div&gt;&lt;/div&gt;<script></script>&amp; Weiß Göbel 中文百强网File name  %20   %20 %21 %2C Décor  \/.  /. .  z \... y \...... x ./  “This name” is & 462^^ not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = that grrrreat -][09]()1234747) საბეჭდი-და-ტიპოგრაფიული';
$fallback_str = 'generated_' . date('Y-m-d_H-m_A');
$bad_extension = '....t&+++a()r.gz[]';

echo str_file($raw_str, '_', $bad_extension, $fallback_str);

আউটপুটটি হবে: _wei_gbel_file_name_dcor_._._._z_._y_._x_._this_name_is_462_not_that_grrrreat_][09]()1234747)_.tar.gz

আপনি এটি এখানে খেলতে পারেন: https://3v4l.org/iSgi8

বা একটি বক্তব্য: https://gist.github.com/dhaupin/b109d3a8464239b7754a

সম্পাদনা:&nbsp; স্থান পরিবর্তে স্ক্রিপ্ট আপডেট হয়েছে 3v4l লিঙ্ক আপডেট


1

আমি আজ সবচেয়ে ভাল জানি স্ট্যাটিক পদ্ধতি স্ট্রিংস :: নেট ফ্রেমওয়ার্ক থেকে ওয়েবলাইজ করা।

বিটিডাব্লু, এটি সমস্ত ডায়াক্রিটিক লক্ষণগুলিকে তাদের বেসিক .. š => এস ü => ইউ ß => এসএস ইত্যাদিতে অনুবাদ করে

ফাইলের নামের জন্য আপনাকে বিন্দু যুক্ত করতে হবে ""। অনুমোদিত অক্ষরের পরামিতি।

/**
 * Converts to ASCII.
 * @param  string  UTF-8 encoding
 * @return string  ASCII
 */
public static function toAscii($s)
{
    static $transliterator = NULL;
    if ($transliterator === NULL && class_exists('Transliterator', FALSE)) {
        $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII');
    }

    $s = preg_replace('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{2FF}\x{370}-\x{10FFFF}]#u', '', $s);
    $s = strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06");
    $s = str_replace(
        array("\xE2\x80\x9E", "\xE2\x80\x9C", "\xE2\x80\x9D", "\xE2\x80\x9A", "\xE2\x80\x98", "\xE2\x80\x99", "\xC2\xB0"),
        array("\x03", "\x03", "\x03", "\x02", "\x02", "\x02", "\x04"), $s
    );
    if ($transliterator !== NULL) {
        $s = $transliterator->transliterate($s);
    }
    if (ICONV_IMPL === 'glibc') {
        $s = str_replace(
            array("\xC2\xBB", "\xC2\xAB", "\xE2\x80\xA6", "\xE2\x84\xA2", "\xC2\xA9", "\xC2\xAE"),
            array('>>', '<<', '...', 'TM', '(c)', '(R)'), $s
        );
        $s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s); // intentionally @
        $s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e"
            . "\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3"
            . "\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
            . "\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
            . "\x96\xa0\x8b\x97\x9b\xa6\xad\xb7",
            'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.');
        $s = preg_replace('#[^\x00-\x7F]++#', '', $s);
    } else {
        $s = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); // intentionally @
    }
    $s = str_replace(array('`', "'", '"', '^', '~', '?'), '', $s);
    return strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?');
}


/**
 * Converts to web safe characters [a-z0-9-] text.
 * @param  string  UTF-8 encoding
 * @param  string  allowed characters
 * @param  bool
 * @return string
 */
public static function webalize($s, $charlist = NULL, $lower = TRUE)
{
    $s = self::toAscii($s);
    if ($lower) {
        $s = strtolower($s);
    }
    $s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
    $s = trim($s, '-');
    return $s;
}

আপনি ডায়াক্রিটিক্স প্রতিস্থাপন করতে চান কেন? urlencode()আপনি ফাইল নামটি একটি srcবা হিসাবে ব্যবহার করার আগে কেবল ব্যবহার করুন href। শুধুমাত্র বর্তমানে ব্যবহৃত ফাইল সিস্টেম যে হল UTF-8 সঙ্গে সমস্যা রয়েছে FATx (এক্সবক্স দ্বারা ব্যবহৃত) হল: en.wikipedia.org/wiki/Comparison_of_file_systems#Limits এবং আমি এই মনে করি না ওয়েব সার্ভার দ্বারা ব্যবহৃত হয়
mgutt

1

মনে হচ্ছে এই সমস্ত প্রশ্নের উপর নির্ভর করে, কোনও ফাইল নাম তৈরি করা সম্ভব যা কোনও সার্ভারে হ্যাক করতে ব্যবহার করা যেতে পারে (বা এরকম কিছু অন্যান্য ক্ষতি করতে পারে)। যদি তা না হয়, তবে এটির সহজ উত্তরটি ফাইলটি তৈরি করার চেষ্টা করা যেখানেই হবে, শেষ পর্যন্ত ব্যবহৃত হবে (যেহেতু এটি পছন্দ অপারেটিং সিস্টেম হবে, সন্দেহ নেই)। অপারেটিং সিস্টেমটি এটি বাছাই করুন। যদি এটি অভিযোগ করে তবে সেই অভিযোগটি ব্যবহারকারীকে বৈধকরণের ত্রুটি হিসাবে ফিরিয়ে দিন।

এটি নির্ভরযোগ্যভাবে পোর্টেবল হওয়ার অতিরিক্ত সুবিধা রয়েছে, যেহেতু সমস্ত নাম (আমি বেশ নিশ্চিত) অপারেটিং সিস্টেমগুলি অভিযোগ করবে যদি ফাইলের নামটি ওএসের জন্য সঠিকভাবে গঠিত না হয়।

যদি ফাইলনামের সাথে নিরীহ কাজগুলি করা সম্ভব হয় তবে সম্ভবত আবাসিক অপারেটিং সিস্টেমে ফাইলের নাম পরীক্ষা করার আগে এমন কিছু ব্যবস্থা নেওয়া যেতে পারে - ফাইলনামের সম্পূর্ণ "স্যানিটেশন" এর চেয়ে কম জটিল পদক্ষেপগুলি।


0

একমুখী

$bad='/[\/:*?"<>|]/';
$string = 'fi?le*';

function sanitize($str,$pat)
{
    return preg_replace($pat,"",$str);

}
echo sanitize($string,$bad);

প্রিন্টযোগ্য অক্ষরগুলি সম্পর্কে কী? এই ক্ষেত্রে কালো তালিকা পদ্ধতির চেয়ে সাদা তালিকা পদ্ধতির ব্যবহার করা ভাল। মূলত বিশেষ প্রবন্ধগুলি বাদ দিয়ে কেবল প্রিন্টযোগ্য এএসসিআইআই ফাইলের নামগুলি অনুমতি দিন। তবে অ-ইংরাজী স্থানীয় লোকদের জন্য, এটি অন্য সমস্যা।
TheRealChx101

0

/এবং ..ব্যবহারকারীদের দেওয়া ফাইলের নাম ক্ষতিকারক হতে পারে। সুতরাং আপনার এ জাতীয় কিছু থেকে মুক্তি দেওয়া উচিত:

$fname = str_replace('..', '', $fname);
$fname = str_replace('/',  '', $fname);

এটি অপর্যাপ্ত! উদাহরণস্বরূপ, "./.name" ফাইলের নামটি বর্তমান ডিরেক্টরি থেকে বিচ্ছিন্ন হবে। (অপসারণ .. এখানে কিছুই করে না, তবে সরানো / সরানো। /। রূপান্তরিত করবে .. এবং তাই লক্ষ্য ডিরেক্টরি থেকে বিচ্ছিন্ন হবে))
cemper93

3
@ cemper93 না, এই উত্তরটি কেবল স্ট্রিংকে রূপান্তর ..nameকরবে যা কোনও কিছুই ভেঙে ফেলবে না। কোনও ডিরেক্টরি ট্র্যাভারসাল প্রতিরোধের জন্য সমস্ত পাথ বিভাজক অক্ষরগুলি সরিয়ে ফেলা যথেষ্ট হওয়া উচিত। (অপসারণ ..প্রযুক্তিগতভাবে অপ্রয়োজনীয়))
সিডিউইউই

@ সিডিউউই হ্যাঁ, তবে ফাইলের নাম ./.হয়ে যায় ..। এবং পরিশেষে এই উত্তরটি NULL এর মতো অন্য সমস্ত ফাইল সিস্টেম সংরক্ষিত অক্ষরগুলি মিস করে। আমার উত্তরে আরও: stackoverflow.com/a/42058764/318765
mgutt

-4

name fname = str_replace ('/', '',; fname);

যেহেতু ব্যবহারকারীরা দুটি শব্দ পৃথক করতে স্ল্যাশ ব্যবহার করতে পারেন NULL এর পরিবর্তে ড্যাশ দিয়ে প্রতিস্থাপন করা ভাল


কোথায় বলা হয়েছে যে তিনি NULL এর সাথে প্রতিস্থাপন করবেন? এছাড়াও, এটি সমস্ত বিশেষ অক্ষর পরিচালনা করে না।
ট্র্যাভিস পেসেটটো

হ্যাঁ - অন্যান্য বিশেষ অক্ষর রয়েছে যাগুলি পরিচালনা করারও প্রয়োজন। আরআর_প্লেস যাইহোক এখানে সেরা বিড হবে না।
মার্টিন কোভাচেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.