আমি কীভাবে পিএইচপি দিয়ে ব্যবহারকারী ইনপুট স্যানিটাইজ করতে পারি?


1124

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


42
আজকাল, এসকিএল ইঞ্জেকশন এড়ানোর জন্য, পিডিও বা মাইএসকিউএলি ব্যবহার করুন।
ফ্রান্সিসকো প্রেজেনসিয়া

76
PDO বা MySQLi ব্যবহার করা যথেষ্ট নয়। যদি আপনি আপনার এসকিউএল স্টেটমেন্টগুলি অবিশ্বস্ত ডেটা, যেমন পছন্দ select * from users where name='$name'করেন তবে আপনি পিডিও বা মাইএসকিউএল বা মাইএসকিউএল ব্যবহার করেন তা বিবেচনা করে না। আপনি এখনও বিপদে রয়েছেন। আপনাকে অবশ্যই প্যারামিট্রাইজড ক্যোয়ারী ব্যবহার করতে হবে বা যদি আপনার অবশ্যই প্রয়োজন হয় তবে আপনার ডেটাতে পলায়ন প্রক্রিয়াটি ব্যবহার করা উচিত তবে এটি অনেক কম ভাল।
অ্যান্ডি লেস্টার

26
@ অ্যান্ডিলেস্টার আপনি কি বোঝাচ্ছেন যে কেউ প্রস্তুত বিবৃতি ছাড়াই পিডিও ব্যবহার করেন? :)

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

30
অ্যান্ডির মন্তব্য সম্পূর্ণ বৈধ। আমি সম্প্রতি আমার মাইএসকিএল ওয়েবসাইটটিকে পিডিওতে রূপান্তর করে ভেবেছিলাম যে আমি এখন কোনওভাবে ইনজেকশন আক্রমণ থেকে নিরাপদ। এটি কেবল প্রক্রিয়া চলাকালীনই বুঝতে পেরেছিলাম যে আমার কিছু বর্ধিত বিবৃতি এখনও ব্যবহারকারী ইনপুট ব্যবহার করে নির্মিত হয়েছিল। আমি তখন প্রস্তুত বিবৃতি ব্যবহার করে এটি স্থির করেছি। একটি সম্পূর্ণ নবজাতকের কাছে, এটি সম্পূর্ণরূপে পরিষ্কার নয় যে অনেকগুলি পিডিও ব্যবহার সম্পর্কে মন্তব্যটি ছুঁড়ে দেওয়ার মতো পার্থক্য রয়েছে তবে প্রস্তুত বিবৃতিগুলির প্রয়োজনীয়তা নির্দিষ্ট করে না। ধারণাটি হ'ল এটি সুস্পষ্ট। তবে কোনও নবজাতকের কাছে নয়।
ঘোস্টাইডার

উত্তর:


1183

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

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

আর একটি উদাহরণ এইচটিএমএল: আপনি যদি এইচটিএমএল মার্কআপের মধ্যে স্ট্রিংগুলি এম্বেড করেন তবে আপনাকে অবশ্যই এটির সাথে পালাতে হবে htmlspecialchars। এর অর্থ প্রতিটি একক echoবা printবিবৃতি ব্যবহার করা উচিত htmlspecialchars

তৃতীয় উদাহরণ শেল কমান্ডগুলির হতে পারে: আপনি যদি বাহ্যিক কমান্ডগুলিতে স্ট্রিংগুলি (যেমন যুক্তিগুলি) এম্বেড করতে চলেছেন এবং সেগুলি দিয়ে কল করেন exec, তবে আপনাকে অবশ্যই ব্যবহার করতে হবে escapeshellcmdএবং escapeshellarg

এবং তাই এবং তাই ঘোষণা ...

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


245
"এর অর্থ প্রতিটি প্রতিধ্বনি বা মুদ্রণ বিবৃতিতে এইচটিএমএল স্পেশালচার্স ব্যবহার করা উচিত" - অবশ্যই আপনার অর্থ "প্রতিটি ... বিবৃতি ব্যবহারকারী ইনপুট আউটপুটিং"; এইচটিএমএল স্পেশালচার্স () - আইফিং "ইকো 'হ্যালো, ওয়ার্ল্ড!';" পাগল হবে;)
ববি জ্যাক

10
ফিল্টারিংয়ের সঠিক সমাধান হ'ল এমন একটি মামলা রয়েছে যা ইউটিএফ -8। আপনি আপনার অ্যাপ্লিকেশন জুড়ে অবৈধ ইউটিএফ -8 সিকোয়েন্সগুলি চান না (কোডের উপর নির্ভর করে আপনি পৃথক ত্রুটি পুনরুদ্ধার পেতে পারেন) এবং ইউটিএফ -8 সহজেই ফিল্টার করা (বা প্রত্যাখ্যাত) হতে পারে।
কর্নেল

6
@ জাইবার্ড - না, LIKE একটি বিশেষায়িত regexp ভাষা ব্যবহার করে। আপনাকে আপনার ইনপুট স্ট্রিংটি দুবার পালাতে হবে - একবার রেজিপ্স্পের জন্য এবং একবার মাইএসকিএল স্ট্রিং এনকোডিংয়ের জন্য। এটি কোডের মধ্যে কোডের মধ্যে কোড।
troelskn

6
এই মুহুর্তে mysql_real_escape_stringহ্রাস করা হয়। এসকিউএল ইঞ্জেকশন প্রতিরোধে প্রস্তুত বিবৃতি ব্যবহার করা আজকাল এটি ভাল অনুশীলন হিসাবে বিবেচিত । সুতরাং মাইএসকিউএলই বা পিডিওতে স্যুইচ করুন।
মার্সেল কোরপেল

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

