Как я могу санировать ввод пользователя с помощью PHP?

Чтобы легко проверить проблемы с вкладками / пробелами, вы действительно можете это сделать:

python -m tabnanny yourfile.py

или вы можете правильно настроить редактор правильно: -)

1056
задан TylerH 26 June 2019 в 18:34
поделиться

9 ответов

Это - распространенное заблуждение, что ввод данных пользователем может быть фильтрован. PHP даже имеет (теперь удержанный от использования) "функция", названная волшебные кавычки , который основывается на этой идее. Это не имеет смысла. Забудьте о фильтрации (или очистка, или независимо от того, что люди называют его).

то, Что необходимо сделать, для предотвращения проблем, довольно просто: каждый раз, когда Вы встраиваете строку во внешнем коде, необходимо выйти из него, согласно правилам того языка. Например, при встраивании строки в некоторый MySQL предназначения SQL необходимо выйти из строки с функцией MySQL с этой целью (mysqli_real_escape_string). (Или в случае баз данных подготовилось использование, операторы являются лучшим подходом, если это возможно.)

Другим примером является HTML: при встраивании строк в разметке HTML необходимо выйти из нее с htmlspecialchars . Это означает, что каждый echo или print оператор должен использовать htmlspecialchars.

примером трети А могли быть команды оболочки: Если Вы собираетесь встроить строки (такие как аргументы) к внешним командам и назвать их с [1 110] exec , то необходимо использовать escapeshellcmd и escapeshellarg .

И т. д. и т. п...

[только 1 113] случай, где необходимо активно отфильтровать данные, то, при принятии предварительно отформатированного входа. Например, если Вы позволяете своим пользователям отправить разметку HTML, которую Вы планируете отобразить на сайте. Однако необходимо быть мудрыми для предотвращения этого по всей стоимости, с тех пор неважно, как хорошо Вы фильтруете ее, это всегда будет потенциальная дыра в системе безопасности.

1136
ответ дан Peter Mortensen 26 June 2019 в 18:34
поделиться

Существует расширение фильтра ( howto-link , manual ), которое работает довольно хорошо со всеми переменными GPC. Это не волшебство делай все, но тебе все равно придется его использовать.

0
ответ дан Till 26 June 2019 в 18:34
поделиться

Чтобы решить проблему XSS, взгляните на Очиститель HTML . Он достаточно настраиваемый и имеет неплохой послужной список.

Что касается атак с использованием SQL-инъекций, убедитесь, что вы проверили ввод данных пользователем, а затем запустили его, хотя mysql_real_escape_string (). Однако эта функция не победит все атаки с использованием инъекций, поэтому важно проверить данные перед тем, как вывести их в строку запроса.

Лучшее решение - использовать подготовленные заявления. Библиотека PDO и расширение mysqli поддерживают их.

22
ответ дан jasonbar 26 June 2019 в 18:34
поделиться

Нет, нет.

, В первую очередь, Внедрение SQL является входной проблемой фильтрации, и XSS является выводом, выходящим из одного - таким образом, Вы даже не выполнили бы эти две операции одновременно в жизненный цикл кода.

Основные правила ползунка

  • Для SQL-запроса, свяжите параметры (как с PDO) или используйте собственную драйвером функцию выхода для переменных запроса (такой как mysql_real_escape_string())
  • Использование strip_tags(), чтобы отфильтровать нежелательный Escape HTML
  • весь другой вывод с htmlspecialchars() и помнить 2-е и 3-и параметры здесь.
43
ответ дан Peter Bailey 26 June 2019 в 18:34
поделиться

Нет. Вы не можете в общем отфильтровать данные ни без какого контекста того, для чего это. Иногда Вы хотели бы взять SQL-запрос в качестве входа, и иногда Вы будете хотеть взять HTML в качестве входа.

необходимо отфильтровать вход в белом списке - гарантируют, что данные соответствуют некоторой спецификации того, что Вы ожидаете. Тогда необходимо выйти из него перед использованием его, в зависимости от контекста, в котором Вы используете его.

процесс выхода из данных для SQL - для предотвращения Внедрения SQL - очень отличается от процесса выхода из данных для (X) HTML, для предотвращения XSS.

75
ответ дан Daniel Papasian 26 June 2019 в 18:34
поделиться

Не пытайтесь предотвратить внедрение SQL путем очистки входных данных.

Вместо этого не позволяют использовать данные при создании кода SQL . Используйте подготовленные операторы (то есть, используя параметры в шаблонном запросе), которые используют связанные переменные. Это единственный способ гарантировать защиту от SQL-инъекций.

Посетите мой сайт http://bobby-tables.com/ , чтобы узнать больше о предотвращении внедрения SQL.

201
ответ дан scorpiodawg 26 June 2019 в 18:34
поделиться

PHP имеет новые хорошие функции filter_input теперь, которые, например, освобождают Вас от нахождения 'окончательной электронной почты regex' теперь, когда существует встроенный тип FILTER_VALIDATE_EMAIL

