স্ট্রাইটিজিং স্ট্রিংগুলিকে ইউআরএল এবং ফাইল নাম নিরাপদ করতে?


136

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

এখনও অবধি আমি নিম্নলিখিত ফাংশনটি নিয়ে এসেছি যা আমি আশা করি যে এই সমস্যার সমাধান করে এবং বিদেশী ইউটিএফ -8 ডেটাও মঞ্জুরি দেয়।

/**
 * 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');
}

কারও কাছে কি আমি এর বিরুদ্ধে চালাতে পারি এমন কোনও জটিল নমুনা ডেটা আছে - বা খারাপ নামগুলি থেকে আমাদের অ্যাপ্লিকেশনগুলি রক্ষা করার আরও ভাল উপায় সম্পর্কে জানেন?

file ফাইল-নামটি কিছু অতিরিক্ত অক্ষর যেমন টেম্প ভিএম ফাইলের অনুমতি দেয়

আপডেট: তারকা অক্ষরটি সরানো হয়েছে যেহেতু আমি কোনও বৈধ ব্যবহারের কথা ভাবতে পারি না


ব্যতীত [\ w.-] ভালো অপসারণ সবকিছু
ইলিয়াস

3
আপনি নরমালাইজার এবং এর উপর মন্তব্যগুলি দরকারী খুঁজে পেতে পারেন ।
ম্যাট গিবসন

উত্তর:


57

আপনার সমাধান সম্পর্কে কিছু পর্যবেক্ষণ:

  1. আপনার প্যাটার্নের শেষে 'আপনি' অর্থ প্যাটার্নটি এবং এর সাথে মেলে এমন পাঠ্যটি ইউটিএফ -8 হিসাবে ব্যাখ্যা করা হবে না (আমি মনে করি আপনি উত্তরটি ধরে নিয়েছেন?)।
  2. \ w আন্ডারস্কোর চরিত্রের সাথে মেলে। আপনি এটি ফাইলগুলির জন্য বিশেষত অন্তর্ভুক্ত করেন যা এই ধারণাটি নিয়ে যায় যে আপনি সেগুলি ইউআরএলগুলিতে চান না, তবে আপনার কোডগুলিতে ইউআরএল রয়েছে এমন একটি আন্ডারস্কোর অন্তর্ভুক্ত করার অনুমতি দেওয়া হবে।
  3. "বিদেশী ইউটিএফ -8" অন্তর্ভুক্তি স্থানীয়ভাবে নির্ভর বলে মনে হচ্ছে। এটি সার্ভার বা ক্লায়েন্টের স্থানীয় কিনা তা পরিষ্কার নয়। পিএইচপি ডক্স থেকে:

একটি "শব্দ" অক্ষর হ'ল কোনও বর্ণ বা অঙ্ক বা আন্ডারস্কোর অক্ষর, অর্থাত্ যে কোনও অক্ষর যা পার্ল "শব্দের" অংশ হতে পারে। অক্ষর এবং অঙ্কগুলির সংজ্ঞাটি পিসিআরই এর অক্ষর সারণী দ্বারা নিয়ন্ত্রিত হয় এবং স্থানীয়-নির্দিষ্ট মিল থাকলে স্থান পরিবর্তন করতে পারে। উদাহরণস্বরূপ, "ফ্র" (ফরাসী) লোকালে, উচ্চারণযুক্ত বর্ণগুলির জন্য 128 এর চেয়ে বেশি কিছু অক্ষর কোডগুলি ব্যবহার করা হয় এবং এগুলি \ ডাব্লু দ্বারা মিলিত হয়।

স্লাগ তৈরি করা হচ্ছে

আপনার পোস্ট স্লাগে সম্ভবত আপনার উচ্চারণযুক্ত অক্ষরগুলি অন্তর্ভুক্ত করা উচিত নয়, প্রযুক্তিগতভাবে, সেগুলি শতাংশ এনকোড হওয়া উচিত (প্রতি ইউআরএল এনকোডিং বিধি অনুসারে) যাতে আপনার দেখতে কুৎসিত বর্ণনামূলক URL থাকে।

সুতরাং, আমি যদি আপনি হয়ে থাকি, ছোট করে রাখার পরে, আমি কোনও 'বিশেষ' অক্ষরকে তাদের সমতুল্য (যেমন> -> ই) তে রূপান্তরিত করতাম এবং অ [অ্যাজ] অক্ষরকে '-' দিয়ে প্রতিস্থাপন করতাম, একক '-' রানের সীমাবদ্ধ রেখে থাকতাম যেমন আপনি করেছেন এখানে বিশেষ অক্ষর রূপান্তরকরণের একটি বাস্তবায়ন রয়েছে: https://web.archive.org/web/20130208144021/http://neo22s.com/slug

সাধারণভাবে স্যানিটাইজেশন

OWASP- এ তাদের এন্টারপ্রাইজ সুরক্ষা API এর একটি পিএইচপি বাস্তবায়ন রয়েছে যা অন্যান্য বিষয়ের মধ্যে আপনার অ্যাপ্লিকেশনটিতে নিরাপদ এনকোডিং এবং ডিকোডিং ইনপুট এবং আউটপুট অন্তর্ভুক্ত করে।

এনকোডার ইন্টারফেসটি সরবরাহ করে:

canonicalize (string $input, [bool $strict = true])
decodeFromBase64 (string $input)
decodeFromURL (string $input)
encodeForBase64 (string $input, [bool $wrap = false])
encodeForCSS (string $input)
encodeForHTML (string $input)
encodeForHTMLAttribute (string $input)
encodeForJavaScript (string $input)
encodeForOS (Codec $codec, string $input)
encodeForSQL (Codec $codec, string $input)
encodeForURL (string $input)
encodeForVBScript (string $input)
encodeForXML (string $input)
encodeForXMLAttribute (string $input)
encodeForXPath (string $input)

https://github.com/OWASP/PHP-ESAPI https://www.owasp.org/index.php/Category :OWASP_Enterprise_Security_API


আপনি "ইউ" সংশোধক সম্পর্কে আমার ধারণা সম্পর্কে সঠিক - আমি ভেবেছিলাম এটি পাঠ্যের জন্য। আমি আন্ডারস্কোর সহ ডাব্লু ডাব্লু সংশোধক সম্পর্কেও ভুলে গিয়েছিলাম। আমি সাধারণত সমস্ত বর্ণিত অক্ষরগুলিকে ASCII তে রূপান্তরিত করব - তবে আমি এটি অন্যান্য ভাষার জন্যও কাজ করতে চাই। আমি ধরেই নিয়েছিলাম যে কোনও ধরনের ইউটিএফ -8 নিরাপদ উপায়ে থাকবে যে কোনও ভাষার যে কোনও অক্ষর ইউআরএল স্লাগ বা ফাইলনামে ব্যবহার করতে পারে যাতে এমনকি আরবি শিরোনামও কাজ করতে পারে। সর্বোপরি, লিনাক্স ইউটিএফ -8 ফাইলের নামগুলি সমর্থন করে এবং ব্রাউজারগুলির প্রয়োজন অনুসারে HTML লিঙ্কগুলি এনকোড করা উচিত । আপনার ইনপুট জন্য এখানে বড় ধন্যবাদ।
জিওনক্রস

দ্বিতীয় ভাবাতে, আপনি আসলেই সঠিক, তবে এটি ব্রাউজারের সাথে লিঙ্কগুলি সঠিকভাবে এনকোড করার বিষয়টি নয়। আপনি যা চান তার কাছাকাছি অর্জনের সবচেয়ে সহজ উপায় হ'ল নন-এএসসিআইআই অক্ষরগুলি তাদের নিকটতম এএসসিআইআই সমতুল্য মানচিত্র করা এবং তারপরে আপনার লিঙ্কটি এইচটিএমএল বডিটিতে এনকোড করা। হার্ড উপায় আপনার ওয়েবসার্ভার, অ্যাপ্লিকেশন স্তর (পিএইচপি), পৃষ্ঠা বিষয়বস্তু, ওয়েব ব্রাউজারের মাধ্যমে সামঞ্জস্যপূর্ণ UTF-8 এনকোডিং নিশ্চিত আপনার ডেটা দোকান থেকে (অথবা হল UTF-16, আমি কিছু চীনা উপভাষা চিন্তা), এবং হয় না আপনার URL গুলিতে urlencode ( তবে তবুও 'অনাকাঙ্ক্ষিত' অক্ষর ফেলা)। এটি আপনাকে দুর্দান্ত নন-এনকোডযুক্ত লিঙ্ক এবং URL দেবে।
অ্যালান ডোনেলি

সদুপদেশ. আমি খাঁটি ইউটিএফ -8 পরিবেশ তৈরি করার চেষ্টা করতে যাচ্ছি। তারপরে, অ-এসসিআইআই ভাষা থেকে কয়েকটি স্ট্রিং নেওয়ার পরে, আমি বিপজ্জনক অক্ষর (./ ;: ইত্যাদি ইত্যাদি) মুছে ফেলব এবং ফাইলগুলি তৈরি করব এবং তারপরে এই ফাইলগুলির জন্য এইচটিএমএল লিঙ্কগুলি ক্লিক করতে পারব কিনা তা দেখার জন্য এবং এই সমস্ত কি না কাজ করে। যদি তা না হয় তবে ইউটিএফ -8 অনুমতি দেওয়ার জন্য আমাকে সম্ভবত (কাঁচা) ইউরেনকোড () এ ফিরে যেতে হবে? আমি এখানে ফলাফল ফিরে পোস্ট করব।
জিওনক্রস

3
আমি একটি ফাইল বলেছিলাম สังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่.txtএবং তারপরে একটি লিঙ্ক সহ একটি ইউটিএফ -8 এইচটিএমএল ফাইল তৈরি করেছি। আশ্চর্যজনকভাবে এটি কাজ করেছে - এমনকি উইন্ডোতেও! যাইহোক, আমার তখন পিএইচপি ছিল file_put_contents('สังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่.txt')এবং এটি স্ট্রিং থেকে বাজারের ফাইলনাম তৈরি করতে ব্যর্থ হয়েছিল। তারপরে আমি এটি দিয়ে তৈরি করার চেষ্টা fopen()করেছি এবং একই গণ্ডগোলযুক্ত ফাইলের নামটি পেয়েছি। সুতরাং স্পষ্টতই পিএইচপি (উইন্ডোজে অন্তত) ইউটিএফ -8 ফাইলের নাম তৈরি করতে অক্ষম। bugs.php.net/bug.php?id=46990&thanks=6
শিওনক্রস

1
আমি এই উত্তরটি পুরষ্কার দিয়েছি কারণ এটি আমাকে সবচেয়ে বেশি চিন্তা করেছিল এবং এমন একটি প্রকল্পের একটি দরকারী লিঙ্কও অন্তর্ভুক্ত ছিল যা আমি কখনও শুনিনি যে এটি সন্ধানের পক্ষে উপযুক্ত। আমি যদিও উত্তর খুঁজে পাই একবার পোস্ট করব
ক্লোনক্রস

87

আমি Chyrp কোডে এই বৃহত্তর ফাংশনটি পেয়েছি :

/**
 * Function: sanitize
 * Returns a sanitized string, typically for URLs.
 *
 * Parameters:
 *     $string - The string to sanitize.
 *     $force_lowercase - Force the string to lowercase?
 *     $anal - If set to *true*, will remove all non-alphanumeric characters.
 */
