Какой самый лучший метод для дезинфекции ввода пользователя с помощью PHP?

932

Есть ли где-нибудь функция catchall, которая хорошо работает для дезинфекции ввода пользователя для SQL-инъекций и атак XSS, но при этом допускает определенные типы html-тегов?

  • 39
    В настоящее время, чтобы избежать внедрения SQL, используйте PDO или MySQLi.
  • 69
    Использование PDO или MySQLi недостаточно. Если вы строите свои операторы SQL с ненадежными данными, такими как select * from users where name='$name' , тогда не имеет значения, используете ли вы PDO, MySQLi или MySQL. Вы все еще в опасности. Вы должны использовать параметризованные запросы или, если необходимо, использовать механизмы экранирования ваших данных, но это гораздо менее предпочтительно.
Показать ещё 7 комментариев
Теги:
security
sql-injection
user-input
xss

18 ответов

1138
Лучший ответ

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

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

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

Третий пример может быть командами оболочки: если вы собираетесь встраивать строки (такие как аргументы) в внешние команды и вызывать их с помощью exec, то вы должны использовать escapeshellcmd и escapeshellarg.

И так далее...

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

  • 229
    «Это означает, что каждый отдельный оператор echo или print должен использовать htmlspecialchars» - конечно, вы имеете в виду «каждый ... оператор, выводящий пользовательский ввод»; htmlspecialchars () - ifying "echo 'Hello, world!';" был бы сумасшедшим;)
  • 13
    Отличный лаконичный ответ! Я съеживаюсь, когда слышу о дезинфекции, независимо от контекста.
Показать ещё 27 комментариев
177

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

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

Подробнее о предотвращении SQL-инъекции см. на моем веб-сайте http://bobby-tables.com/.

  • 13
    Или посетите официальную документацию и изучите PDO и подготовленные заявления. Крошечная кривая обучения, но если вы хорошо знаете SQL, у вас не возникнет проблем с адаптацией.
  • 2
    Для конкретного случая SQL-инъекции это правильный ответ!
Показать ещё 4 комментария
75

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

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

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

  • 17
    +1 «Вы не можете фильтровать данные вообще без контекста того, для чего они нужны». Следует повторять чаще.
46

У PHP теперь есть новые хорошие функции filter_input, которые, например, освобождают вас от поиска "конечного регулярного выражения электронной почты" теперь, когда есть встроенный тип 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');
 *  $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-сервера, например). Вероятно, вы захотите обработать это автоматически на соответствующем уровне приложения, таком как ORM. Кроме того, как упоминалось выше: для вывода в html используют другие специализированные функции php, такие как htmlspecialchars;)

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

  • 13
    Похоже, что это может быть удобный скрипт для проверки входных данных, но он совершенно не имеет отношения к вопросу.
  • 2
    с / sanatize / Sanitize / г;
Показать ещё 2 комментария
38

Нет, нет.

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

Основные правила большого пальца

  • Для SQL-запроса, свяжите параметры (как с PDO) или используйте собственную функцию экранирования для переменных запроса (например, mysql_real_escape_string())
  • Используйте strip_tags() для фильтрации нежелательных HTML
  • Сбросьте все остальные выходные данные с помощью htmlspecialchars() и помните о 2-м и 3-м параметрах здесь.
  • 1
    Таким образом, вы используете strip_tags () или htmlspecialchars () только тогда, когда знаете, что вход содержит HTML, от которого вы хотите избавиться или, соответственно, избегаете - вы не используете его для каких-либо целей безопасности, верно? Кроме того, когда вы делаете привязку, что это делает для таких вещей, как Bobby Tables? "Robert '); DROP TABLE студентов; -" Это просто избежать кавычек?
  • 2
    Если у вас есть пользовательские данные, которые войдут в базу данных, а затем будут отображаться на веб-страницах, разве они обычно не читаются намного больше, чем записаны? Для меня имеет смысл фильтровать его один раз (как входные данные) перед его сохранением, вместо того, чтобы фильтровать его каждый раз, когда вы отображаете его. Я что-то упустил или группа людей проголосовала за ненужные потери производительности в этом и принятом ответе?
Показать ещё 1 комментарий
21

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

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

Лучшим решением является использование подготовленных операторов.

  • 0
    не существует «лучшего способа» сделать что-то вроде очистки входных данных. Используйте некоторую библиотеку, html очиститель хорош. Эти библиотеки были загнаны много раз. Так что это гораздо более пуленепробиваемый, чем все, что вы можете придумать сами
  • 0
    Смотрите также bioinformatics.org/phplabware/internal_utilities/htmLawed . Насколько я понимаю, WordPress использует более старую версию: core.trac.wordpress.org/browser/tags/2.9.2/wp-includes/kses.php
18

В PHP 5.2 была введена функция filter_var.

Он поддерживает большое количество фильтров SANITIZE, VALIDATE.

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

15

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

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

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

  • 9
    Вместо этого я использую $ id = intval ($ id) :)
  • 0
    Приведение целого числа - хороший способ убедиться, что вставлены только числовые данные.
Показать ещё 1 комментарий
10

Что вы здесь описываете, это две отдельные проблемы:

  • Очистка/фильтрация пользовательских входных данных.
  • Выход из экранов.

1) Пользовательский вход всегда должен считаться плохим.

Использование подготовленных операторов или/и фильтрация с помощью mysql_real_escape_string, безусловно, обязательно. PHP также имеет filter_input, встроенный в который является хорошим местом для начала.

2) Это большая тема, и это зависит от контекста выводимых данных. Для HTML существуют такие решения, как htmlpurifier. как правило, всегда избегайте всего, что вы выводите.

Оба вопроса слишком велики, чтобы входить в один пост, но есть много сообщений, которые более подробно рассматриваются:

Способы вывода PHP

Более безопасный вывод PHP

4

Способы дезинфекции ввода пользователя с помощью PHP:

  • Используйте современные версии MySQL и PHP.

  • Установить кодировку явно:

    • $mysqli->set_charset("utf8");
      manual
    • $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);
      manual
    • $pdo->exec("set names utf8");
      manual
    • $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"
      )
      );
      manual
    • mysql_set_charset('utf8')
      [устарела в PHP 5.5.0, удалена в PHP 7.0.0].
  • Использовать безопасные кодировки:

    • Выберите utf8, latin1, ascii.., не используйте уязвимые кодировки big5, cp932, gb2312, gbk, sjis.
  • Использовать пространственную функцию:

    • Готовые заявления MySQLi:
      $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); 
      $param = "' OR 1=1 /*";
      $stmt->bind_param('s', $param);
      $stmt->execute();
    • PDO:: quote() - помещает кавычки вокруг входной строки (если требуется) и избегает специальных символов внутри ввода string, используя стиль цитирования, соответствующий базовому драйверу:

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);explicit set the character set
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);disable emulating prepared statements to prevent fallback to emulating statements that MySQL can't prepare natively (to prevent injection)
      $var = $pdo->quote("' OR 1=1 /*");not only escapes the literal, but also quotes it (in single-quote ' characters) $stmt = $pdo->query("SELECT * FROM test WHERE name = $var LIMIT 1");
    • Подготовленные отчеты PDO: vs подготовленные команды MySQLi поддерживают больше драйверов баз данных и именованных параметров:

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);explicit set the character set
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);disable emulating prepared statements to prevent fallback to emulating statements that MySQL can't prepare natively (to prevent injection) $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, принимая во внимание текущую кодировку соединения. Но рекомендуется использовать подготовленные заявления, потому что они не просто экранированные строки, а инструкция содержит полный план выполнения запроса, включая таблицы и индексы, которые он будет использовать, это оптимизированный способ.
    • Используйте одиночные кавычки ('') вокруг ваших переменных внутри вашего запроса.
  • Проверить переменную содержит то, что вы ожидаете:

    • Если вы ожидаете целого числа, используйте:
      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() - выполнить регулярное соответствие выражения,
    • Напишите свою собственную функцию проверки.
4

Если вы используете PostgreSQL, вход с PHP может быть экранирован с помощью pg_escape_string()

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

Из документации (http://php.net/manual/es/function.pg-escape-string.php):

pg_escape_string() реализует строку для запроса базы данных. Он возвращает escape-строку в формате PostgreSQL без кавычек.

  • 1
    pg_escape_literal () - рекомендуемая функция для использования с PostgreSQL.
3

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

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

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

  • XSS - санируйте данные по пути в...

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

    • В других случаях, когда мы вообще не хотим принимать HTML/Javascript, я нашел эту простую функцию полезной (и прошел несколько проверок против 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; }

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

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

3

Самый простой способ избежать ошибок при дезинфекции входных данных и экранировании данных - использовать фреймворк PHP, например Symfony, Nette и т.д. или часть этой структуры (механизм шаблонов, уровень базы данных, ORM).

Шаблонный движок, например Twig, или по умолчанию у Latte есть выход, - вам не нужно решать вручную, если вы правильно ускользнул от вашего вывода в зависимости от контекста (HTML или Javascript часть веб-страницы).

Framework автоматически дезинфицирует ввод, и вы должны использовать переменные $_POST, $_GET или $_SESSION напрямую, но через механизм, такой как маршрутизация, обработка сеансов и т.д.

И для уровня базы данных (модели) существуют рамки ORM, такие как Doctrine или обертки вокруг PDO, например Nette Database.

Подробнее об этом вы можете узнать здесь Что такое программная среда?

2

Просто хотел добавить, что в вопросе выхода escaping, если вы используете php DOMDocument, чтобы сделать свой вывод html, он автоматически выйдет в правильном контексте. Атрибут (value = "") и внутренний текст строки <span> не равны. Чтобы быть в безопасности от XSS, прочитайте следующее: Защитный чехол OWASP XSS

1

Вы никогда не дезинфицируете ввод.

Вы всегда дезинфицируете выход.

Преобразования, которые вы применяете к данным, чтобы сделать их безопасными для включения в инструкцию SQL, полностью отличаются от тех, которые вы применяете для включения в HTML, полностью отличаются от тех, которые вы применяете для включения в Javascript, полностью отличаются от тех, которые вы применяете для включения в LDIF полностью отличаются от тех, которые вы применяете для включения в CSS, полностью отличаются от тех, которые вы применяете для включения в электронную почту....

В любом случае проверить ввод - решить, следует ли его принять для дальнейшей обработки или сообщить пользователю, что это неприемлемо. Но не применяйте никаких изменений к представлению данных, пока он не покинет землю PHP.

Долгое время кто-то пытался изобрести один-единственный механизм для экранирования данных, и мы закончили с " magic_quotes", который не обеспечивал надлежащее удаление данных для всех целей вывода и приводил к другой установке, требующей работы другого кода.

0
function clean_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
  • 1
    Я добавил немного больше информации к этому практическому примеру.
0

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

-3

Лучший метод BASIC для дезинфекции ввода пользователя с помощью 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;
    }
  • 0
    Таким образом, вы используете real_escape_string() для экранирования специальных символов SQL, а затем запускаете sanitizeString() который запускает stripslashes() и удаляет любое экранирование, которое было сделано. Поэтому в основном добавьте защиту SQL, затем удалите ее на том же этапе. Почему вы даже используете стрип-слэш? Эти две функции - ужасный способ дезинфекции, даже для базовой санитарии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню