Какой самый лучший метод для дезинфекции ввода пользователя с помощью PHP? - PullRequest
1049 голосов
/ 25 сентября 2008

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

Ответы [ 19 ]

8 голосов
/ 27 мая 2015

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

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

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

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

6 голосов
/ 17 июля 2015

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

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

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

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

Подробнее об этом можно прочитать здесь - Что такое программный каркас?

4 голосов
/ 17 декабря 2017

Функция перехвата отсутствует, поскольку необходимо решить несколько проблем.

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

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

  2. 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; }

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

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

3 голосов
/ 21 августа 2018

Никогда не доверяйте пользовательским данным.

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

Функция trim() удаляет пробелы и другие предопределенные символы с обеих сторон строки.

Функция stripslashes() удаляет обратную косую черту

Функция htmlspecialchars() преобразует некоторые предопределенные символы в объекты HTML.

Предопределенные символы:

& (ampersand) becomes &
" (double quote) becomes "
' (single quote) becomes '
< (less than) becomes &lt;
> (greater than) becomes &gt;
3 голосов
/ 18 ноября 2014

Просто хотел добавить, что по теме экранирования вывода, если вы используете php DOMDocument для вывода html-кода, он автоматически выйдет в нужном контексте. Атрибут (value = "") и внутренний текст не равны. Чтобы быть в безопасности от XSS, прочитайте это: Шпаргалка по профилактике OWASP XSS

2 голосов
/ 19 февраля 2018

Вы никогда не очищаете ввод.

Вы всегда очищаете вывод.

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

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

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

0 голосов
/ 15 мая 2019

Я вижу, что 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);
}
0 голосов
/ 11 июня 2017

Лучший базовый метод для очистки пользовательского ввода с помощью 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 голосов
/ 25 сентября 2008

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

...