سؤال

هل هناك جامعا وظيفة في مكان ما أن يعمل بشكل جيد التعقيم إدخال المستخدم SQL injection و XSS الهجمات, في حين لا يزال يسمح أنواع معينة من HTML العلامات ؟

هل كانت مفيدة؟

المحلول

فمن سوء فهم الشائع أن إدخال المستخدم يمكن تصفيتها.PHP حتى (الآن مستنكر) "ميزة" ، ودعا السحر-نقلت أن يبني على هذه الفكرة.هذا هراء.ننسى تصفية (أو التنظيف ، أو ما يطلق عليه الناس).

ما يجب فعله لتجنب المشاكل هي بسيطة جدا:كلما كنت تضمين سلسلة ضمن الخارجية البرمجية يجب الهروب منه ، وفقا لقواعد اللغة.على سبيل المثال ، إذا كنت تضمين سلسلة في بعض SQL استهداف الخلية, يجب الهروب من سلسلة مع الخلية وظيفة لهذا الغرض (mysqli_real_escape_string).(أو ، في حالة قواعد البيانات باستخدام إعداد البيانات نهج أفضل ، عندما يكون ذلك ممكنا)

مثال آخر هو HTML:إذا كنت تضمين السلاسل داخل HTML, يجب عليك الهروب مع htmlspecialchars.وهذا يعني أن كل واحد echo أو print بيان أن استخدام htmlspecialchars.

مثال ثالث يمكن أن يكون قذيفة الأوامر:إذا كنت تنوي تضمين سلاسل مثل (الحجج) إلى أوامر خارجية و الاتصال مع exec, ثم يجب عليك استخدام escapeshellcmd و escapeshellarg.

وهلم جرا وهكذا دواليك ...

على فقط حالة حيث كنت في حاجة إلى العمل بنشاط على تصفية البيانات ، إذا كنت قبول المنسقة مسبقا الإدخال.على سبيل المثال.إذا كنت اسمحوا الخاص بك المستخدمون وظيفة ترميز HTML, أن كنت تنوي عرضها في الموقع.ومع ذلك ، يجب أن يكون من الحكمة تجنب هذا بأي ثمن ، منذ بغض النظر عن جيدا كيف كنت مرشح ، وسوف يكون دائما ثغرة أمنية محتملة.

نصائح أخرى

لا تحاول منع حقن SQL عن طريق التعقيم إدخال البيانات.

بدلا من ذلك ، لا تسمح البيانات التي يتم استخدامها في إنشاء التعليمات البرمجية SQL.استخدام البيانات المعدة (أياستخدام المعلمات في قالب الاستعلام) يستخدم بد المتغيرات.هذا هو السبيل الوحيد أن تكون مضمونة ضد حقن SQL.

يرجى مراجعة موقع الويب الخاص بي http://bobby-tables.com/ لمزيد من المعلومات حول منع حقن SQL.

لا.لا يمكنك بشكل عام تصفية البيانات من دون أي سياق ما يفعل.في بعض الأحيان كنت تريد أن تأخذ استعلام SQL كما المدخلات في بعض الأحيان كنت تريد أن تأخذ HTML كإدخال.

تحتاج إلى تصفية الإدخال في القائمة البيضاء -- التأكد من أن بيانات تطابق بعض مواصفات ما كنت تتوقع.ثم تحتاج إلى الهروب منه قبل استخدامه ، اعتمادا على السياق الذي يتم استخدامه.

عملية الهروب البيانات SQL - لمنع حقن SQL - هي مختلفة جدا من عملية الهروب البيانات (X)HTML, لمنع XSS.

PHP لديه جديد لطيفة filter_input وظائف الآن ، على سبيل المثال تحرير يمكنك من العثور على 'في نهاية المطاف البريد الإلكتروني regex' الآن أن هناك المدمج في 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');
 *  $sanatize = array('alias');
 *
 *  $validator = new FormValidator($validations, $required, $sanatize);
 *                  
 *  if($validator->validate($_POST))
 *  {
 *      $_POST = $validator->sanatize($_POST);
 *      // now do your saving, $_POST has been sanatized.
 *      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 sanatize just one element:
 * $sanatized = new FormValidator()->sanatize('<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->sanatations = $sanatations;
        $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);
    }


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


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

    /**
     *
     * Sanatize a single var according to $type.
     * Allows for static calling to allow simple sanatization
     */
    public static function sanatizeItem($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;
    }       



}

