Untrusted Input থেকে RegExp তৈরি করার সময় নিরাপত্তা ব্যবস্থা

RegExp এর Security Considerations - জাভাস্ক্রিপ্ট রেগএক্সপি (Javascript RegExp) - Web Development

265

RegExp (Regular Expressions) হলো অত্যন্ত শক্তিশালী টুল, তবে untrusted input থেকে RegExp তৈরি করার সময় এটি নিরাপত্তা ঝুঁকি সৃষ্টি করতে পারে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি ব্যবহারকারীর ইনপুট থেকে RegExp তৈরি করছেন, কারণ এতে ReDoS (Regular Expression Denial of Service) অ্যাটাক হতে পারে।

এটি একটি আক্রমণ যা catastrophic backtracking এর ফলে RegExp-এর কার্যক্ষমতা নষ্ট করতে পারে, যাতে সার্ভার বা অ্যাপ্লিকেশন ধীর হয়ে যায় বা সম্পূর্ণরূপে ক্র্যাশ হয়ে যায়।


ReDoS (Regular Expression Denial of Service)

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

Backtracking তখন ঘটে যখন RegExp বিভিন্ন সম্ভাব্য মেলানোর জন্য নিজেকে পুনরায় চেষ্টা করে। যদি প্যাটার্ন জটিল হয় এবং ইনপুট খুব বড় হয়, তবে এটি অনেক সময় নিয়ে পরীক্ষা চালাতে পারে, যা Denial of Service (DoS) ঘটাতে পারে।