217

ইনপুট ডেটা স্যানিটাইজ করে এসকিউএল ইঞ্জেকশনটি আটকাতে চেষ্টা করবেন না।

পরিবর্তে, আপনার এসকিউএল কোড তৈরি করতে ডেটা ব্যবহার করার অনুমতি দেবেন না । প্রস্তুত বিবৃতি (যেমন টেমপ্লেট ক্যোয়ারীতে প্যারামিটার ব্যবহার করে) ব্যবহার করুন যা সীমাবদ্ধ ভেরিয়েবল ব্যবহার করে। এসকিউএল ইঞ্জেকশনের বিরুদ্ধে গ্যারান্টিযুক্ত হওয়ার একমাত্র উপায়।

এসকিউএল ইঞ্জেকশন প্রতিরোধ সম্পর্কে আরও তথ্যের জন্য দয়া করে আমার ওয়েবসাইট http://bobi-tables.com/ দেখুন।


18
অথবা অফিসিয়াল ডকুমেন্টেশন দেখুন এবং PDO এবং প্রস্তুত বিবৃতি শিখুন। ক্ষুদ্রতর শেখার বক্ররেখা, তবে আপনি যদি এসকিউএলকে বেশ ভাল জানেন তবে আপনাকে মানিয়ে নিতে কোনও সমস্যা হবে না।
একটি কোডার

2
এসকিউএল ইনজেকশন নির্দিষ্ট ক্ষেত্রে জন্য এই সঠিক উত্তর!
স্কট আর্কিসজেউস্কি

4
নোট করুন যে প্রস্তুত বিবৃতিগুলি কোনও সুরক্ষা যোগ করে না, প্যারামিটারাইজড কোয়েরিগুলি করে। এগুলি কেবল পিএইচপি-তে একসাথে ব্যবহার করা খুব সহজ হবে।
মৌলিক

এটি একমাত্র গ্যারান্টিযুক্ত উপায় নয়। প্রশ্নটিতে ইনপুট এবং আনহেক্সও প্রতিরোধ করবে। এছাড়াও যদি আপনি সঠিকভাবে হেক্সিং ব্যবহার করেন তবে হেক্স অ্যাটাক সম্ভব নয়।
রামন বক্কার

আপনি যদি ইমেল ঠিকানা বা ব্যবহারকারীর নাম জাতীয় কোনও বিশেষ কিছু ইনপুট করে থাকেন?
আব্রাহাম ব্রুকস

78

না। আপনি যা যা করছেন তার কোনও প্রসঙ্গ ছাড়াই জেনারালি ডেটা ফিল্টার করতে পারবেন না। কখনও কখনও আপনি এসকিউএল কোয়েরি ইনপুট হিসাবে নিতে চান এবং কখনও কখনও আপনি ইনপুট হিসাবে এইচটিএমএল নিতে চাইবেন।

একটি শ্বেতলিস্টে আপনাকে ইনপুট ফিল্টার করতে হবে - নিশ্চিত করুন যে ডেটাটি আপনার প্রত্যাশার কিছু স্পেসিফিকেশনের সাথে মেলে। তারপরে আপনি এটি যে প্রসঙ্গে ব্যবহার করছেন তা নির্ভর করে আপনি এটি ব্যবহার করার আগে এড়াতে হবে।

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


52

পিএইচপি-তে এখন নতুন দুর্দান্ত ফিল্টার_ইনপুট ফাংশন রয়েছে, উদাহরণস্বরূপ এখন আপনাকে 'চূড়ান্ত ই-মেইল রিজেক্স' সন্ধান থেকে মুক্তি দেবে যেখানে একটি বিল্ট-ইন FILTER_VALIDATE_EMAIL টাইপ রয়েছে

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

/**
 *  Pork.FormValidator
 *  Validates arrays or properties by setting up simple arrays. 
 *  Note that some of the regexes are for dutch input!
 *  Example:
 * 
 *  $validations = array('name' => 'anything','email' => 'email','alias' => 'anything','pwd'=>'anything','gsm' => 'phone','birthdate' => 'date');
 *  $required = array('name', 'email', 'alias', 'pwd');
 *  $sanitize = array('alias');
 *
 *  $validator = new FormValidator($validations, $required, $sanitize);
 *                  
 *  if($validator->validate($_POST))
 *  {
 *      $_POST = $validator->sanitize($_POST);
 *      // now do your saving, $_POST has been sanitized.
 *      die($validator->getScript()."<script type='text/javascript'>alert('saved changes');</script>");
 *  }
 *  else
 *  {
 *      die($validator->getScript());
 *  }   
 *  
 * To validate just one element:
 * $validated = new FormValidator()->validate('blah@bla.', 'email');
 * 
 * To sanitize just one element:
 * $sanitized = new FormValidator()->sanitize('<b>blah</b>', 'string');
 * 
 * @package pork
 * @author SchizoDuckie
 * @copyright SchizoDuckie 2008
 * @version 1.0
 * @access public
 */
class FormValidator
{
    public static $regexes = Array(
            'date' => "^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{4}\$",
            'amount' => "^[-]?[0-9]+\$",
            'number' => "^[-]?[0-9,]+\$",
            'alfanum' => "^[0-9a-zA-Z ,.-_\\s\?\!]+\$",
            'not_empty' => "[a-z0-9A-Z]+",
            'words' => "^[A-Za-z]+[A-Za-z \\s]*\$",
            'phone' => "^[0-9]{10,11}\$",
            'zipcode' => "^[1-9][0-9]{3}[a-zA-Z]{2}\$",
            'plate' => "^([0-9a-zA-Z]{2}[-]){2}[0-9a-zA-Z]{2}\$",
            'price' => "^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$",
            '2digitopt' => "^\d+(\,\d{2})?\$",
            '2digitforce' => "^\d+\,\d\d\$",
            'anything' => "^[\d\D]{1,}\$"
    );
    private $validations, $sanatations, $mandatories, $errors, $corrects, $fields;


    public function __construct($validations=array(), $mandatories = array(), $sanatations = array())
    {
        $this->validations = $validations;
        $this->sanitations = $sanitations;
        $this->mandatories = $mandatories;
        $this->errors = array();
        $this->corrects = array();
    }

    /**
     * Validates an array of items (if needed) and returns true or false
     *
     */
    public function validate($items)
    {
        $this->fields = $items;
        $havefailures = false;
        foreach($items as $key=>$val)
        {
            if((strlen($val) == 0 || array_search($key, $this->validations) === false) && array_search($key, $this->mandatories) === false) 
            {
                $this->corrects[] = $key;
                continue;
            }
            $result = self::validateItem($val, $this->validations[$key]);
            if($result === false) {
                $havefailures = true;
                $this->addError($key, $this->validations[$key]);
            }
            else
            {
                $this->corrects[] = $key;
            }
        }

        return(!$havefailures);
    }

    /**
     *
     *  Adds unvalidated class to thos elements that are not validated. Removes them from classes that are.
     */
    public function getScript() {
        if(!empty($this->errors))
        {
            $errors = array();
            foreach($this->errors as $key=>$val) { $errors[] = "'INPUT[name={$key}]'"; }

            $output = '$$('.implode(',', $errors).').addClass("unvalidated");'; 
            $output .= "new FormValidator().showMessage();";
        }
        if(!empty($this->corrects))
        {
            $corrects = array();
            foreach($this->corrects as $key) { $corrects[] = "'INPUT[name={$key}]'"; }
            $output .= '$$('.implode(',', $corrects).').removeClass("unvalidated");';   
        }
        $output = "<script type='text/javascript'>{$output} </script>";
        return($output);
    }


    /**
     *
     * Sanitizes an array of items according to the $this->sanitations
     * sanitations will be standard of type string, but can also be specified.
     * For ease of use, this syntax is accepted:
     * $sanitations = array('fieldname', 'otherfieldname'=>'float');
     */
    public function sanitize($items)
    {
        foreach($items as $key=>$val)
        {
            if(array_search($key, $this->sanitations) === false && !array_key_exists($key, $this->sanitations)) continue;
            $items[$key] = self::sanitizeItem($val, $this->validations[$key]);
        }
        return($items);
    }


    /**
     *
     * Adds an error to the errors array.
     */ 
    private function addError($field, $type='string')
    {
        $this->errors[$field] = $type;
    }

    /**
     *
     * Sanitize a single var according to $type.
     * Allows for static calling to allow simple sanitization
     */
    public static function sanitizeItem($var, $type)
    {
        $flags = NULL;
        switch($type)
        {
            case 'url':
                $filter = FILTER_SANITIZE_URL;
            break;
            case 'int':
                $filter = FILTER_SANITIZE_NUMBER_INT;
            break;
            case 'float':
                $filter = FILTER_SANITIZE_NUMBER_FLOAT;
                $flags = FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND;
            break;
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_SANITIZE_EMAIL;
            break;
            case 'string':
            default:
                $filter = FILTER_SANITIZE_STRING;
                $flags = FILTER_FLAG_NO_ENCODE_QUOTES;
            break;

        }
        $output = filter_var($var, $filter, $flags);        
        return($output);
    }

    /** 
     *
     * Validates a single var according to $type.
     * Allows for static calling to allow simple validation.
     *
     */
    public static function validateItem($var, $type)
    {
        if(array_key_exists($type, self::$regexes))
        {
            $returnval =  filter_var($var, FILTER_VALIDATE_REGEXP, array("options"=> array("regexp"=>'!'.self::$regexes[$type].'!i'))) !== false;
            return($returnval);
        }
        $filter = false;
        switch($type)
        {
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_VALIDATE_EMAIL;    
            break;
            case 'int':
                $filter = FILTER_VALIDATE_INT;
            break;
            case 'boolean':
                $filter = FILTER_VALIDATE_BOOLEAN;
            break;
            case 'ip':
                $filter = FILTER_VALIDATE_IP;
            break;
            case 'url':
                $filter = FILTER_VALIDATE_URL;
            break;
        }
        return ($filter === false) ? false : filter_var($var, $filter) !== false ? true : false;
    }       



}

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

স্ট্রিপড ক্লাস এবং / অথবা ট্যাগগুলির সাথে সত্যই এইচটিএমএল ইনপুটটি অনুমোদনের জন্য ডেডিকেটেড এক্সএসএস মেয়াদীকরণ প্যাকেজের উপর নির্ভর করে। এইচটিএমএল পার্স করার জন্য আপনার নিজের রেজিস্টারগুলি লিখবেন না!


17
দেখে মনে হচ্ছে এটি ইনপুটগুলি বৈধ করার জন্য একটি সহজ স্ক্রিপ্ট হতে পারে তবে এটি প্রশ্নের সাথে সম্পূর্ণ অপ্রাসঙ্গিক।
rjmunro

43

কোন নেই.

প্রথমত, এসকিউএল ইঞ্জেকশনটি একটি ইনপুট ফিল্টারিংয়ের সমস্যা এবং এক্সএসএস একটি আউটপুট থেকে বেরিয়ে যায় - তাই আপনি কোড লাইফাইসাইকালে একই সময়ে এই দুটি অপারেশন চালিয়ে যান না।

থাম্বের প্রাথমিক নিয়ম

  • এসকিউএল কোয়েরির জন্য, প্যারামিটারগুলি বেঁধে দিন (পিডিওর মতো) বা ক্যোয়ারী ভেরিয়েবলগুলির জন্য ড্রাইভার-নেটিভ পলায়ন ফাংশন ব্যবহার করুন (যেমন mysql_real_escape_string())
  • strip_tags()অযাচিত এইচটিএমএল ফিল্টার আউট ব্যবহার করুন
  • অন্যান্য সমস্ত আউটপুট htmlspecialchars()এড়িয়ে চলুন এবং এখানে ২ য় এবং ৩ য় পরামিতি সম্পর্কে সচেতন থাকুন।

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

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

2
আমার জন্য সেরা উত্তর। এটি সংক্ষিপ্ত এবং আপনি আমাকে জিজ্ঞাসা করলে প্রশ্নটি ভালভাবে সম্বোধন করে। কিছু ইনজেকশনের সাহায্যে কোনওভাবে _P _POST বা $ _GET এর মাধ্যমে পিএইচপি আক্রমণ করা সম্ভব নাকি এটি অসম্ভব?
জো স্মু

ওহ হ্যাঁ, $ পোস্ট এবং $ অ্যারেগুলি সমস্ত অক্ষর গ্রহণ করে, তবে পোস্টের পিএইচপি পৃষ্ঠাতে চরিত্রটি অঙ্কিত করার অনুমতি দেওয়া হয় তবে সেই চরিত্রগুলির মধ্যে কয়েকটি আপনার বিরুদ্ধে ব্যবহার করা যেতে পারে। সুতরাং আপনি যদি ক্যাপসুলেটিং অক্ষরগুলি (যেমন "," এবং `) এড়িয়ে চলেন না তবে এটি আক্রমণকারী ভেক্টরটি খুলতে পারে often অক্ষরটি প্রায়শই মিস হয়ে যায় এবং কমান্ড লাইন এক্সিকিউশন হ্যাক তৈরি করতে ব্যবহার করা যেতে পারে San স্যানিটেশন ব্যবহারকারী ইনপুট হ্যাকিং প্রতিরোধ করবে, তবে ওয়েব অ্যাপ্লিকেশন ফায়ারওয়াল হ্যাকগুলি আপনাকে সাহায্য করবে না
drtechno

22

এক্সএসএস সমস্যা সমাধানের জন্য, এইচটিএমএল পিউরিফায়ারটি একবার দেখুন । এটি মোটামুটি কনফিগারযোগ্য এবং একটি শালীন ট্র্যাক রেকর্ড রয়েছে।

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

একটি ভাল সমাধান প্রস্তুত বিবৃতি ব্যবহার করা হয়। PDO গ্রন্থাগার এবং mysqli এক্সটেনশন এই সমর্থন করি।


স্যানিটাইজিং ইনপুট এর মতো কিছু করার কোনও "সেরা উপায়" নেই .. কিছু লাইব্রেরি ব্যবহার করুন, এইচটিএমএল পিউরিফায়ার ভাল is এই গ্রন্থাগারগুলি বহুবার গতিবেগ করা হয়েছে। সুতরাং যে কোনও কিছু নিজে আসতে পারে তার চেয়ে এটি অনেক বেশি বুলেটপ্রুফ
প্যান করুন

এছাড়াও বায়োইনফরম্যাটিক্স.আর.এইচপিপ্ল্যাবওয়্যার / আন্তঃ_উটিলিটিস / এইচটিএমএলয়েড দেখুন । আমার বোধগম্যতা থেকে ওয়ার্ডপ্রেস একটি পুরানো সংস্করণ ব্যবহার করে, core.trac.wordpress.org/browser/tags/2.9.2/wp-includes/kses.php
স্টিভ ক্লে

ওয়ার্ডপ্রেসের সমস্যাটি হ'ল এটি একটি পিএইচপি-স্কুয়েল ইনজেকশন আক্রমণ নয় যা ডাটাবেস ভঙ্গ করে। এক্স প্রোগ্রামযুক্ত প্লাগইনগুলি যা একটি এক্সএমএল কোয়েরি গোপনীয়তা প্রকাশ করে এমন ডেটা সঞ্চয় করে যা আরও সমস্যাযুক্ত।
drtechno

20

পিএইচপি 5.2 ফিল্টার_ভার ফাংশন চালু করেছে ।

এটি সানিটাইজ, ভ্যালিডেট ফিল্টারগুলিকে প্রচুর পরিমাণে সমর্থন করে।

http://php.net/manual/en/function.filter-var.php


17

এমন একটি কৌশল যা আপনার নির্দিষ্ট পৃষ্ঠাতে যেখানে আপনার পৃষ্ঠা পছন্দ করে /mypage?id=53এবং যেখানে আইডিটি একটি সর্বনিম্ন ধারায় আইডিটি ব্যবহার করে তা নিশ্চিত করতে হয় যে আইডিটি অবশ্যই একটি পূর্ণসংখ্যা, যেমন:

if (isset($_GET['id'])) {
  $id = $_GET['id'];
  settype($id, 'integer');
  $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'");
  # now use the result
}

তবে অবশ্যই এটি একটি নির্দিষ্ট আক্রমণকে সরিয়ে দেয়, সুতরাং অন্যান্য সমস্ত উত্তর পড়ুন। (এবং হ্যাঁ আমি জানি যে উপরের কোডটি দুর্দান্ত নয়, তবে এটি নির্দিষ্ট প্রতিরক্ষা দেখায়))


11
আমি পরিবর্তে $ আইডি = অন্তর ((আইডি) ব্যবহার করি :)
ডাচ ট্রান

সংখ্যার ডেটা isোকানো হয়েছে তা নিশ্চিত করার জন্য পূর্ণসংখ্যা কাস্টিং একটি ভাল উপায়।
পরীক্ষা

1
$id = (int)$_GET['id']এবং $que = sprintf('SELECT ... WHERE id="%d"', $id)খুব ভাল
ভ্লাদক্রাস

16

পিএইচপি দিয়ে ব্যবহারকারী ইনপুট স্যানিটাইজ করার জন্য পদ্ধতি:

  • মাইএসকিউএল এবং পিএইচপি এর আধুনিক সংস্করণ ব্যবহার করুন।

  • স্পষ্টভাবে চরসেট সেট করুন:

    • $ Mysqli-> set_charset ( "UTF8");
      ম্যানুয়াল
    • $ পিডো = নতুন পিডিও ('মাইএসকিএল: হোস্ট = লোকালহোস্ট; ডিবিনেম = টেস্টডিবি; চরসেট = ইউটিএফ 8', $ ব্যবহারকারী, $ পাসওয়ার্ড);
      ম্যানুয়াল
    • $ pdo-> exec ("নামগুলি utf8 সেট করুন");
      ম্যানুয়াল
    • $ পিডো = নতুন পিডিও (
      "মাইকিকিএল: হোস্ট = $ হোস্ট; ডিবি নাম = $ ডিবি", $ ব্যবহারকারী, $ পাস, 
      অ্যারে (
      PDO :: এটিটিআর_আরআরএমওডি => পিডিও :: ERRMODE_EXCEPTION,
      PDO :: MYSQL_ATTR_INIT_COMMAND => "নাম সেট করুন utf8"
      )
      );
      ম্যানুয়াল
    • mysql_set_charset ( 'UTF8')
      [পিএইচপি 5.5.0 এ অবচয়, পিএইচপি 7.0.0 এ সরানো]
  • সুরক্ষিত অক্ষরগুলি ব্যবহার করুন:

    • Utf8, latin1, ascii .. নির্বাচন করুন, দুর্বল অক্ষরগুলি বিগ 5, সিপি 932, জিবি 2312, জিবিকে, এসজি ব্যবহার করবেন না।
  • স্থানিক ক্রিয়া ব্যবহার করুন:

    • মাইএসকিউলি বিবৃতি প্রস্তুত:
      $ stmt = $ mysqli-> প্রস্তুত ('পরীক্ষার কাছ থেকে * নির্বাচন করুন কোথাও নাম =? সীমা 1'); 
      m পরম = "'বা 1 = 1 / *";
      $ stmt-> bind_param ('s', $ পরম);
      $ stmt-> চালানো ();
    • পিডিও :: কোট () - ইনপুট স্ট্রিংয়ের চারপাশে উদ্ধৃতি স্থাপন করে (প্রয়োজনে) এবং অন্তর্নিহিত ড্রাইভারের জন্য উপযুক্ত একটি উদ্ধৃতি শৈলী ব্যবহার করে ইনপুট স্ট্রিংয়ের মধ্যে বিশেষ অক্ষরগুলি ছাড়িয়ে যায়:

      $ পিডো = নতুন পিডিও ('মাইএসকিএল: হোস্ট = লোকালহোস্ট; ডিবিনেম = টেস্টডিবি; চরসেট = ইউটিএফ 8', $ ব্যবহারকারী, $ পাসওয়ার্ড); স্পষ্টরূপে সেট অক্ষর সেট করুন
      $ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, মিথ্যা); মাইএসকিউএল স্থানীয়ভাবে প্রস্তুত করতে পারে না (ইনজেকশন প্রতিরোধ করতে)
      $ var = $ pdo-> উদ্ধৃতি ("'বা 1 = 1 / *") অনুকরণীয় বিবৃতিগুলির ফ্যালব্যাক প্রতিরোধের জন্য প্রস্তুত বিবৃতিগুলি অনুকরণ করে অক্ষম করুন ; আক্ষরিক না শুধুমাত্র এড়ায়, কিন্তু এটি উদ্ধৃত (একক উদ্ধৃতি 'অক্ষরে) $ stmt = $ pdo-> ক্যোয়ারী ("পরীক্ষা থেকে পরীক্ষার নির্বাচন করুন যেখানে নাম = $ var LIMIT 1");

    • PDO প্রস্তুত বিবৃতি : বনাম মাইএসকিউএলআই প্রস্তুত বিবৃতি আরও বেশি ডাটাবেস ড্রাইভার এবং নামযুক্ত পরামিতি সমর্থন করে:

      $ পিডো = নতুন পিডিও ('মাইএসকিএল: হোস্ট = লোকালহোস্ট; ডিবিনেম = টেস্টডিবি; চরসেট = ইউটিএফ 8', $ ব্যবহারকারী, $ পাসওয়ার্ড); স্পষ্টরূপে সেট অক্ষর সেট করুন
      $ pdo-> setAttribute (PDO :: ATTR_EMULATE_PREPARES, মিথ্যা); মাইএসকিউএল স্থানীয়ভাবে প্রস্তুত করতে পারে না (ইনজেকশন প্রতিরোধের জন্য) যে অনুকরণগুলি প্রস্তুত করতে পারে না তা অনুকরণের প্রতিরোধের জন্য প্রস্তুত বিবৃতিগুলি অনুকরণকরণ নিষ্ক্রিয় করুন $ stmt = $ pdo-> প্রস্তুত করুন ('পরীক্ষা থেকে পরীক্ষা করুন কোথা থেকে নাম =? সীমা 1'); $ stmt-> এক্সিকিউট করুন (["'OR 1 = 1 / *"]);

    • mysql_real_escape_string [পিএইচপি 5.5.0 এ অবচয় , পিএইচপি 7.0.0 এ সরানো]।
    • mysqli_real_escape_string সংযোগের বর্তমান অক্ষরটিকে বিবেচনা করে একটি এসকিউএল বিবৃতিতে ব্যবহারের জন্য একটি স্ট্রিংয়ে বিশেষ অক্ষরগুলি এড়িয়ে যায় । তবে প্রস্তুতিমূলক বিবৃতিগুলি ব্যবহারের জন্য সুপারিশ করা হয়েছে কারণ তারা কেবল স্ট্রিংগুলি এড়ায় না, কোনও বিবরণীর সাথে একটি সম্পূর্ণ কোয়েরি এক্সিকিউশন প্ল্যান নিয়ে আসে, এটিতে কোন টেবিলগুলি এবং সূচকগুলি ব্যবহার করা হবে, এটি একটি অনুকূলিত উপায়।
    • আপনার প্রশ্নের ভিতরে আপনার ভেরিয়েবলের চারপাশে একক উদ্ধৃতি ('') ব্যবহার করুন।
  • ভেরিয়েবলটি যা আশা করছেন তার মধ্যে যাচাই করুন:

    • আপনি যদি কোনও পূর্ণসংখ্যার আশা করে থাকেন তবে ব্যবহার করুন:
      সিটিপি_ডিজিট - সংখ্যার চরিত্রের জন্য পরীক্ষা করুন; 
      $ value = (int) $ মান;
      $ মান = অবধি ($ মান);
      $ var = ফিল্টার_ভার ('0755', FILTER_VALIDATE_INT, $ বিকল্প);
    • স্ট্রিং ব্যবহারের জন্য:
      is_string () - কোনও ভেরিয়েবলের ধরণ স্ট্রিং কিনা তা সন্ধান করুন

      ফিল্টার ফাংশন ফিল্টার_ভার () ব্যবহার করুন - নির্দিষ্ট ফিল্টার সহ একটি চলক ফিল্টার করে:
      $ ইমেল = ফিল্টার_ভার ($ ইমেল, FILTER_SANITIZE_EMAIL); 
      str newstr = ফিল্টার_ভার ($ স্ট্রিম, FILTER_SANITIZE_STRING);
      আরও পূর্বনির্ধারিত ফিল্টার
    • ফিল্টার_ইনপুট () - নাম অনুসারে একটি নির্দিষ্ট বাহ্যিক চলক পায় এবং এটি বিকল্পভাবে ফিল্টার করে:
      $ অনুসন্ধান_এইচটিএমএল = ফিল্টার_ইনপুট (INPUT_GET, 'অনুসন্ধান', FILTER_SANITIZE_SPECIAL_CHARS);
    • preg_match () - একটি নিয়মিত এক্সপ্রেশন ম্যাচ সঞ্চালন;
    • আপনার নিজস্ব বৈধতা ফাংশন লিখুন।

11

আপনি এখানে যা বর্ণনা করছেন তা দুটি পৃথক সমস্যা:

  1. ব্যবহারকারী ইনপুট ডেটা স্যানিটাইজিং / ফিল্টারিং।
  2. এস্কেপিং আউটপুট।

1) ব্যবহারকারীর ইনপুট সর্বদা খারাপ বলে ধরে নেওয়া উচিত।

প্রস্তুত বিবৃতি ব্যবহার, বা / এবং mysql_real_escape_string সঙ্গে ফিল্টারিং অবশ্যই একটি আবশ্যক। পিএইচপি-তে ফিল্টার_ ইনপুটও রয়েছে যা শুরু করার জন্য ভাল জায়গা।

2) এটি একটি বৃহত বিষয়, এবং এটি আউটপুট হওয়ার ডেটা প্রসঙ্গে নির্ভর করে। এইচটিএমএলের জন্য এখানে htmlpurifier এর মতো সমাধান রয়েছে। থাম্বের নিয়ম হিসাবে, সর্বদা আপনার আউটপুট থেকে যে কোনও কিছু এড়ান।

উভয় ইস্যু একক পোস্টে যেতে অনেক বড়, তবে এমন অনেকগুলি পোস্ট রয়েছে যা আরও বিশদে চলে যায়:

পদ্ধতিগুলি পিএইচপি আউটপুট

নিরাপদ পিএইচপি আউটপুট


9

আপনি যদি PostgreSQL ব্যবহার করছেন, পিএইচপি থেকে ইনপুট pg_escape_string () দিয়ে পালাতে পারবেন

 $username = pg_escape_string($_POST['username']);

ডকুমেন্টেশন থেকে ( http://php.net/manual/es/function.pg-escape-string.php ):

pg_escape_string () ডাটাবেস অনুসন্ধানের জন্য একটি স্ট্রিং এড়িয়ে যায়। এটি পোস্টগ্র্রেএসকিউএল ফর্ম্যাটে কোনও উদ্ধৃতি ছাড়াই একটি পালানো স্ট্রিং প্রদান করে।


1
pg_escape_literal () PostgreSQL এর জন্য ব্যবহার করার জন্য প্রস্তাবিত ফাংশন।
ক্রিপ্টিক ツ

8

এখানে কোনও ক্যাচাল ফাংশন নেই, কারণ এখানে একাধিক উদ্বেগের সমাধান করা দরকার।

  1. এসকিউএল ইনজেকশন - আজ, প্রতিটি পিএইচপি প্রকল্পটি পিএইচপি ডেটা অবজেক্টস (পিডিও) এর মাধ্যমে প্রস্তুত স্টেটমেন্টগুলি সর্বোত্তম অনুশীলন হিসাবে ব্যবহার করা উচিত , যাতে একটি বিপথগামী উদ্ধৃতি থেকে একটি ত্রুটি রোধ করা যায় এবং পাশাপাশি ইনজেকশনের বিরুদ্ধে সম্পূর্ণ বৈশিষ্ট্যযুক্ত সমাধান দেওয়া হয় । এটি আপনার ডাটাবেস অ্যাক্সেস করার সবচেয়ে নমনীয় এবং সুরক্ষিত উপায়।

    পরীক্ষা করে দেখুন (শুধুমাত্র প্রপার) PDO টিউটোরিয়াল প্রায় কাছাকাছি সবকিছু আপনি PDO সম্পর্কে জানা প্রয়োজন জন্য। (শীর্ষস্থানীয় এসও অবদানকারীকে, আপনার ইয়র্ককমসনকে আন্তরিক ধন্যবাদ, এই বিষয়ে এই দুর্দান্ত উত্সের জন্য))

  2. এক্সএসএস - এর পথে ডেটা স্যানিটাইজ করুন ...

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

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

      /* Prevent XSS input */ function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }

  3. এক্সএসএস - বের হওয়ার পথে ডেটা স্যানিটাইজ করুন ... আপনি নিজের ডেটাবেসে যুক্ত করার আগে ডেটা সঠিকভাবে স্যানিটাইজ করার গ্যারান্টি না দিলে আপনার ব্যবহারকারীর কাছে এটি প্রদর্শন করার আগে আপনাকে এটি স্যানিটাইজ করা দরকার, আমরা এই দরকারী পিএইচপি ফাংশনগুলি লাভ করতে পারি:

    • আপনি যখন কল করেন echoবা printব্যবহারকারীর সরবরাহিত মানগুলি প্রদর্শনের জন্য, htmlspecialcharsডেটা সঠিকভাবে স্যানিটাইজ না করা এবং এইচটিএমএল প্রদর্শনের অনুমতি না দেওয়া পর্যন্ত ব্যবহার করুন।
    • json_encode পিএইচপি থেকে জাভাস্ক্রিপ্টে ব্যবহারকারী দ্বারা সরবরাহিত মান সরবরাহ করার একটি নিরাপদ উপায়
  4. আপনি কি বাহ্যিক শেল কমান্ডগুলি ব্যবহার করে exec()বা system()ফাংশনগুলি ব্যবহার করেন , বা backtickঅপারেটরে? যদি তা হয় তবে এসকিউএল ইনজেকশন এবং এক্সএসএস ছাড়াও আপনার সমস্যা সমাধানের অতিরিক্ত উদ্বেগ থাকতে পারে, ব্যবহারকারীরা আপনার সার্ভারে দূষিত কমান্ড চালাচ্ছেন । আপনি escapeshellcmdপুরো কমান্ডটি escapeshellargপালাতে বা পৃথক যুক্তিগুলি থেকে বাঁচতে চাইলে আপনাকে ব্যবহার করতে হবে to


পরিবর্তে mb_encode_numericentity ব্যবহার করা যেতে পারে? যেহেতু এটি সবকিছু এনকোড করে?
drtechno

@ ড্রটেকনো - # 3 এক্সএসএসmb_encode_numericentityhtmlspecialchars
ওয়েবাহোলিক

5

ইনপুট sanitizing এবং ডেটা পলায়নের মধ্যে এড়ানোর ভুল করার সবচেয়ে সহজ উপায় মত পিএইচপি ফ্রেমওয়ার্ক ব্যবহার করছে Symfony , Nette বা ইত্যাদি যে ফ্রেমওয়ার্ক (টেমপ্লেট ইঞ্জিন, ডাটাবেজ স্তর, ORM) অংশ।

টুইগ বা ল্যাটের মতো টেম্প্লেটিং ইঞ্জিনটির আউটপুট ডিফল্টরূপে ছড়িয়ে পড়ে - আপনি যদি প্রসঙ্গের উপর নির্ভর করে আপনার আউটপুটটি সঠিকভাবে পালিয়ে যান তবে (ম্যানুয়াল HTML বা ওয়েব পৃষ্ঠার জাভাস্ক্রিপ্ট অংশ) ম্যানুয়ালি সমাধান করতে হবে না।

ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে ইনপুটকে স্যানিটাইজ করছে এবং আপনার সরাসরি $ _POST, $ _GET বা $ _SESSION ভেরিয়েবলগুলি ব্যবহার করা উচিত নয়, তবে রাউটিং, সেশন হ্যান্ডলিং ইত্যাদি পদ্ধতির মাধ্যমে should

এবং ডাটাবেস (মডেল) স্তরের জন্য ডক্ট্রিনের মতো ওআরএম ফ্রেমওয়ার্ক বা পিডিওর চারপাশে নেট ডেটাবেস এর মতো মোড়ক রয়েছে।

আপনি এটি সম্পর্কে এখানে আরও পড়তে পারেন - একটি সফ্টওয়্যার কাঠামো কী?


3

কেবল আউটপুট পলায়নের বিষয়টিতে এটি যুক্ত করতে চেয়েছিলেন, আপনি যদি এইচটিএমএল আউটপুট তৈরি করতে php DOMDocament ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে সঠিক প্রসঙ্গে পালিয়ে যাবে escape একটি গুণ (মান = "") এবং <span> এর অভ্যন্তরীণ পাঠ্য সমান নয়। এক্সএসএসের বিরুদ্ধে সুরক্ষিত থাকার জন্য এটি পড়ুন: ওডাব্লিউএসপি এক্সএসএস প্রতিরোধের চিট শিট


2

আপনি কখনই ইনপুট স্যানিটাইজ করবেন না।

আপনি সর্বদা আউটপুট স্যানিটাইজ করুন।

এসকিউএল বিবৃতিতে অন্তর্ভুক্তির জন্য আপনি ডেটাতে যে রূপান্তরগুলি প্রয়োগ করেন সেগুলি আপনি এইচটিএমএলে অন্তর্ভুক্তির জন্য আবেদন করেছেন তার থেকে সম্পূর্ণ পৃথক এবং জাভাস্ক্রিপ্টে অন্তর্ভুক্তির জন্য আপনি যে আবেদন করেছেন তার থেকে সম্পূর্ণ আলাদা যা আপনি এলডিএফ-এ অন্তর্ভুক্তির জন্য আবেদন করেন সেগুলি থেকে সম্পূর্ণ আলাদা সিএসএসে অন্তর্ভুক্তির জন্য আপনি যেগুলি প্রয়োগ করেন তার থেকে সম্পূর্ণ আলাদা আপনি কোনও ইমেলের অন্তর্ভুক্তির জন্য আবেদন করেছেন তাদের থেকে সম্পূর্ণ আলাদা ....

যাইহোক ইনপুটকে বৈধতা দিন - সিদ্ধান্ত নিন আপনার আরও প্রক্রিয়াজাতকরণের জন্য এটি গ্রহণ করা উচিত বা ব্যবহারকারীকে বলুন এটি গ্রহণযোগ্য নয়। তবে পিএইচপি ল্যান্ড ছাড়ার আগ পর্যন্ত ডেটার উপস্থাপনে কোনও পরিবর্তন প্রয়োগ করবেন না।

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


এর সাথে একটি সমস্যা হ'ল এটি সর্বদা ডেটাবেস আক্রমণ নয়, এবং সমস্ত ব্যবহারকারীর ইনপুটটি সিস্টেম থেকে সুরক্ষিত করা উচিত। শুধু একটি ভাষার ধরণ নয়। সুতরাং আপনার সাইটগুলিতে, আপনি যখন নিজের $ _POST ডেটা এমনকি বন্ডিং ব্যবহার করে গণনা করেন, তখন এটি শেল বা এমনকি অন্যান্য পিএইচপি কোড কার্যকর করতে যথেষ্ট পরিমাণে পালাতে পারে।
drtechno

"এটি সর্বদা ডেটাবেস আক্রমণ নয়": "এসকিউএল বিবৃতিতে অন্তর্ভুক্তির জন্য আপনি সুরক্ষার জন্য ডেটাতে যে রূপান্তরগুলি প্রয়োগ করেন সেগুলি থেকে সম্পূর্ণ আলাদা ...."
সিমকিয়ান

"সমস্ত ব্যবহারকারীর ইনপুট সিস্টেম থেকে রক্ষা করা উচিত": কোনও সিস্টেম ব্যবহারকারীর ইনপুট থেকে সুরক্ষিত করা উচিত নয়।
সিমকিবিয়ান

ঠিক আছে, আমি কথায় কথায় ছড়িয়ে পড়েছি, তবে হ্যাঁ ইনপুটটিকে সিস্টেম অপারেশনকে প্রভাবিত করা থেকে বিরত করা দরকার। এটি স্পষ্ট করার জন্য ...
drtechno

ইনপুট এবং আউটপুট উভয়ই স্যানিটাইজ করা উচিত।
তাজনি

1

ব্যবহারকারীর ডেটা বিশ্বাস করবেন না।

function clean_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

trim()ফাংশন অপসারণ হোয়াইটস্পেস এবং একটি স্ট্রিং উভয় পক্ষের থেকে অন্য পূর্বনির্ধারিত অক্ষর।

stripslashes()ফাংশন ব্যাকস্ল্যাশ সরিয়ে ফেলা হবে

htmlspecialchars()ফাংশন এইচটিএমএল সত্ত্বা কিছু পূর্বনির্ধারিত অক্ষর পরিবর্তন করে।

পূর্বনির্ধারিত অক্ষরগুলি হ'ল:

& (ampersand) becomes &amp;
" (double quote) becomes &quot;
' (single quote) becomes &#039;
< (less than) becomes &lt;
> (greater than) becomes &gt;

1
এটি কী থেকে রক্ষা করবে? এটি কি এক্সএসএসের জন্য? কেন clean_inputতখন বলা হয় ? আপনি স্ল্যাশ ফেলা করতে চান কেন?
ধর্মমান

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

আপনার বক্তব্য মিথ্যা।
এরিক থায়ার্ট

0

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

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