Мой собственный класс фильтра (использует JavaScript для выделения дефектных полей) может инициироваться или ajax бланком запроса или сообщением нормальной формы. (см. пример ниже),

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



}

Конечно, имейте в виду, что необходимо сделать запрос SQL, выходящий также в зависимости от того, какой дб Ваш используют (mysql_real_escape_string (), бесполезно для SQL-сервера, например). Вы, вероятно, хотите обработать это автоматически на Вашем соответствующем прикладном уровне как ORM. Кроме того, как упомянуто выше: поскольку вывод к HTML использует выделенные функции другого php как htmlspecialchars ;)

Для того, чтобы действительно позволить ввод HTML с подобными разделенными классами и/или тегами зависят от одного из специализированных xss пакетов проверки. НЕ ПИШИТЕ СВОЙ СОБСТВЕННЫЙ REGEXES ДЛЯ ПАРСИНГА HTML!

48
ответ дан isherwood 26 June 2019 в 18:34
поделиться

Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

  1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

    Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

  2. XSS - Очистка данных в пути ...

    • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

    • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

      /* Prevent XSS input */ function sanitizeXSS () {

      Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

      1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

        Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

      2. XSS - Очистка данных в пути ...

        • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

        • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

          [110]

      3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

        • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
        • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
      4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

      5. [Тысяча сто тридцать одна]GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);

        Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

        1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

          Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

        2. XSS - Очистка данных в пути ...

          • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

          • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

            [110]

        3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

          • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
          • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
        4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

        5. [Тысяча сто тридцать одна]POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

          Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

          1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

            Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

          2. XSS - Очистка данных в пути ...

            • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

            • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

              [110]

          3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

            • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
            • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
          4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

          5. [Тысяча сто тридцать одна]REQUEST = (array)

            Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

            1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

              Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

            2. XSS - Очистка данных в пути ...

              • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

              • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

                [110]

            3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

              • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
              • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
            4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

            5. [Тысяча сто тридцать одна]POST + (array)

              Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

              1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

                Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

              2. XSS - Очистка данных в пути ...

                • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

                • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

                  [110]

              3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

                • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
                • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
              4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

              5. [Тысяча сто тридцать одна]GET + (array)

                Там нет функции catchall, потому что есть несколько проблем, которые необходимо решить.

                1. SQL-инъекция - Сегодня, как правило, каждый проект PHP должен использовать подготовленные операторы через объекты данных PHP (PDO) в качестве лучшей практики, ] предотвращение ошибки из заблудшей цитаты, а также полнофункциональное решение против инъекции . Это также самый гибкий & amp; безопасный способ доступа к вашей базе данных.

                  Изучите (единственный подходящий) учебник по PDO , чтобы узнать почти все, что вам нужно знать о PDO. (Искренне благодарим ведущего SO SO, @YourCommonSense, за этот замечательный ресурс по этой теме.)

                2. XSS - Очистка данных в пути ...

                  • Очиститель HTML существует уже давно и до сих пор активно обновляется. Вы можете использовать его для дезинфекции вредоносного ввода, в то же время позволяя щедро & amp; настраиваемый белый список тегов. Прекрасно работает со многими редакторами WYSIWYG, но может быть тяжелым для некоторых случаев использования.

                  • В других случаях, когда мы вообще не хотим принимать HTML / Javascript, я обнаружил, что эта простая функция полезна (и прошла несколько проверок XSS):

                    [110]

                3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

                  • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
                  • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
                4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

                5. [Тысяча сто тридцать одна]REQUEST; }

  3. XSS - Очистить данные по выходу ... если вы не гарантируете, что данные были должным образом очищены перед добавлением их в базу данных, вам необходимо очистить их перед отображением для вашего пользователя, мы можем использовать эти полезные функции PHP:

    • Когда вы вызываете echo или print для отображения предоставленных пользователем значений, используйте htmlspecialchars , если только данные не были должным образом очищены безопасным образом и не разрешено отображать HTML.
    • json_encode - это безопасный способ предоставления пользовательских значений из PHP в Javascript
  4. Вы вызываете команды внешней оболочки используя функции exec() или system() или оператор backtick ? Если это так, в дополнение к SQL-инъекции & amp; XSS у вас могут возникнуть дополнительные проблемы, связанные с пользователями, выполняющими вредоносные команды на вашем сервере . Вам нужно использовать escapeshellcmd , если вы хотите экранировать всю команду ИЛИ escapeshellarg , чтобы экранировать отдельные аргументы.

  5. [Тысяча сто тридцать одна]
4
ответ дан webaholik 26 June 2019 в 18:34
поделиться

Один прием, который может помочь в конкретном случае, когда у вас есть страница типа /mypage?id=53 и вы используете id в предложении WHERE, - это убедиться, что id определенно является целым числом, например, так:

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

Но, конечно, это устраняет только одну конкретную атаку, поэтому прочитайте все остальные ответы. (И да, я знаю, что код выше не очень хорош, но он показывает конкретную защиту)

.
16
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: