За последние 24 часа нас посетил 19141 программист и 1639 роботов. Сейчас ищут 912 программистов ...

Фильтрация текстовых данных

Тема в разделе "PHP для новичков", создана пользователем Sergey_Tsarev, 29 июл 2017.

  1. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Всем, привет! Вот такой вот вопрос у меня к вам. Как вы фильтруете входящие текстовые данные? Есть данные из всяких там чекбоксов, радиокнопок и прочего. Там все достаточно понятно. Данные как правило числовые. Прогоняю их через:

    PHP:
    1. filter_var($var, FILTER_VALIDATE_INT);
    Чаще с указанными доп. опциями:

    PHP:
    1. filter_var($var, FILTER_VALIDATE_INT, ['options' => ['default' => 0, 'min_range' => 0, 'max_range' => 5]]);
    Если данные строковые прогоняю их через функцию, которая сверяет значение с вайтлистом. Если тру, можно записывать в базу. Если нет, выдаем ошибку.

    А вот с текстовыми данными сложнее. Так как по сути записывать придется текст введенный пользователем. Какие фильтры лучше использовать, чтобы обезопасить себя от SQL-инъекций и XSS? Поделитесь опытом кому не жалко)
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    подготовленные запросы (https://secure.php.net/manual/ru/mysqli.prepare.php https://secure.php.net/manual/ru/pdo.prepare.php) или экранирование https://secure.php.net/manual/ru/pdo.quote.php https://secure.php.net/manual/ru/mysqli.real-escape-string.php
    Когда выводишь данные из базы используй https://secure.php.net/manual/ru/function.htmlspecialchars.php так как в базе обычно принято хранить оригинальные данные от пользователя, а при выводи экранировать опять.
     
    Sergey_Tsarev нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    используй фильтр инпут / array.
    Причина:
    недостаток фильтрВара в проверке существовании пост/гет ключей, и придется множественно проверять в isset ( var, var var, ... )

    https://php.ru/manual/function.filter-input-array.html
     
    Sergey_Tsarev нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    не множественно
    *Дополнительно
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ещё, если нужно выводить данные, содержащие HTML, но обезопасить себя от скриптов в них (XSS), есть такая штука: http://htmlpurifier.org/
     
    Sergey_Tsarev и denis01 нравится это.
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    одна пхп функция уже не спасает ? htmlspechialchars как то так
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    читай внимательно сообщение. htmlspechialchars убивает HTML, а HtmlPurifier убивает только плохой html, хороший оставляет. Что считать плохим, что хорошим - определяет программист. Примерно как strip_tags со списком разрешённых тегов, только ещё можно гибко настроить атрибуты и прочее.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    интересно где такое применяется, со содержимым хтмл документом в бд
     
  9. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Я, конечно, знал про подготовленные запросы. Но сейчас решил изучить вопрос поподробнее. То есть, как я понял, при использовании подготовленных запросов, запрос на сервер и сами данные идут по отдельности. То есть даже если переменная будет содержать SQL-инъекцию, она не сможет изменить запрос и переменная просто запишется в таблицу как простой текст. Правильно я понял?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  11. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    То есть, грубо говоря, можно переменную проверить только на существование, и записывать в базу?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Через плейсхолдеры, да
     
    Sergey_Tsarev нравится это.