طبعا نضع في اعتبارنا أن كنت بحاجة إلى القيام به استعلام sql الهروب أيضا اعتمادا على ما هو نوع db الخاص بك باستخدام (mysql_real_escape_string() غير مجدية بالنسبة sql server على سبيل المثال).ربما كنت ترغب في التعامل مع هذه تلقائيا في التطبيق المناسب طبقة مثل ORM.أيضا ، كما ذكر أعلاه:من أجل إخراج html استخدام php مخصص وظائف مثل htmlspecialchars ;)

حقا السماح HTML الإدخال مع مثل تجريد الطبقات و/أو العلامات تعتمد على واحد مخصص xss التحقق من صحة حزم.لا تكتب الخاصة بك REGEXES تحليل HTML!

لا, لم يكن هناك.

أولا حقن SQL الإدخال تصفية المشكلة ، XSS هو الناتج الهروب واحدة حتى لا تنفيذ هاتين العمليتين في نفس الوقت في قانون حياة.

القواعد الأساسية الإبهام

  • عن استعلام SQL ربط المعلمات (كما هو الحال مع شركة تنمية نفط عمان) أو استخدام برنامج تشغيل أصلية الهروب وظيفة الاستعلام المتغيرات (مثل mysql_real_escape_string())
  • استخدام strip_tags() لتصفية غير المرغوب فيها HTML
  • الهروب سائر الناتج مع htmlspecialchars() وأن تضع في اعتبارها 2 و 3 معلمات هنا.

لمعالجة XSS المسألة ، نلقي نظرة على HTML Purifier.إلى حد ما هو شكلي و لديه سجل حافل لائق.

أما بالنسبة هجمات حقن SQL, تأكد من التحقق من مدخلات المستخدم ، ثم تشغيله على الرغم من mysql_real_escape_string().وظيفة لن تهزم جميع هجمات حقن, رغم أن, لذلك من المهم أن يمكنك التحقق من البيانات قبل إلقائها في سلسلة الاستعلام.

أفضل حل هو استخدام البيانات المعدة.على شركة تنمية نفط عمان مكتبة و mysqli تمديد دعم هذه.

PHP 5.2 قدم filter_var وظيفة.

وهو يدعم مجموعة كبيرة من تطهير, صحة المرشحات.

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

خدعة واحدة التي يمكن أن تساعد في ظرف محدد حيث لديك صفحة مثل /mypage?id=53 و يمكنك استخدام معرف في جملة WHERE هو التأكد من أن معرف بالتأكيد هو عدد صحيح مثل:

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

ولكن بالطبع هذا فقط يقطع واحد محدد الهجوم حتى قراءة كل الأجوبة الأخرى.(و نعم أنا أعرف أن المدونة أعلاه ليست كبيرة ، لكنه يظهر محددة الدفاع.)

