Comment

PHP প্রসেসিং ফর্ম (Processing Forms)

PHP স্যানিটাইজ ইনপুট (Sanitize input)

Estimated reading: 3 minutes 10 views Contributors

সারাংশ: এই টিউটোরিয়ালে, আপনি ইনপুট স্যানিটাইজ করার জন্য একটি পুনঃব্যবহারযোগ্য PHP স্যানিটাইজ() ফাংশন বিকাশ করতে শিখবেন।

ইনপুট স্যানিটাইজেশনের ভূমিকা

অবিশ্বস্ত উৎস থেকে প্রাপ্ত ডেটা প্রসেস করার আগে স্যানিটাইজেশন অপরিহার্য।

HTTP পোস্ট বা GET রিকোয়েস্ট এর মতো অবিশ্বস্ত উৎস থেকে আসা ডেটা প্রসেস করার আগে, অবশ্যই সেটিকে ভালোভাবে স্যানিটাইজ করতে হবে। স্যানিটাইজেশন বলতে বোঝায় অবৈধ অক্ষর মুছে ফেলা, প্রতিস্থাপন, এনকোডিং বা এস্কেপিং কৌশল ব্যবহার করে ডেটা পরিষ্কার করা। এটি নিরাপত্তার জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ক্ষতিকারক কোড ইনজেকশন বা অন্যান্য আক্রমণ প্রতিরোধ করতে সহায়তা করে।

PHP-তে স্যানিটাইজেশন ফিল্টার

PHP ডেটা স্যানিটাইজ করার জন্য কার্যকর ফিল্টার সরবরাহ করে। এর মধ্যে রয়েছে:

  • filter_input()
  • filter_var()
  • filter_input_array()
  • filter_var_array()

একটি পুনঃব্যবহারযোগ্য sanitize() ফাংশন তৈরি করা

ডেটা স্যানিটাইজ করার প্রক্রিয়া সহজ করার জন্য, আমরা একটি পুনঃব্যবহারযোগ্য sanitize() ফাংশন তৈরি করতে পারি। এই ফাংশনটি নিম্নলিখিত ধাপগুলি অনুসরণ করে:

  1. ইনপুট ডেটা এবং নিয়ম গ্রহণ করা: ফাংশনটি দুটি প্যারামিটার গ্রহণ করে:
    • $inputs: একটি অ্যাসোসিয়েটিভ অ্যারে যা স্যানিটাইজ করার জন্য ডেটা ধারণ করে। এটি $_POST, $_GET, বা অন্য কোনো অ্যাসোসিয়েটিভ অ্যারে হতে পারে।
    • $fields: একটি অ্যারে যা প্রতিটি ফিল্ডের জন্য নিয়ম নির্দিষ্ট করে।
  2. ফিল্টার প্রয়োগ করা: ফাংশনটি প্রতিটি ফিল্ডের জন্য প্রযোজ্য ফিল্টার নির্ধারণ করে এবং সেই ফিল্টারগুলি ব্যবহার করে ডেটা স্যানিটাইজ করে।
  3. স্যানিটাইজ করা ডেটা ফেরত দেওয়া: ফাংশনটি স্যানিটাইজ করা ডেটা ধারণকারী একটি অ্যারে ফেরত দেয়।

sanitize() ফাংশনের ব্যবহার

ধরুন আপনার $_POST ভেরিয়েবলে নিম্নলিখিত ফিল্ড রয়েছে এবং আপনি সেগুলি স্যানিটাইজ করতে চান:

  • নাম (name)
  • ইমেইল (email)
  • বয়স (age)
  • ওজন (weight)
  • হোমপেজ (homepage)

আপনি নিম্নলিখিত কোড ব্যবহার করে এটি করতে পারেন:

PHP

$data = sanitize($_POST, $fields);

$fields অ্যারে:

$fields অ্যারেটি একটি অ্যাসোসিয়েটিভ অ্যারে হওয়া উচিত যেখানে কী হল ফিল্ডের নাম এবং মান হল সেই ফিল্ডের জন্য প্রযোজ্য নিয়ম। উদাহরণ স্বরূপ:

PHP

$fields = [
    'name' => 'string',
    'email' => 'email',
    'age' => 'int',
    'weight' => 'float',
    'github' => 'url',
    'hobbies' => 'string[]'
];

উল্লেখ্য যে string[] অর্থ স্ট্রিংয়ের একটি অ্যারে।

এই ক্ষেত্রগুলি স্যানিটাইজ করার জন্য:

প্রথমে, $fields এর উপর পুনরাবৃত্তি করুন এবং প্রতিটির জন্য সংশ্লিষ্ট ফিল্টার ব্যবহার করুন। উদাহরণস্বরূপ, যদি নিয়মটি “string” হয়, ফিল্টারটি FILTER_SANITIZE_STRING হবে। দ্বিতীয়ত, ফিল্টার ব্যবহার করে ক্ষেত্রটি স্যানিটাইজ করুন।

একটি ফিল্ডের নিয়মের উপর ভিত্তি করে একটি ফিল্টার পেতে, আপনি ফিল্টারগুলির সাথে নিয়মগুলির মধ্যে একটি ম্যাপিং সংজ্ঞায়িত করতে পারেন এইভাবে:

PHP

const FILTERS = [
    'string' => FILTER_SANITIZE_STRING,
    'string[]' => [
        'filter' => FILTER_SANITIZE_STRING,
        'flags' => FILTER_REQUIRE_ARRAY
    ],
    'email' => FILTER_SANITIZE_EMAIL,
    'int' => [
        'filter' => FILTER_SANITIZE_NUMBER_INT,
        'flags' => FILTER_REQUIRE_SCALAR
    ],
    'int[]' => [
        'filter' => FILTER_SANITIZE_NUMBER_INT,
        'flags' => FILTER_REQUIRE_ARRAY
    ],
    'float' => [
        'filter' => FILTER_SANITIZE_NUMBER_FLOAT,
        'flags' => FILTER_FLAG_ALLOW_FRACTION
    ],
    'float[]' => [
        'filter' => FILTER_SANITIZE_NUMBER_FLOAT,
        'flags' => FILTER_REQUIRE_ARRAY
    ],
    'url' => FILTER_SANITIZE_URL,
];

উদাহরণস্বরূপ, নিম্নলিখিতটি “string” নিয়মের ফিল্টারটি প্রদান করে:

PHP

FILTERS['string']

একসাথে একাধিক ক্ষেত্র স্যানিটাইজ করার জন্য, আপনি filter_var_array() ফাংশনটি ব্যবহার করতে পারেন:

PHP

filter_var_array($inputs, $options)

filter_var_array() ফাংশনের প্রথম প্যারামিটার হল ফিল্টার করার জন্য ভেরিয়েবলের একটি অ্যারে। এবং দ্বিতীয় প্যারামিটার হল ফিল্টারের একটি অ্যারে। উদাহরণস্বরূপ, এটি দেখতে এইরকম হওয়া উচিত:

PHP

$options = [
    'name' => FILTER_SANITIZE_STRING,
    'email' => FILTER_SANITIZE_EMAIL,
    'age' => [
        'filter' => FILTER_SANITIZE_NUMBER_INT,
        'flags' => FILTER_REQUIRE_SCALAR
    ],
    'weight' => [
        'filter' => FILTER_SANITIZE_NUMBER_FLOAT,
        'flags' => FILTER_FLAG_ALLOW_FRACTION
    ],
    'github' => FILTER_SANITIZE_URL,
];

সুতরাং আপনাকে $fields এবং FILTERS অ্যারে থেকে এই $options প্রদান করতে হবে। এটি করার জন্য, আপনি array_map() ফাংশনটি এইভাবে ব্যবহার করতে পারেন:

PHP

$options = array_map(fn($field) => FILTERS[$field], $fields);

sanitize() ফাংশনকে আরও নমনীয় করা

sanitize() ফাংশনটি FILTERS কনস্ট্যান্ট ব্যবহার করে। এটিকে আরও নমনীয় করার জন্য, আপনি একটি প্যারামিটার যোগ করতে পারেন এবং এর ডিফল্ট মান FILTERS কনস্ট্যান্টে সেট করতে পারেন যেমন:

PHP

function sanitize(array $inputs, array $fields, array $filters = FILTERS): array
{
    $options = array_map(fn($field) => $filters[$field], $fields);
    return filter_var_array($inputs, $options);
}

এছাড়াও, আপনি $inputs এর মধ্যে থাকা ফিল্ডগুলিকে একটি ফিল্টার ব্যবহার করে স্যানিটাইজ করতে চাইতে পারেন, যেমন FILTER_SANITIZE_STRING।

এটি করতে, আপনি নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করতে পারেন:

  1. $fields প্যারামিটারকে ঐচ্ছিক করুন এবং এর ডিফল্ট মান একটি খালি অ্যারে [] এ সেট করুন।
  2. একটি ডিফল্ট ফিল্টার প্যারামিটার যোগ করুন।
  3. যদি $filters অ্যারেটি খালি থাকে, তাহলে ডিফল্ট ফিল্টারটি ব্যবহার করুন।

sanitize() ফাংশনটি তখন নিম্নরূপ দেখাবে:

PHP

function sanitize(array $inputs, array $fields = [], int $default_filter = FILTER_SANITIZE_STRING, array $filters = FILTERS): array
{
    if ($fields) {
        $options = array_map(fn($field) => $filters[$field], $fields);
        return filter_var_array($inputs, $options);
    }

    return filter_var_array($inputs, $default_filter);
}

স্ট্রিং থেকে ফাঁকা স্থান মুছে ফেলা

একটি স্ট্রিং-এর ফাঁকা স্থানগুলি মুছে ফেলার জন্য, আপনি trim() ফাংশন ব্যবহার করেন। এবং স্ট্রিংগুলির একটি অ্যারের ফাঁকা স্থানগুলি মুছে ফেলার জন্য, আপনি trim() ফাংশনের সাথে array_map() ফাংশন ব্যবহার করেন:

PHP

$trimmed_data = array_map('trim', $inputs);

তবে, $inputs-এ এমন আইটেম থাকতে পারে যা স্ট্রিং নয়। শুধুমাত্র স্ট্রিং আইটেমটি ট্রিম করার জন্য, আপনি ট্রিম করার আগে আইটেমটি একটি স্ট্রিং কিনা তা পরীক্ষা করতে is_string() ফাংশন ব্যবহার করতে পারেন:

PHP

$trimmed_data = array_map(function ($item) {
    if (is_string($item)) {
        return trim($item);
    }
    return $item;
}, $inputs);

$inputs-এ এমন একটি আইটেম থাকতে পারে যা স্ট্রিংগুলির একটি অ্যারে। উদাহরণ স্বরূপ:

PHP

$inputs = [
    ...
    'hobbies' => [
        ' Reading',
        'Running ',
        ' Programming '
    ]
]

hobbies আইটেমের স্ট্রিংগুলি ট্রিম করতে, আপনাকে একটি Recursive ফাংশন ব্যবহার করতে হবে:

PHP

function array_trim(array $items): array
{
    return array_map(function ($item) {
        if (is_string($item)) {
            return trim($item);
        } elseif (is_array($item)) {
            return array_trim($item);
        } else {
            return $item;
        }
    }, $items);
}

sanitize() ফাংশন থেকে array_trim() কল করা

sanitize() ফাংশন থেকে array_trim() ফাংশন কল করতে:

  1. sanitize() ফাংশনে $trim নামে একটি নতুন প্যারামিটার যোগ করুন এবং এর ডিফল্ট মান true সেট করুন।
  2. $trim প্যারামিটার true হলে array_trim() কল করুন।

নিম্নলিখিত আপডেট করা sanitize() ফাংশন দেখায়:

PHP

function sanitize(array $inputs, array $fields = [], int $default_filter = FILTER_SANITIZE_STRING, array $filters = FILTERS, bool $trim = true): array
{
    if ($fields) {
        $options = array_map(fn($field) => $filters[$field], $fields);
        $data = filter_var_array($inputs, $options);
    } else {
        $data = filter_var_array($inputs, $default_filter);
    }

    return $trim ? array_trim($data) : $data;
}

sanitize() ফাংশন ব্যবহার করুন

নিম্নলিখিতটি $fields-এ নির্দিষ্ট স্যানিটাইজেশন নিয়মগুলি ব্যবহার করে $input-এ ডেটা স্যানিটাইজ করতে sanitize() ফাংশনটি কীভাবে ব্যবহার করা যায় তা দেখায়:

PHP

<?php

require __DIR__ . '/sanitization.php';

$inputs = [
    'name' => 'joe<script>',
    'email' => 'joe@example.com</>',
    'age' => '18abc',
    'weight' => '100.12lb',
    'github' => 'https://github.com/joe',
    'hobbies' => [
        ' Reading',
        'Running ',
        ' Programming '
    ]
];

$fields = [
    'name' => 'string',
    'email' => 'email',
    'age' => 'int',
    'weight' => 'float',
    'github' => 'url',
    'hobbies' => 'string[]'
];

$data = sanitize($inputs, $fields);

var_dump($data);

আউটপুট:

Array
(
    [name] => joe
    [email] => joe@example.com
    [age] => 18
    [weight] => 100.12
    [github] => https://github.com/joe
    [hobbies] => Array
        (
            [0] => Reading
            [1] => Running
            [2] => Programming
        )

)

এই টিউটোরিয়ালে, আপনি কীভাবে স্ক্র্যাচ থেকে একটি পুনঃব্যবহারযোগ্য PHP sanitize() ফাংশন তৈরি করতে হয় তা শিখেছেন।

Leave a Comment

Share this Doc

PHP স্যানিটাইজ ইনপুট (Sanitize input)

Or copy link

CONTENTS

Subscribe

×
Cancel