function sanitize($string, $force_lowercase = true, $anal = false) {
    $strip = array("~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "=", "+", "[", "{", "]",
                   "}", "\\", "|", ";", ":", "\"", "'", "‘", "’", "“", "”", "–", "—",
                   "—", "–", ",", "<", ".", ">", "/", "?");
    $clean = trim(str_replace($strip, "", strip_tags($string)));
    $clean = preg_replace('/\s+/', "-", $clean);
    $clean = ($anal) ? preg_replace("/[^a-zA-Z0-9]/", "", $clean) : $clean ;
    return ($force_lowercase) ?
        (function_exists('mb_strtolower')) ?
            mb_strtolower($clean, 'UTF-8') :
            strtolower($clean) :
        $clean;
}

এবং এটি ওয়ার্ডপ্রেস কোডে

/**
 * Sanitizes a filename replacing whitespace with dashes
 *
 * Removes special characters that are illegal in filenames on certain
 * operating systems and special characters requiring special escaping
 * to manipulate at the command line. Replaces spaces and consecutive
 * dashes with a single dash. Trim period, dash and underscore from beginning
 * and end of filename.
 *
 * @since 2.1.0
 *
 * @param string $filename The filename to be sanitized
 * @return string The sanitized filename
 */
function sanitize_file_name( $filename ) {
    $filename_raw = $filename;
    $special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}");
    $special_chars = apply_filters('sanitize_file_name_chars', $special_chars, $filename_raw);
    $filename = str_replace($special_chars, '', $filename);
    $filename = preg_replace('/[\s-]+/', '-', $filename);
    $filename = trim($filename, '.-_');
    return apply_filters('sanitize_file_name', $filename, $filename_raw);
}

আপডেট সেপ্টেম্বর 2012

অ্যালিক্স অ্যাক্সেল এই ক্ষেত্রে কিছু অবিশ্বাস্য কাজ করেছেন। তাঁর ফোংশন কাঠামোটিতে বেশ কয়েকটি দুর্দান্ত পাঠ্য ফিল্টার এবং রূপান্তর রয়েছে।


23
ওয়ার্ডপ্রেস কোডটি বহনযোগ্য হিসাবে এটি ব্যবহার করে নাapply_filters
কেভিন মার্ক

1
মনে রাখবেন যে ওয়ার্ডপ্রেস সংস্করণটি প্রতিস্থাপিত /[\s-]+/করে -যা প্রথম সংস্করণ (যা কেবলমাত্র প্রতিস্থাপন করে /\s+/) এর চেয়ে ভাল যা একাধিক ড্যাশগুলিতে পরিকল্পিত হতে পারে
ইয়োটাম ওমর

রেফারেন্স ওয়ার্ডপ্রেস apply_filters জন্য শুধু পাওয়া যাবে এখানে এবং উপর sanitize_file_name এখানে
এরিক

একাধিক স্পেস সম্পর্কে কি? প্রতিস্থাপন করুন
জেফ্রি দ্য জিরাফ

8
জোর-বিকল্পের সাথে $ পায়ুসংক্রান্ত-পরিবর্তনশীল শব্দগুলি আমার কাছে খুব ভীতিজনক বলে মনে হয়।
ভিলজুন

30

এটিতে আপনার ফাইলের নামগুলি নিরাপদ করা উচিত ...

$string = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $string);

এবং এর গভীর সমাধান হ'ল:

// Remove special accented characters - ie. sí.
$clean_name = strtr($string, array('Š' => 'S','Ž' => 'Z','š' => 's','ž' => 'z','Ÿ' => 'Y','À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Å' => 'A','Ç' => 'C','È' => 'E','É' => 'E','Ê' => 'E','Ë' => 'E','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I','Ñ' => 'N','Ò' => 'O','Ó' => 'O','Ô' => 'O','Õ' => 'O','Ö' => 'O','Ø' => 'O','Ù' => 'U','Ú' => 'U','Û' => 'U','Ü' => 'U','Ý' => 'Y','à' => 'a','á' => 'a','â' => 'a','ã' => 'a','ä' => 'a','å' => 'a','ç' => 'c','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e','ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ñ' => 'n','ò' => 'o','ó' => 'o','ô' => 'o','õ' => 'o','ö' => 'o','ø' => 'o','ù' => 'u','ú' => 'u','û' => 'u','ü' => 'u','ý' => 'y','ÿ' => 'y'));
$clean_name = strtr($clean_name, array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', 'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u'));

$clean_name = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $clean_name);

এটি ধরে নিয়েছে যে আপনি ফাইলের নামতে একটি বিন্দু চান। আপনি যদি এটি ছোট হাতের কাছে স্থানান্তর করতে চান তবে কেবল ব্যবহার করুন

$clean_name = strtolower($clean_name);

শেষ লাইনের জন্য


1
এখনও কিছু চেক এবং স্লোভাক অক্ষর নেই:'ľ' => 'l', 'Ľ' => 'L', 'č' => 'c', 'Č' => 'C', 'ť' => 't', 'Ť' => 'T', 'ň' => 'n', 'Ň' => 'N', 'ĺ' => 'l', 'Ĺ' => 'L', 'Ř' => 'R', 'ř' => 'r', 'ě' => 'e', 'Ě' => 'E', 'ů' => 'u', 'Ů' => 'U'
জেসম ডটনেট

22

এটা চেষ্টা কর:

function normal_chars($string)
{
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $string);
    $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');
    $string = preg_replace(array('~[^0-9a-z]~i', '~[ -]+~'), ' ', $string);

    return trim($string, ' -');
}

Examples:

echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA

এই থ্রেডে নির্বাচিত উত্তরের ভিত্তিতে: পিএইচপি-তে ইউআরএল বন্ধুত্বপূর্ণ নাম?


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

4
হা! সেই সত্তা এনকোডিং হ্যাকটি মিষ্টি! যদিও এই পদ্ধতিটি কী করে তা কী করে তা প্রথম নজরে এটি মোটেও পরিষ্কার নয়। যদিও একটি সমস্যা আছে। "ফ্রেডেরিক অ্যান্ড আরিক" কি "ফ্রেডেরিক অ্যাম্প এরিক" তে পরিণত হবে না?
অ্যালান ডোনেলি

@ অ্যালানডোনেলি: আসলে, আমি আমার মূল উত্তরে ফাংশনটি আপডেট করেছি (লিঙ্কটি পরীক্ষা করুন), trim()এটিও হওয়া উচিত trim($string, '-')
অ্যালিক্স অ্যাক্সেল

@ এক্সনক্রস: সর্বশেষে preg_replace()সমস্ত বিপজ্জনক অক্ষর মুছে ফেলা উচিত।
অ্যালিক্স অ্যাক্সেল

অ্যালিক্স অ্যাক্সেল, আপনার ঠিক সর্বত্রই আপনি নন। আমি কেবল পিএইচপি অ্যাডাব্লুএস এসডিকে পড়ছিলাম এবং ইউআইডির জন্য তাদের কিছু কোড ছিল। চমত্কার কোডটি মারতে খুব শক্ত beat
জিওনক্রস

13

এটি ঠিক কোনও উত্তর নয় কারণ এটি কোনও সমাধান দেয় না (এখনও!), তবে কোনও মন্তব্যে ফিট করা এটি খুব বড় ...


আমি উইন্ডোজ 7 এবং উবুন্টু 12.04 এ কিছু ফাইল পরীক্ষা করেছি (ফাইলের নাম সম্পর্কিত) এবং যা আমি জানতে পেরেছিলাম তা হ'ল:

1. পিএইচপি অ ASCII ফাইলের নামগুলি পরিচালনা করতে পারে না

যদিও উইন্ডোজ এবং উবুন্টু উভয়ই ইউনিকোড ফাইলের নামগুলি (এটি आरটিএলগুলি যেমন মনে হয় হ্যান্ডেল করতে পারে) পিএইচপি 5.3 এর জন্য সরল পুরানো আইএসও -8859-1 এর সাথে মোকাবিলা করার জন্য হ্যাকের প্রয়োজন হয়, সুতরাং এটি কেবলমাত্র সুরক্ষার জন্য এএসসিআইই রাখা ভাল।

২. ফাইলনাম ম্যাটারগুলির দৈর্ঘ্য (বিশেষত উইন্ডোজে)

উবুন্টুতে, কোনও ফাইলের নামের সর্বোচ্চ দৈর্ঘ্য (অন্তর্ভুক্ত এক্সটেনশান) 255 (পথ বাদে):

/var/www/uploads/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345/

তবে উইন্ডোজ 7 (এনটিএফএস) এ কোনও ফাইলের নামের সর্বোচ্চ দৈর্ঘ্য তার পরম পথের উপর নির্ভর করে:

(0 + 0 + 244 + 11 chars) C:\1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234\1234567.txt
(0 + 3 + 240 + 11 chars) C:\123\123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\1234567.txt
(3 + 3 + 236 + 11 chars) C:\123\456\12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456\1234567.txt

উইকিপিডিয়া যে বলেন:

এনটিএফএস প্রতিটি পাথ উপাদান (ডিরেক্টরি বা ফাইলের নাম) 255 অক্ষর দীর্ঘ হতে দেয়।

আমার জ্ঞানের সেরাটি (এবং পরীক্ষা করা), এটি ভুল,

মোট (স্ল্যাশ গণনা) এই সমস্ত উদাহরণগুলির 259 টি অক্ষর রয়েছে, যদি আপনি স্ট্রিপটি ছড়িয়ে দেন C:\ এটি 256 টি অক্ষর (255 নয়!) প্রদান করেন? এক্সপ্লোরার ব্যবহার করে যে ডিরেক্টরিগুলি তৈরি করা হয়েছিল এবং আপনি লক্ষ্য করবেন যে এটি ডিরেক্টরি নামের জন্য উপলব্ধ সমস্ত স্থান ব্যবহার করা থেকে নিজেকে বিরত রাখে। এর কারণ হ'ল 8.3 ফাইল নামকরণ কনভেনশন ব্যবহার করে ফাইল তৈরির অনুমতি দেওয়া । অন্যান্য পার্টিশনের ক্ষেত্রেও একই ঘটনা ঘটে।

ফাইলগুলির অবশ্যই 8.3 দৈর্ঘ্যের প্রয়োজনীয়তা সংরক্ষণের দরকার নেই:

(255 chars) E:\12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901.txt

অভিভাবক ডিরেক্টরিটির পরম পথে 242 টিরও বেশি অক্ষর থাকলে আপনি আর কোনও উপ-ডিরেক্টরি তৈরি করতে পারবেন না, কারণ 256 = 242 + 1 + \ + 8 + . + 3। উইন্ডোজ এক্সপ্লোরার ব্যবহার করে, যদি পিতামাতার ডিরেক্টরিতে 233 টিরও বেশি অক্ষর থাকে (সিস্টেমের লোকেলের উপর নির্ভর করে) তবে আপনি অন্য ডিরেক্টরিটি তৈরি করতে পারবেন না 256 = 233 + 10 + \ + 8 + . + 3; 10এখানে স্ট্রিং এর দৈর্ঘ্য হলNew folder

আপনি যদি ফাইল সিস্টেমের মধ্যে আন্তঃ অপারেবিলিটি নিশ্চিত করতে চান তবে উইন্ডোজ ফাইল সিস্টেম একটি বাজে সমস্যা সৃষ্টি করে।

৩. সংরক্ষিত অক্ষর এবং কীওয়ার্ডগুলি থেকে সাবধান থাকুন

নন-এএসসিআইআই, মুদ্রণযোগ্য এবং নিয়ন্ত্রণের অক্ষরগুলি অপসারণের পাশাপাশি আপনাকে পুনরায় স্থান (স্থান / সরানো) করতে হবে:

"*/:<>?\|

কেবলমাত্র এই অক্ষরগুলি অপসারণই সেরা ধারণা নাও হতে পারে কারণ ফাইলের নামটির কিছু অর্থ হারাতে পারে। আমি মনে করি, খুব কমপক্ষে, এই চরিত্রগুলির একাধিক উপস্থিতি একটি একক আন্ডারস্কোর ( _) বা সম্ভবত আরও কিছু প্রতিনিধি দ্বারা প্রতিস্থাপন করা উচিত (এটি কেবল একটি ধারণা):

  • "*? -> _
  • /\| -> -
  • : -> [ ]-[ ]
  • < -> (
  • > -> )

এছাড়াও বিশেষ কীওয়ার্ড রয়েছে যা এড়ানো উচিত (যেমন NUL), যদিও আমি কীভাবে এটি পরাভূত করতে পারি তা নিশ্চিত নই। সম্ভবত একটি এলোমেলো নাম ফলব্যাক সহ একটি কালো তালিকা এটি সমাধানের জন্য একটি ভাল পদ্ধতির হতে পারে।

4. কেস সংবেদনশীলতা

এটি বলা না করেই চলতে হবে, তবে আপনি যদি বিভিন্ন অপারেটিং সিস্টেমের মধ্যে ফাইলের স্বাতন্ত্র্যতা নিশ্চিত করতে চান তবে আপনার ফাইলের নামগুলি একটি সাধারণ কায়দায় রূপান্তর করা উচিত, সেইভাবে my_file.txtএবং My_File.txtলিনাক্সে my_file.txtউইন্ডোজ উভয়ই একই ফাইল হয়ে উঠবে না ।

৫. নিশ্চিত করুন এটি অনন্য

যদি ফাইলের নামটি ইতিমধ্যে বিদ্যমান থাকে তবে এটির বেস ফাইলের নামের সাথে একটি অনন্য শনাক্তকারী যুক্ত করা উচিত

সাধারণ অনন্য শনাক্তকারীদের মধ্যে ইউনিক্স টাইমস্ট্যাম্প, ফাইল সামগ্রীর ডাইজেস্ট বা এলোমেলো স্ট্রিং অন্তর্ভুক্ত থাকে।

6. লুকানো ফাইল

নামকরণ করার কারণে এটির অর্থ এই নয় যে ...

ডটগুলি সাধারণত ফাইলের নামগুলিতে সাদা তালিকাভুক্ত করা হয় তবে লিনাক্সে একটি লুকানো ফাইল একটি শীর্ষস্থানীয় ডট দ্বারা প্রতিনিধিত্ব করা হয়।

7. অন্যান্য বিবেচনা

আপনার যদি ফাইলের নামের কিছু অক্ষর ছড়িয়ে দিতে হয় তবে সাধারণত ফাইলের ভিত্তির নামের চেয়ে এক্সটেনশনটি বেশি গুরুত্বপূর্ণ। একটি অনুমতি ফাইল এক্সটেনশন জন্য অক্ষরের যথেষ্ট সর্বোচ্চ সংখ্যক (8-16) এক বেস নাম থেকে অক্ষর স্ট্রিপ করা উচিত নয়। এটিও লক্ষ করা গুরুত্বপূর্ণ যে একাধিক দীর্ঘ এক্সটেনশন হওয়ার সম্ভাব্য ক্ষেত্রে - যেমন _.graphmlz.tag.gz- _.graphmlz.tagকেবলমাত্র _এই ক্ষেত্রে ফাইলের বেস নাম হিসাবে বিবেচনা করা উচিত।

8. সম্পদ

ক্যালিবার ফাইলের নাম মাংলিকে বেশ শালীনভাবে পরিচালনা করে:

ফাইলের নাম ম্যাঙ্গিলিংয়ের উইকিপিডিয়া পৃষ্ঠা এবং সাম্বা ব্যবহার থেকে লিঙ্কিত অধ্যায়


উদাহরণস্বরূপ, আপনি এমন একটি ফাইল তৈরি করার চেষ্টা করছেন যা কোনও নিয়মকে 1/2/3 লঙ্ঘন করে, আপনি খুব দরকারী ত্রুটি পাবেন:

Warning: touch(): Unable to create file ... because No error in ... on line ...

11

আমি সবসময়ই ভেবেছিলাম কোহানা এটির একটি ভাল কাজ করেছে

public static function title($title, $separator = '-', $ascii_only = FALSE)
{
if ($ascii_only === TRUE)
{
// Transliterate non-ASCII characters
$title = UTF8::transliterate_to_ascii($title);

// Remove all characters that are not the separator, a-z, 0-9, or whitespace
$title = preg_replace('![^'.preg_quote($separator).'a-z0-9\s]+!', '', strtolower($title));
}
else
{
// Remove all characters that are not the separator, letters, numbers, or whitespace
$title = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', UTF8::strtolower($title));
}

// Replace all separator characters and whitespace by a single separator
$title = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $title);

// Trim separators from the beginning and end
return trim($title, $separator);
}

হ্যান্ডি UTF8::transliterate_to_ascii() Ñ ভালো জিনিস চালু => এন হবে।

অবশ্যই, আপনি অন্যান্য UTF8::*জিনিসগুলি mb_ * ফাংশনগুলির সাথে প্রতিস্থাপন করতে পারেন।


5

ফাইল আপলোডের ক্ষেত্রে, ফাইলটির নাম নিয়ন্ত্রণ করা থেকে ব্যবহারকারীকে রোধ করা আপনি সবচেয়ে নিরাপদ। ইতিমধ্যে ইঙ্গিত করা হয়েছে হিসাবে, একটি এলোমেলোভাবে পছন্দসই এবং অনন্য নাম যা আপনি প্রকৃত ফাইলের নাম হিসাবে ব্যবহার করবেন সেই সাথে একটি ডাটাবেসে canonicalised ফাইল নাম সংরক্ষণ করুন।

OWASP ESAPI ব্যবহার করে, এই নামগুলি এভাবে তৈরি করা যেতে পারে:

$userFilename   = ESAPI::getEncoder()->canonicalize($input_string);
$safeFilename   = ESAPI::getRandomizer()->getRandomFilename();

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

ইউআরএল-এর এনকোডিংয়ের ক্ষেত্রে এবং আবার ESAPI ব্যবহার করার ক্ষেত্রে:

$safeForURL     = ESAPI::getEncoder()->encodeForURL($input_string);

এই পদ্ধতিটি স্ট্রিংটিকে এনকোড করার আগে ক্যানোনিকালাইজেশন করে এবং সমস্ত অক্ষর এনকোডিংগুলি পরিচালনা করবে।


অবশ্যই - ব্যবহারকারীদের থেকে ফাইল নাম নিয়ন্ত্রণ দূরে সরিয়ে নিয়ে যাওয়া একই নাম থাকা 2 টি আপলোড হওয়ার সম্ভাবনা রোধ করবে।
ভার্চুওসো

5

আমি পিএইচপি এর জন্য ইউআরএলআইফির প্রস্তাব দিচ্ছি (গিথুবের 480+ তারা) - "জ্যাঙ্গো প্রকল্পের URLify.js এর পিএইচপি পোর্ট URL ইউআরএলগুলিতে ব্যবহারের জন্য অ-এস্কি অক্ষরকে লিপ্যন্তরেণিত করুন"।

বেসিক ব্যবহার:

ইউআরএলগুলির জন্য স্লাগগুলি তৈরি করতে:

<?php

echo URLify::filter (' J\'étudie le français ');
// "jetudie-le-francais"

echo URLify::filter ('Lo siento, no hablo español.');
// "lo-siento-no-hablo-espanol"

?>

ফাইলের নামের জন্য স্লাগ তৈরি করতে:

<?php

echo URLify::filter ('фото.jpg', 60, "", true);
// "foto.jpg"

?>

* অন্য কোনও পরামর্শ আমার মানদণ্ডের সাথে মেলে না:

  • সুরকারের মাধ্যমে ইনস্টলযোগ্য হওয়া উচিত
  • আইকনভের উপর নির্ভর করা উচিত নয় কারণ এটি বিভিন্ন সিস্টেমে আলাদাভাবে আচরণ করে
  • ওভাররাইড এবং কাস্টম চরিত্র প্রতিস্থাপনের অনুমতি দেওয়ার জন্য প্রসারিত হওয়া উচিত
  • জনপ্রিয় (উদাহরণস্বরূপ গিথুবের অনেক তারকা)
  • পরীক্ষা আছে

বোনাস হিসাবে, URLify নির্দিষ্ট শব্দগুলি সরিয়ে দেয় এবং লিখিত লিখিত নয় এমন সমস্ত অক্ষর সরিয়ে দেয়।

এখানে ইউআরএলআইফিকে ব্যবহার করে টন বিদেশী অক্ষরকে সঠিকভাবে অনূদিত করা হচ্ছে এমন একটি পরীক্ষার কেস এখানে রয়েছে: https://gist.github.com/motin/a65e6c1cc303e46900d10894bf2da87f


1
ধন্যবাদ - এটি আমার উদ্দেশ্যগুলির জন্য আদর্শ দেখাচ্ছে।
ডেভিড গুডউইন

5

আমি অন্য উত্স থেকে মানিয়ে নিয়েছি এবং আরও কিছু যোগ করেছি, সম্ভবত কিছুটা ওভারকিল

/**
 * Convert a string into a url safe address.
 *
 * @param string $unformatted
 * @return string
 */
public function formatURL($unformatted) {

    $url = strtolower(trim($unformatted));

    //replace accent characters, forien languages
    $search = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ', 'ĉ', 'Ċ', 'ċ', 'Č', 'č', 'Ď', 'ď', 'Đ', 'đ', 'Ē', 'ē', 'Ĕ', 'ĕ', 'Ė', 'ė', 'Ę', 'ę', 'Ě', 'ě', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ģ', 'ģ', 'Ĥ', 'ĥ', 'Ħ', 'ħ', 'Ĩ', 'ĩ', 'Ī', 'ī', 'Ĭ', 'ĭ', 'Į', 'į', 'İ', 'ı', 'IJ', 'ij', 'Ĵ', 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'Ń', 'ń', 'Ņ', 'ņ', 'Ň', 'ň', 'ʼn', 'Ō', 'ō', 'Ŏ', 'ŏ', 'Ő', 'ő', 'Œ', 'œ', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', 'ś', 'Ŝ', 'ŝ', 'Ş', 'ş', 'Š', 'š', 'Ţ', 'ţ', 'Ť', 'ť', 'Ŧ', 'ŧ', 'Ũ', 'ũ', 'Ū', 'ū', 'Ŭ', 'ŭ', 'Ů', 'ů', 'Ű', 'ű', 'Ų', 'ų', 'Ŵ', 'ŵ', 'Ŷ', 'ŷ', 'Ÿ', 'Ź', 'ź', 'Ż', 'ż', 'Ž', 'ž', 'ſ', 'ƒ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ǎ', 'ǎ', 'Ǐ', 'ǐ', 'Ǒ', 'ǒ', 'Ǔ', 'ǔ', 'Ǖ', 'ǖ', 'Ǘ', 'ǘ', 'Ǚ', 'ǚ', 'Ǜ', 'ǜ', 'Ǻ', 'ǻ', 'Ǽ', 'ǽ', 'Ǿ', 'ǿ'); 
    $replace = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o'); 
    $url = str_replace($search, $replace, $url);

    //replace common characters
    $search = array('&', '£', '$'); 
    $replace = array('and', 'pounds', 'dollars'); 
    $url= str_replace($search, $replace, $url);

    // remove - for spaces and union characters
    $find = array(' ', '&', '\r\n', '\n', '+', ',', '//');
    $url = str_replace($find, '-', $url);

    //delete and replace rest of special chars
    $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
    $replace = array('', '-', '');
    $uri = preg_replace($find, $replace, $url);

    return $uri;
}

5

এবং এটি থেকে জুমলা ৩.৩.২ সংস্করণ JFile::makeSafe($file)

public static function makeSafe($file)
{
    // Remove any trailing dots, as those aren't ever valid file names.
    $file = rtrim($file, '.');

    $regex = array('#(\.){2,}#', '#[^A-Za-z0-9\.\_\- ]#', '#^\.#');

    return trim(preg_replace($regex, '', $file));
}

4

আমি মনে করি না সরানোর জন্য অক্ষরের একটি তালিকা থাকা নিরাপদ। আমি বরং নিম্নলিখিতটি ব্যবহার করব:

ফাইলের নামগুলির জন্য: ফাইল কনটেন্টের একটি অভ্যন্তরীণ আইডি বা একটি হ্যাশ ব্যবহার করুন। একটি ডাটাবেসে নথির নাম সংরক্ষণ করুন। এইভাবে আপনি মূল ফাইলের নামটি রাখতে পারেন এবং এখনও ফাইলটি সন্ধান করতে পারেন।

ইউআরএল পরামিতিগুলির জন্য: urlencode()কোনও বিশেষ অক্ষরকে এনকোড করতে ব্যবহার করুন ।


1
আমি সম্মত, এখানে তালিকাভুক্ত বেশিরভাগ পদ্ধতি জানা বিপজ্জনক চরিত্রগুলি সরিয়ে দেয় - আমার পদ্ধতিটি এমন সমস্ত কিছু সরিয়ে দেয় যা একটি পরিচিত নিরাপদ চরিত্র নয়। যেহেতু বেশিরভাগ সিস্টেমগুলি ইউআরএল পোস্টের এনকোড পোস্ট করে সেক্ষেত্রে আমি পরামর্শ দেব যে নথিভুক্ত UTF-8 অনিরাপদ urlencode () ব্যবহার না করে আমরা এই প্রমাণিত পদ্ধতিটি অনুসরণ করা চালিয়ে যেতে চাই ।
জিওনক্রস

3

আপনি এটি কীভাবে ব্যবহার করবেন তার উপর নির্ভর করে আপনি বাফার ওভারফ্লো থেকে রক্ষা করতে একটি দৈর্ঘ্য সীমা যুক্ত করতে চাইতে পারেন।


হ্যাঁ, mb_strlen () এর জন্য পরীক্ষা করা সবসময় একটি গুরুত্বপূর্ণ জিনিস!
জিওনক্রস

3

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

$file_name = trim(basename(stripslashes($name)), ".\x00..\x20");

আমি এ সম্পর্কে তেমন নিশ্চিত নই, কারণ একজনকে .\x00..\x20হ্রাস করা যায় .\x00\x20
জিওনক্রস

@ এক্সনক্রস: আমি মনে করি যে .\x00..\x20বিন্দুগুলি এবং প্রতিটি চরিত্র \x00এবং এর মধ্যে এবং সমস্ত চরিত্রগুলি সরিয়ে দেয় \x20, যেখানে .\x00\x20কেবল এই 3 বাইট অপসারণ করা উচিত।
অ্যালিক্স অ্যাক্সেল

নিরাপদে ব্যবহারের জন্য এই উত্তরটির আরও ব্যাখ্যা প্রয়োজন। নেটে চার্লিস্টের জন্য সঠিক সিনট্যাক্স সম্পর্কে খুব বেশি তথ্য নেই।
ম্যানুয়েল আর্কড স্মিট

3

এখানে কোডইগনিটারের বাস্তবায়ন।

/**
 * Sanitize Filename
 *
 * @param   string  $str        Input file name
 * @param   bool    $relative_path  Whether to preserve paths
 * @return  string
 */
public function sanitize_filename($str, $relative_path = FALSE)
{
    $bad = array(
        '../', '<!--', '-->', '<', '>',
        "'", '"', '&', '$', '#',
        '{', '}', '[', ']', '=',
        ';', '?', '%20', '%22',
        '%3c',      // <
        '%253c',    // <
        '%3e',      // >
        '%0e',      // >
        '%28',      // (
        '%29',      // )
        '%2528',    // (
        '%26',      // &
        '%24',      // $
        '%3f',      // ?
        '%3b',      // ;
        '%3d'       // =
    );

    if ( ! $relative_path)
    {
        $bad[] = './';
        $bad[] = '/';
    }

    $str = remove_invisible_characters($str, FALSE);
    return stripslashes(str_replace($bad, '', $str));
}

এবং remove_invisible_charactersনির্ভরতা।

function remove_invisible_characters($str, $url_encoded = TRUE)
{
    $non_displayables = array();

    // every control character except newline (dec 10),
    // carriage return (dec 13) and horizontal tab (dec 09)
    if ($url_encoded)
    {
        $non_displayables[] = '/%0[0-8bcef]/';  // url encoded 00-08, 11, 12, 14, 15
        $non_displayables[] = '/%1[0-9a-f]/';   // url encoded 16-31
    }

    $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';   // 00-08, 11, 12, 14-31, 127

    do
    {
        $str = preg_replace($non_displayables, '', $str, -1, $count);
    }
    while ($count);

    return $str;
}

2

কেন কেবল পিএইচপি ব্যবহার করবেন না urlencode? এটি url (যেমন %20একটি স্থানের জন্য) এর হেক্স উপস্থাপনার সাথে "বিপজ্জনক" চরিত্রগুলি প্রতিস্থাপন করে


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

আপনি একটি urlencode করতে পারেন এবং তারপরে একটি str_replace ('% 20', '-', url) করতে পারেন?
ফ্রান্সেস্কো

2

এই প্রশ্নের জন্য ইতিমধ্যে বেশ কয়েকটি সমাধান সরবরাহ করা হয়েছে তবে আমি এখানে বেশিরভাগ কোডটি পড়েছি এবং পরীক্ষা করেছি এবং আমি এই সমাধানটি দিয়ে শেষ করেছি যা আমি এখানে শিখেছি তার একটি মিশ্রণ:

কাজ

ফাংশনটি এখানে একটি সিমফনি 2 বান্ডেলে বান্ডিল করা হয়েছে তবে এটি সরল পিএইচপি হিসাবে ব্যবহার করার জন্য উত্তোলন করা যেতে পারে , এটি কেবল iconvফাংশনটির সাথে নির্ভরশীল যা অবশ্যই সক্ষম হতে হবে:

ফাইল সিস্টেম.এফপি :

<?php

namespace COil\Bundle\COilCoreBundle\Component\HttpKernel\Util;

use Symfony\Component\HttpKernel\Util\Filesystem as BaseFilesystem;

/**
 * Extends the Symfony filesystem object.
 */
class Filesystem extends BaseFilesystem
{
    /**
     * Make a filename safe to use in any function. (Accents, spaces, special chars...)
     * The iconv function must be activated.
     *
     * @param string  $fileName       The filename to sanitize (with or without extension)
     * @param string  $defaultIfEmpty The default string returned for a non valid filename (only special chars or separators)
     * @param string  $separator      The default separator
     * @param boolean $lowerCase      Tells if the string must converted to lower case
     *
     * @author COil <https://github.com/COil>
     * @see    http://stackoverflow.com/questions/2668854/sanitizing-strings-to-make-them-url-and-filename-safe
     *
     * @return string
     */
    public function sanitizeFilename($fileName, $defaultIfEmpty = 'default', $separator = '_', $lowerCase = true)
    {
    // Gather file informations and store its extension
    $fileInfos = pathinfo($fileName);
    $fileExt   = array_key_exists('extension', $fileInfos) ? '.'. strtolower($fileInfos['extension']) : '';

    // Removes accents
    $fileName = @iconv('UTF-8', 'us-ascii//TRANSLIT', $fileInfos['filename']);

    // Removes all characters that are not separators, letters, numbers, dots or whitespaces
    $fileName = preg_replace("/[^ a-zA-Z". preg_quote($separator). "\d\.\s]/", '', $lowerCase ? strtolower($fileName) : $fileName);

    // Replaces all successive separators into a single one
    $fileName = preg_replace('!['. preg_quote($separator).'\s]+!u', $separator, $fileName);

    // Trim beginning and ending seperators
    $fileName = trim($fileName, $separator);

    // If empty use the default string
    if (empty($fileName)) {
        $fileName = $defaultIfEmpty;
    }

    return $fileName. $fileExt;
    }
}

ইউনিট পরীক্ষা করে

মজার বিষয়টি হ'ল আমি পিএইচপিউনিট পরীক্ষা তৈরি করেছি, এজন্য প্রথমে প্রান্তের কেসগুলি পরীক্ষা করেছিলাম এবং এটি আপনার প্রয়োজনের সাথে খাপ খায় তা পরীক্ষা করতে পারেন: (আপনি যদি কোনও বাগ খুঁজে পান তবে একটি পরীক্ষার কেস যুক্ত করতে নির্দ্বিধায় অনুভব করুন)

ফাইলসিস্টেমস্টেস্ট.এফপি :

<?php

namespace COil\Bundle\COilCoreBundle\Tests\Unit\Helper;

use COil\Bundle\COilCoreBundle\Component\HttpKernel\Util\Filesystem;

/**
 * Test the Filesystem custom class.
 */
class FilesystemTest extends \PHPUnit_Framework_TestCase
{
    /**
     * test sanitizeFilename()
     */
    public function testFilesystem()
    {
    $fs = new Filesystem();

    $this->assertEquals('logo_orange.gif', $fs->sanitizeFilename('--logö  _  __   ___   ora@@ñ--~gé--.gif'), '::sanitizeFilename() handles complex filename with specials chars');
    $this->assertEquals('coilstack', $fs->sanitizeFilename('cOiLsTaCk'), '::sanitizeFilename() converts all characters to lower case');
    $this->assertEquals('cOiLsTaCk', $fs->sanitizeFilename('cOiLsTaCk', 'default', '_', false), '::sanitizeFilename() lower case can be desactivated, passing false as the 4th argument');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename('coil stack'), '::sanitizeFilename() convert a white space to a separator');
    $this->assertEquals('coil-stack', $fs->sanitizeFilename('coil stack', 'default', '-'), '::sanitizeFilename() can use a different separator as the 3rd argument');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename('coil          stack'), '::sanitizeFilename() removes successive white spaces to a single separator');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename('       coil stack'), '::sanitizeFilename() removes spaces at the beginning of the string');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename('coil   stack         '), '::sanitizeFilename() removes spaces at the end of the string');
    $this->assertEquals('coilstack', $fs->sanitizeFilename('coil,,,,,,stack'), '::sanitizeFilename() removes non-ASCII characters');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename('coil_stack  '), '::sanitizeFilename() keeps separators');
    $this->assertEquals('coil_stack', $fs->sanitizeFilename(' coil________stack'), '::sanitizeFilename() converts successive separators into a single one');
    $this->assertEquals('coil_stack.gif', $fs->sanitizeFilename('cOil Stack.GiF'), '::sanitizeFilename() lower case filename and extension');
    $this->assertEquals('copy_of_coil.stack.exe', $fs->sanitizeFilename('Copy of coil.stack.exe'), '::sanitizeFilename() keeps dots before the extension');
    $this->assertEquals('default.doc', $fs->sanitizeFilename('____________.doc'), '::sanitizeFilename() returns a default file name if filename only contains special chars');
    $this->assertEquals('default.docx', $fs->sanitizeFilename('     ___ -  --_     __%%%%__¨¨¨***____      .docx'), '::sanitizeFilename() returns a default file name if filename only contains special chars');
    $this->assertEquals('logo_edition_1314352521.jpg', $fs->sanitizeFilename('logo_edition_1314352521.jpg'), '::sanitizeFilename() returns the filename untouched if it does not need to be modified');
    $userId = rand(1, 10);
    $this->assertEquals('user_doc_'. $userId. '.doc', $fs->sanitizeFilename('亐亐亐亐亐.doc', 'user_doc_'. $userId), '::sanitizeFilename() returns the default string (the 2nd argument) if it can\'t be sanitized');
    }
}