طرق التعقيم إدخال المستخدم مع PHP:

  • استخدام الإصدارات الحديثة من MySQL و PHP.

  • مجموعة محارف صراحة:

    • $mysqli->set_charset("utf8");
      دليل
    • $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);
      دليل
    • $pdo->exec("set names utf8");
      دليل
    • $pdo = new PDO(
      "mysql:host=$host;dbname=$db", $user, $pass, 
      array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      )
      );
      دليل
    • mysql_set_charset('utf8')
      [مستنكر في PHP 5.5.0 إزالتها في PHP 7.0.0].
  • استخدام آمن ترميز:

    • حدد utf8 ، latin1 ، ascii.., لا تستخدم الضعيفة ترميز big5 ، cp932, gb2312, gbk ، sjis.
  • استخدام spatialized وظيفة:

    • MySQLi البيانات المعدة:
      $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); 
      $param = "' OR 1=1 /*";
      $stmt->bind_param('s', $param);
      $stmt->execute();
    • شركة تنمية نفط عمان::اقتباس() - أماكن علامات الاقتباس حول سلسلة الإدخال (إذا لزم الأمر) ويهرب أحرف خاصة ضمن سلسلة الإدخال باستخدام نقلا عن النمط المناسب الأساسية السائق:

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);صريح تعيين مجموعة الأحرف
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);تعطيل محاكاة البيانات المعدة لمنع تراجع إلى محاكاة بيانات MySQL لا يمكن أن تعد أصلا (لمنع حقن)
      $var = $pdo->quote("' OR 1=1 /*");ليس فقط يهرب الحرفي ، ولكن أيضا نقلت ذلك (في واحد-اقتباس الشخصيات) $stmt = $pdo->query("SELECT * FROM test WHERE name = $var LIMIT 1");

    • شركة تنمية نفط عمان إعداد البيانات:مقابل MySQLi إعداد البيانات يدعم برامج تشغيل قاعدة بيانات واسمه المعلمات:

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);صريح تعيين مجموعة الأحرف
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);تعطيل محاكاة البيانات المعدة لمنع تراجع إلى محاكاة بيانات MySQL لا يمكن أن تعد أصلا (لمنع حقن) $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(["' OR 1=1 /*"]);

    • mysql_real_escape_string [مستنكر في PHP 5.5.0 إزالتها في PHP 7.0.0].
    • mysqli_real_escape_string يهرب الأحرف الخاصة في سلسلة لاستخدامها في عبارة SQL ، مع مراعاة الحالي charset الاتصال.ولكن من المستحسن استخدام البيانات المعدة لأنها ليست ببساطة هرب سلاسل بيان يأتي مع استكمال خطة تنفيذ الاستعلام ، بما في ذلك الجداول والفهارس ، سيكون هو الأمثل الطريق.
    • استخدام علامات الاقتباس المفردة (' ') حول المتغيرات داخل الاستعلام الخاص بك.
  • التحقق من متغير يحتوي على ما كنت تتوقع من أجل:

    • إذا كنت تتوقع عدد صحيح ، استخدام:
      ctype_digit — Check for numeric character(s);
      $value = (int) $value;
      $value = intval($value);
      $var = filter_var('0755', FILTER_VALIDATE_INT, $options);
    • سلاسل استخدام:
      is_string() — Find whether the type of a variable is string

      استخدام وظيفة مرشح filter_var() — الفلاتر متغير محدد مرشح:
      $email = filter_var($email, FILTER_SANITIZE_EMAIL);
      $newstr = filter_var($str, FILTER_SANITIZE_STRING);
      أكثر عوامل التصفية المعرفة مسبقا
    • filter_input() — يحصل معين الخارجية متغير بالاسم اختياريا فلاتر:
      $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    • preg_match() — إجراء مباراة التعبير العادية ؛
    • الكتابة الخاصة بك وظيفة التحقق من صحة.

ما كنت تصف هنا مسألتين منفصلتين:

  1. التعقيم / تصفية من المستخدم إدخال البيانات.
  2. الهروب من الانتاج.

1) إدخال المستخدم يجب أن يكون دائما يفترض أن تكون سيئة.

باستخدام إعداد البيانات و/أو تصفية مع mysql_real_escape_string هو بالتأكيد لا بد منه.PHP أيضا filter_input بنيت في مكان جيد للبدء.

2) هذا هو موضوع واسع و ذلك يعتمد على سياق البيانات الانتاج.HTML هناك حلول مثل htmlpurifier هناك.وكقاعدة عامة من الإبهام, دائما الهروب من أي شيء كنت الانتاج.

كل القضايا هي الآن كبيرة جدا في وظيفة واحدة ، ولكن هناك الكثير من الوظائف التي تذهب إلى مزيد من التفاصيل:

أساليب PHP الانتاج

أكثر أمانا PHP الانتاج

إذا كنت تستخدم الإنترنت ، الإدخال من PHP يمكن يكون هرب مع pg_escape_string()

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