নিরাপত্তা ঝুঁকি কমানোর কৌশল

  1. Input Validation এবং Sanitization: ব্যবহারকারীর ইনপুট প্রক্রিয়াকরণের আগে তার সঠিকতা যাচাই করা এবং অপরিষ্কার ইনপুট পরিস্কার করা অত্যন্ত গুরুত্বপূর্ণ। এটি ব্যবহারকারীকে RegExp এর মাধ্যমে সরাসরি ইনপুট দেওয়ার জন্য অনুমতি না দেওয়ার একটি উপায়।

    উদাহরণ:

    function sanitizeInput(input) {
        // ব্যবহারকারীর ইনপুটে অযাচিত চরিত্র থাকা থেকে বিরত রাখুন
        return input.replace(/[^\w\s]/g, '');  // শুধু অক্ষর এবং সংখ্যা রাখবে
    }
    
  2. RegExp Timeout ব্যবহার করা: JavaScript RegExp এ সরাসরি টাইমআউট ফিচার নেই, তবে আপনি টাইমআউট ফিচার প্রয়োগ করার জন্য অ্যাপ্লিকেশন স্তরে কিছু কৌশল গ্রহণ করতে পারেন। উদাহরণস্বরূপ, একটি RegExp পরীক্ষা করার আগে setTimeout ব্যবহার করে এটি একটি নির্দিষ্ট সময়ের মধ্যে শেষ হবে এমন ব্যবস্থা করা।

    উদাহরণ:

    function testRegexWithTimeout(regex, str, timeout) {
        return new Promise((resolve, reject) => {
            const timer = setTimeout(() => reject('RegExp Timeout'), timeout);
            try {
                if (regex.test(str)) {
                    clearTimeout(timer);
                    resolve(true);
                } else {
                    clearTimeout(timer);
                    resolve(false);
                }
            } catch (error) {
                clearTimeout(timer);
                reject(error);
            }
        });
    }
    
  3. Avoid Untrusted Input in RegExp Construction: ব্যবহারকারীর ইনপুট থেকে সরাসরি RegExp তৈরি করার সময় খুব সতর্ক থাকতে হবে। একে RegExp constructor এর মাধ্যমে তৈরি করার পরিবর্তে, literal প্যাটার্ন ব্যবহারে নিরাপত্তা বাড়ানো যায়। RegExp constructor ব্যবহার করলে ইনপুটটি সরাসরি একটি প্যাটার্ন হিসেবে পরিণত হয়, যা আক্রমণকারীর জন্য ঝুঁকি সৃষ্টি করতে পারে।

    উদাহরণ:

    // Unsafe way: directly creating RegExp with user input
    let userInput = "(.*)";  // user input
    let regex = new RegExp(userInput);  // This can lead to ReDoS attack
    
    // Safer way: sanitize input first
    let sanitizedInput = userInput.replace(/[^\w\s]/g, '');  // Remove special characters
    let safeRegex = new RegExp(sanitizedInput);  // Now it's safer
    
  4. Limit User Input Length: Input length নিয়ন্ত্রণ করা অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন ইনপুট থেকে RegExp তৈরি করা হয়। খুব বড় ইনপুট RegExp মেলানোর জন্য ব্যাকট্র্যাকিং বাড়াতে পারে, যা পারফরম্যান্সের সমস্যা সৃষ্টি করতে পারে। ইনপুটের আকার সীমিত করা এই ঝুঁকি কমাতে সাহায্য করবে।

    উদাহরণ:

    function validateInputLength(input) {
        if (input.length > 100) {  // Max input length of 100
            throw new Error("Input too long");
        }
        return input;
    }
    
  5. Use RegExp Libraries with Safety in Mind: ReDoS আক্রমণ থেকে সুরক্ষিত থাকার জন্য কিছু RegExp লাইব্রেরি ব্যবহার করা যেতে পারে যা স্বয়ংক্রিয়ভাবে নিরাপত্তা ব্যবস্থা অন্তর্ভুক্ত করে। যেমন, safe-regex বা re2 লাইব্রেরি, যা অধিকাংশ জটিল প্যাটার্নের জন্য সুরক্ষিত RegExp তৈরি করে।

    safe-regex লাইব্রেরি উদাহরণ:

    const safeRegex = require('safe-regex');
    let regexPattern = "(a|b|c)*";
    if (safeRegex(regexPattern)) {
        let regex = new RegExp(regexPattern);
        // Use regex safely
    } else {
        console.log("Unsafe regex detected");
    }
    
  6. Pre-compile Regular Expressions: একটি RegExp প্যাটার্ন যেটি অনেকবার ব্যবহৃত হয়, সেটি বারবার কম্পাইল না করে একবারে কম্পাইল করুন এবং তারপর এটি পুনঃব্যবহার করুন। এটি আপনাকে একই প্যাটার্ন বারবার তৈরি করার প্রয়োজন থেকে মুক্তি দেয়, ফলে কর্মক্ষমতা বৃদ্ধি পায়।
  7. Avoid Complex Patterns: খুব জটিল RegExp প্যাটার্ন এড়িয়ে চলুন, কারণ এগুলি দ্রুত backtracking তৈরি করতে পারে, যা পারফরম্যান্সকে ধীর করে দিতে পারে। সোজা প্যাটার্নগুলি এবং lazy quantifiers ব্যবহার করা উচিত।

সারাংশ

Untrusted input থেকে RegExp তৈরি করার সময় সুরক্ষা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ। নিরাপত্তা ঝুঁকি কমানোর জন্য input validation, input sanitization, RegExp timeout, এবং safe RegExp libraries ব্যবহার করা উচিত। ReDoS আক্রমণ থেকে প্রতিরোধের জন্য, ব্যবহারকারীর ইনপুটের আকার সীমিত করা, জটিল প্যাটার্ন ব্যবহার এড়ানো এবং নিরাপদ RegExp তৈরি করার জন্য literal patterns ব্যবহার করা উচিত। RegExp-এর শক্তিশালী ব্যবহারিক ক্ষমতা থাকা সত্ত্বেও, এটি সঠিকভাবে ব্যবহার না করলে আপনার অ্যাপ্লিকেশন বা সার্ভারে নিরাপত্তা ঝুঁকি সৃষ্টি করতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...