পরীক্ষার ফলাফল: ( পিএইচপি 5.3.2 সহ উবুন্টু এবং পিএইচপি 5.3.17 সহ ম্যাকওএসএক্সে পরীক্ষা করা হয়েছে:

All tests pass:

phpunit -c app/ src/COil/Bundle/COilCoreBundle/Tests/Unit/Helper/FilesystemTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /var/www/strangebuzz.com/app/phpunit.xml.dist

.

Time: 0 seconds, Memory: 5.75Mb

OK (1 test, 17 assertions)

1
এটি বেশিরভাগ ল্যাটিন ভিত্তিক ইনপুট ধরে নেয়। আপনার কোথায় সমস্যা হবে তা দেখতে অন্যান্য ভাষা থেকে আরও UTF-8 অক্ষর যুক্ত করুন।
জিওনক্রস

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

2

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

    function sanitize($string,$force_lowercase=true) {
    //Clean up titles for filenames
    $clean = strip_tags($string);
    $clean = strtr($clean, array('Š' => 'S','Ž' => 'Z','š' => 's','ž' => 'z','Ÿ' => 'Y','À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Å' => 'A','Ç' => 'C','È' => 'E','É' => 'E','Ê' => 'E','Ë' => 'E','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I','Ñ' => 'N','Ò' => 'O','Ó' => 'O','Ô' => 'O','Õ' => 'O','Ö' => 'O','Ø' => 'O','Ù' => 'U','Ú' => 'U','Û' => 'U','Ü' => 'U','Ý' => 'Y','à' => 'a','á' => 'a','â' => 'a','ã' => 'a','ä' => 'a','å' => 'a','ç' => 'c','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e','ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ñ' => 'n','ò' => 'o','ó' => 'o','ô' => 'o','õ' => 'o','ö' => 'o','ø' => 'o','ù' => 'u','ú' => 'u','û' => 'u','ü' => 'u','ý' => 'y','ÿ' => 'y'));
    $clean = strtr($clean, array('Þ' => 'TH', 'þ' => 'th', 'Ð' => 'DH', 'ð' => 'dh', 'ß' => 'ss', 'Œ' => 'OE', 'œ' => 'oe', 'Æ' => 'AE', 'æ' => 'ae', 'µ' => 'u','—' => '-'));
    $clean = str_replace("--", "-", preg_replace("/[^a-z0-9-]/i", "", preg_replace(array('/\s/', '/[^\w-\.\-]/'), array('-', ''), $clean)));

    return ($force_lowercase) ?
        (function_exists('mb_strtolower')) ?
            mb_strtolower($clean, 'UTF-8') :
            strtolower($clean) :
        $clean;
}

অনুবাদ মশালার জন্য ম্যানুয়ালি এম ড্যাশ অক্ষর (-) যুক্ত করা দরকার। অন্যরা থাকতে পারে তবে এখনও পর্যন্ত আমার ফাইলের নামগুলি ভাল দেখাচ্ছে।

তাই:

পর্ব 1: আমার বাবার "ururburts"? - তারা (না) সেরা!

হয়ে:

পার্ট 1-আমার-পিতাকেও-zurburts-theyre নয়-সেরা

আমি কেবল ফিরে আসা স্ট্রিংয়ে ".html" যুক্ত করেছি।


1
এখনও কিছু চেক এবং স্লোভাক অক্ষর নেই:'ľ' => 'l', 'Ľ' => 'L', 'č' => 'c', 'Č' => 'C', 'ť' => 't', 'Ť' => 'T', 'ň' => 'n', 'Ň' => 'N', 'ĺ' => 'l', 'Ĺ' => 'L', 'Ř' => 'R', 'ř' => 'r', 'ě' => 'e', 'Ě' => 'E', 'ů' => 'u', 'Ů' => 'U'
জেসম ডটনেট

1
এবং সন্দেহ নেই আরও অনেক। আমি আসলে কোনও আইএসও-সেট উপস্থিত রয়েছে কিনা তা খুঁজে বের করার চেষ্টা করছি যা অক্ষরের সংমিশ্রণকে অন্তর্ভুক্ত করে। বিষয়বস্তু তাদের সমস্তের থেকে অক্ষর দাবি করলে কীভাবে একটি সেট "চয়ন" করে? ইউটিএফ -8 আমি ধরে নিচ্ছি ...
cbmtrx

আমি পিএইচপি-র একটি লাইন ব্যবহার করে যে কোনও স্ট্রিংকে কীভাবে প্রতিলিপি করতে হবে তা আমি খুঁজে পেয়েছি : $string = transliterator_transliterate('Any-Latin;Latin-ASCII;', $string);নীচে আমার উত্তরটি দেখুন বা লিঙ্কযুক্ত ব্লগ পোস্টটি পড়ুন।
জেসম ডটনেট

1
না, আপনি এটি ভুল পড়েছেন: যদি আপনি আপনার সার্ভারে (বা হোস্টিং) পিএইচপি এক্সটেনশানগুলি ইনস্টল করতে পারেন :-) পোস্টটি এখানে ।
জেসম ডটনেট

1
আহ, বুঝেছি ধন্যবাদ @ জাসমডটনেট - আমি আমার বর্তমান সমাধানটি আপাতত কাজ করছি তবে এটি একটি সীমিত চরিত্র সেট তাই এক্সটেনশনটি পরীক্ষা করে দেখার মতো।
cbmtrx

2

সমাধান # 1: আপনার সার্ভারে পিএইচপি এক্সটেনশনগুলি ইনস্টল করার ক্ষমতা রয়েছে (হোস্টিং)

"গ্রহ পৃথিবীর প্রায় প্রতিটি ভাষা" ASCII অক্ষরে অনুবাদ করার জন্য।

  1. প্রথমে পিএইচপি ইন্টেল এক্সটেনশন ইনস্টল করুন । এটি দেবিয়ান (উবুন্টু) এর জন্য আদেশ:sudo aptitude install php5-intl

  2. এটি আমার ফাইলনাম ফাংশন (টেস্ট.এফপি তৈরি করুন এবং নীচের কোডটিতে এখানে পেস্ট করুন):

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<?php

function pr($string) {
  print '<hr>';
  print '"' . fileName($string) . '"';
  print '<br>';
  print '"' . $string . '"';
}

function fileName($string) {
  // remove html tags
  $clean = strip_tags($string);
  // transliterate
  $clean = transliterator_transliterate('Any-Latin;Latin-ASCII;', $clean);
  // remove non-number and non-letter characters
  $clean = str_replace('--', '-', preg_replace('/[^a-z0-9-\_]/i', '', preg_replace(array(
    '/\s/', 
    '/[^\w-\.\-]/'
  ), array(
    '_', 
    ''
  ), $clean)));
  // replace '-' for '_'
  $clean = strtr($clean, array(
    '-' => '_'
  ));
  // remove double '__'
  $positionInString = stripos($clean, '__');
  while ($positionInString !== false) {
    $clean = str_replace('__', '_', $clean);
    $positionInString = stripos($clean, '__');
  }
  // remove '_' from the end and beginning of the string
  $clean = rtrim(ltrim($clean, '_'), '_');
  // lowercase the string
  return strtolower($clean);
}
pr('_replace(\'~&([a-z]{1,2})(ac134/56f4315981743 8765475[]lt7ňl2ú5äňú138yé73ťž7ýľute|');
pr(htmlspecialchars('<script>alert(\'hacked\')</script>'));
pr('Álix----_Ãxel!?!?');
pr('áéíóúÁÉÍÓÚ');
pr('üÿÄËÏÖÜ.ŸåÅ');
pr('nie4č a a§ôňäääaš');
pr('Мао Цзэдун');
pr('毛泽东');
pr('ماو تسي تونغ');
pr('مائو تسه‌تونگ');
pr('מאו דזה-דונג');
pr('მაო ძედუნი');
pr('Mao Trạch Đông');
pr('毛澤東');
pr('เหมา เจ๋อตง');
?>
</body>
</html>

এই লাইনটি মূল:

  // transliterate
  $clean = transliterator_transliterate('Any-Latin;Latin-ASCII;', $clean);

এই পোস্টের উপর ভিত্তি করে উত্তর ।

সমাধান # 2: আপনার সার্ভারে পিএইচপি এক্সটেনশনগুলি ইনস্টল করার ক্ষমতা নেই (হোস্টিং)

এখানে চিত্র বর্ণনা লিখুন

সিএমএস দ্রুপালের জন্য লিপ্যন্তর মডিউলটিতে খুব ভাল কাজ করা হয় । এটি পৃথিবী গ্রহের প্রায় প্রতিটি ভাষা সমর্থন করে। আপনি যদি সত্যিই সম্পূর্ণ সমাধান স্যানিটাইজিং স্ট্রিং পেতে চান তবে আমি প্লাগইন সংগ্রহস্থল চেক করার পরামর্শ দিচ্ছি ।



1

এটি একটি ভাল ফাংশন:

public function getFriendlyURL($string) {
    setlocale(LC_CTYPE, 'en_US.UTF8');
    $string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
    $string = preg_replace('~[^\-\pL\pN\s]+~u', '-', $string);
    $string = str_replace(' ', '-', $string);
    $string = trim($string, "-");
    $string = strtolower($string);
    return $string;
} 

এটি দেখতে খারাপ লাগছে। \\s+একটি ব্যাকস্ল্যাশ এর অর্থ এক বা একাধিক সাদা স্থান। ঐটা কিসের সম্পর্কে? এছাড়াও, এটি ন CMDਾਲ, বা এর মতো বিষয়গুলি উপেক্ষা করে শ্বেত তালিকাভুক্ত করার পরিবর্তে কালো তালিকাভুক্ত ব্যবহার করে BEL
জিওনক্রস

এখনও খারাপ. এখন যেমন স্ট্রিং /blog/2014-02/just-in-timeঅনুমোদিত নয়। উপরে পরীক্ষিত কোড ব্যবহার করুন বা phunctionপিএইচপি ফ্রেমওয়ার্ক কোড ব্যবহার করুন ।
জিওনক্রস

সেটা ঠিক. এই ফাংশনটি কেবলমাত্র "ইন-টাইম" অংশের জন্য। কিছু মানুষের জন্য দরকারী হতে পারে।
joan16v

1
আপনি রেজেক্স পরিবর্তন করতে পারেনpreg_replace('~[^\-\pL\pN\s]+~u', '-', $string)
Xeoncross

অসাধারণ! আমি আরও যোগ করেছি: স্ট্রিং = ট্রিম ($ স্ট্রিং, "-");
joan16v

0

এটি ইউআরএলগুলি স্যানিটাইজ করার জন্য প্রেস্টাশপের ব্যবহৃত কোড:

replaceAccentedChars

দ্বারা ব্যবহৃত হয়

str2url

ডায়াক্রিটিক্স অপসারণ করতে

function replaceAccentedChars($str)
{
    $patterns = array(
        /* Lowercase */
        '/[\x{0105}\x{00E0}\x{00E1}\x{00E2}\x{00E3}\x{00E4}\x{00E5}]/u',
        '/[\x{00E7}\x{010D}\x{0107}]/u',
        '/[\x{010F}]/u',
        '/[\x{00E8}\x{00E9}\x{00EA}\x{00EB}\x{011B}\x{0119}]/u',
        '/[\x{00EC}\x{00ED}\x{00EE}\x{00EF}]/u',
        '/[\x{0142}\x{013E}\x{013A}]/u',
        '/[\x{00F1}\x{0148}]/u',
        '/[\x{00F2}\x{00F3}\x{00F4}\x{00F5}\x{00F6}\x{00F8}]/u',
        '/[\x{0159}\x{0155}]/u',
        '/[\x{015B}\x{0161}]/u',
        '/[\x{00DF}]/u',
        '/[\x{0165}]/u',
        '/[\x{00F9}\x{00FA}\x{00FB}\x{00FC}\x{016F}]/u',
        '/[\x{00FD}\x{00FF}]/u',
        '/[\x{017C}\x{017A}\x{017E}]/u',
        '/[\x{00E6}]/u',
        '/[\x{0153}]/u',

        /* Uppercase */
        '/[\x{0104}\x{00C0}\x{00C1}\x{00C2}\x{00C3}\x{00C4}\x{00C5}]/u',
        '/[\x{00C7}\x{010C}\x{0106}]/u',
        '/[\x{010E}]/u',
        '/[\x{00C8}\x{00C9}\x{00CA}\x{00CB}\x{011A}\x{0118}]/u',
        '/[\x{0141}\x{013D}\x{0139}]/u',
        '/[\x{00D1}\x{0147}]/u',
        '/[\x{00D3}]/u',
        '/[\x{0158}\x{0154}]/u',
        '/[\x{015A}\x{0160}]/u',
        '/[\x{0164}]/u',
        '/[\x{00D9}\x{00DA}\x{00DB}\x{00DC}\x{016E}]/u',
        '/[\x{017B}\x{0179}\x{017D}]/u',
        '/[\x{00C6}]/u',
        '/[\x{0152}]/u');

    $replacements = array(
            'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe',
            'A', 'C', 'D', 'E', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'Z', 'AE', 'OE'
        );

    return preg_replace($patterns, $replacements, $str);
}

function str2url($str)
{
    if (function_exists('mb_strtolower'))
        $str = mb_strtolower($str, 'utf-8');

    $str = trim($str);
    if (!function_exists('mb_strtolower'))
        $str = replaceAccentedChars($str);

    // Remove all non-whitelist chars.
    $str = preg_replace('/[^a-zA-Z0-9\s\'\:\/\[\]-\pL]/u', '', $str);
    $str = preg_replace('/[\s\'\:\/\[\]-]+/', ' ', $str);
    $str = str_replace(array(' ', '/'), '-', $str);

    // If it was not possible to lowercase the string with mb_strtolower, we do it after the transformations.
    // This way we lose fewer special chars.
    if (!function_exists('mb_strtolower'))
        $str = strtolower($str);

    return $str;
}


-4
// CLEAN ILLEGAL CHARACTERS
function clean_filename($source_file)
{
    $search[] = " ";
    $search[] = "&";
    $search[] = "$";
    $search[] = ",";
    $search[] = "!";
    $search[] = "@";
    $search[] = "#";
    $search[] = "^";
    $search[] = "(";
    $search[] = ")";
    $search[] = "+";
    $search[] = "=";
    $search[] = "[";
    $search[] = "]";

    $replace[] = "_";
    $replace[] = "and";
    $replace[] = "S";
    $replace[] = "_";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";
    $replace[] = "";

    return str_replace($search,$replace,$source_file);

} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.