من الوثائق (http://php.net/manual/es/function.pg-escape-string.php):

pg_escape_string() يهرب سلسلة الاستعلام عن قاعدة البيانات.تقوم بإرجاع هرب السلسلة في كيو شكل بدون علامات الاقتباس.

أسهل طريقة لتجنب الأخطاء في التعقيم المدخلات الهروب البيانات باستخدام إطار PHP مثل Symfony, Nette الخ.أو جزء من هذا الإطار (النموذجيه المحرك طبقة قاعدة البيانات ، ORM).

النموذجيه المحرك مثل غصين أو لاتيه وقد الناتج الهروب افتراضيا - لا يجب أن تحل يدويا إذا كان لديك بشكل صحيح هرب الإخراج الخاص بك اعتمادا على السياق (HTML أو جافا سكريبت جزء من صفحة ويب).

الإطار تلقائيا التعقيم المدخلات يجب أن لا تستخدم $_POST, $_GET أو $_SESSION المتغيرات مباشرة ، ولكن من خلال آلية مثل التوجيه دورة التعامل إلخ.

و قاعدة البيانات (نموذج) طبقة هناك ORM أطر مثل عقيدة أو مغلفة حول شركة تنمية نفط عمان مثل Nette قاعدة البيانات الخاصة بنا.

يمكنك قراءة المزيد عن ذلك هنا - ما هو برنامج الإطار ؟

لا يوجد جامعا وظيفة ، لأن هناك العديد من الشواغل.

  1. حقن SQL - اليوم, عموما, كل مشروع PHP يجب أن يكون استخدام أعدت البيانات عن طريق PHP بيانات كائنات (PDO) باعتباره أفضل الممارسات ، منع خطأ من الضالة اقتباس فضلا عن كامل المواصفات الحل ضد حقن.كما انه الأكثر مرونة & طريقة آمنة للوصول إلى قاعدة البيانات الخاصة بك.

    تحقق من (الصحيح) PDO التعليمي الى حد كبير كل ما تحتاج إلى معرفته عن شركة تنمية نفط عمان.(خالص الشكر إلى أعلى حتى مساهم @YourCommonSense ، هذا المورد العظيم على الموضوع.)

  2. XSS - تطهير البيانات على الطريقة...

    • HTML Purifier قد حول لفترة طويلة و لا يزال تحديث بنشاط.يمكنك استخدامه في تطهير الخبيثة المدخلات ، في حين لا يزال يسمح سخية & شكلي البيضاء من العلامات.يعمل كبيرة مع العديد من محرري WYSIWYG, ولكن قد يكون ثقيل بعض حالات الاستخدام.

    • في حالات أخرى, حيث لا تريد أن تقبل HTML/جافا سكريبت على الإطلاق, لقد وجدت هذه وظيفة بسيطة مفيدة (و قد مرت عدة مراجعات ضد XSS):

      /* 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. XSS - تطهير البيانات على طريقة للخروج... إلا إذا كنت تضمن البيانات مطهرة بشكل صحيح قبل إضافتها إلى قاعدة البيانات الخاصة بك, سوف تحتاج إلى تطهير ذلك قبل عرض المستخدم الخاص بك ، يمكننا الاستفادة من هذه مفيدة وظائف PHP:

    • عند استدعاء echo أو print لعرض الموفر من قبل المستخدم القيم الاستخدام htmlspecialchars إلا إذا كانت البيانات بشكل صحيح مطهرة آمن يسمح عرض HTML.
    • json_encode هو وسيلة آمنة لتوفير الموفر من قبل المستخدم القيم من PHP إلى جافا سكريبت
  4. هل الاتصال الخارجي قذيفة الأوامر باستخدام exec() أو system() وظائف, أو backtick المشغل ؟ إذا كان الأمر كذلك ، بالإضافة إلى حقن SQL & XSS قد يكون لديك مخاوف إضافية من أن تعالج ، المستخدمين تشغيل الأوامر الخبيثة على الخادم الخاص بك.تحتاج إلى استخدام escapeshellcmd إذا كنت ترغب في الهروب من القيادة أو escapeshellarg للهروب الفردية الحجج.

لا تثق بيانات المستخدم.

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

على trim() وظيفة يزيل بيضاء و أخرى محددة مسبقا شخصيات من كلا الجانبين من سلسلة.

على stripslashes() وظيفة يزيل الخطوط المائلة العكسية

على htmlspecialchars() وظيفة تحويل بعض المعرفة مسبقا الشخصيات HTML الكيانات.

محددة مسبقا الشخصيات هي:

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

فقط أريد أن أضيف أن على الموضوع من الناتج الهروب ، إذا كنت تستخدم php DOMDocument لجعل إخراج html الخاص بك فإنه سيتم تلقائيا الهروب في السياق الصحيح.سمة (value="") الداخلية نص <span> غير متساوية.أن تكون آمنة ضد XSS قراءة هذا:OWASP XSS منع الغش ورقة

لم تطهير الإدخال.

كنت دائما تطهير الانتاج.

وقد يحول تطبيق البيانات لجعلها آمنة لإدراجها في عبارة SQL هي مختلفة تماما عن تلك التي كنت تطبيق لإدراجها في HTML هي مختلفة تماما عن تلك التي كنت تطبيق لإدراجها في جافا سكريبت هي مختلفة تماما عن تلك التي كنت تطبيق لإدراجها في LDIF هي مختلفة تماما عن تلك التي تنطبق على إدراجها في CSS هي مختلفة تماما عن تلك التي تنطبق على إدراجها في رسالة بريد إلكتروني....

بكل الوسائل التحقق من صحة المدخلات - تقرر ما إذا كان يجب قبول ذلك لمزيد من المعالجة أو تخبر المستخدم أنه أمر غير مقبول.ولكن لا تطبق أي تغيير على تمثيل البيانات حتى يتم وشك مغادرة PHP الأرض.

منذ زمن طويل شخص ما حاول أن يخترع حجم واحد يناسب الجميع آلية للهروب من البيانات و لقد انتهى الأمر مع "magic_quotes"الذي لم يكن بشكل صحيح الهروب البيانات لجميع إخراج أهداف أدى إلى التثبيت مختلفة تتطلب مختلف رمز للعمل.

هناك فلتر ملحق (howto-link, دليل) الذي يعمل بشكل جيد جدا مع جميع المتغيرات المؤتمر الشعبي العام.ليس بالسحر-هل كل شيء على الرغم من أنك سوف لا تزال بحاجة إلى استخدامها.

أستطيع أن أرى php فلتر لتعقيم الخاصة أحرف خاصة تأتي في متناول اليدين.

مثل:

    $a=fliter_var($_POST['a'],FILTER_SANITIZE_SPECIAL_CHARS);

ومع ذلك ، من خلال الأسهم ، وأعتقد أنه يمكن أن يكون أفضل لأن النظر في التعليمات البرمجية c, إلا بتصفية "' \ < > & و \0 حتى أستطيع أن أرى هذا يكون وسيلة جيدة التعقيم.غير أن تغيير التعليمات البرمجية المصدر أن تشمل هذه الشخصيات الأخرى مثل / { } [ ] .;` من شأنه أن يعزز هذه الوظيفة على ترميز (enc["]) خط:

    void php_filter_special_chars(PHP_INPUT_FILTER_PARAM_DECL)
{
unsigned char enc[256] = {0};

php_filter_strip(value, flags);

/* encodes ' " < > & \0 to numerical entities */
enc['\''] = enc['"'] = enc['<'] = enc['>'] = enc['&'] = enc[0] = 1;

/* if strip low is not set, then we encode them as &#xx; */
memset(enc, 1, 32);

if (flags & FILTER_FLAG_ENCODE_HIGH) {
    memset(enc + 127, 1, sizeof(enc) - 127);
}

php_filter_encode_html(value, enc);
}

أفضل الأساسي طريقة التعقيم إدخال المستخدم مع PHP:


    function sanitizeString($var)
    {
        $var = stripslashes($var);
        $var = strip_tags($var);
        $var = htmlentities($var);
        return $var;
    }

    function sanitizeMySQL($connection, $var)
    {
        $var = $connection->real_escape_string($var);
        $var = sanitizeString($var);
        return $var;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top