За последние 24 часа нас посетили 22509 программистов и 1143 робота. Сейчас ищут 611 программистов ...

Дополнительная проверка перед работой PDO

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 28 май 2019.

  1. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Работаю с MySQL через PDO. Есть данные которые приходят из кукисов и которые нужно сверить, т.к. это данные в любом случае приходят из вне, к ним нужно относиться с наибольшим вниманием.
    Запрос к БД делается через prepare и с именованными параметрами.
    Нужно ли делать дополнительную проверку данный перед отправкой в prepare? Если да, то что желательно сделать?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В принципе, если данные участвуют только в условии выборки, а не записываются в базу и с применением плейсхолдеров, то риски существенно уменьшаются, но лично я фильтрую любые данные, которые приходят с клиента (filter_input() / filter_var() и т.д. + (int) / (float) для числовых), независимо от того, как и где они будут дальше задействованы, чего и вам желаю.
     
    AlexandrS нравится это.
  3. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Если используешь PDO достаточно фильтровать вредоносные js скрипты, которые могут выполниться если данные из базы потом выводятся в браузер.
     
    AlexandrS нравится это.
  4. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    В данном случае, да, речь о выборке, хотя конечно будет и запись данных из формы.
    Если с цифрами всё как-то по проще, то вот проверка строк, в которые могут пытаться запихнуть всё что угодно интереснее.
    Т.е. к примеру есть форма в которой юзер вводит что-то и есть админка, в которой я этот текст буду видеть. По сути нужно себя обезопасить себя таким образом, чтоб при отображении текста не отрабатывался код, который возможно могут вписать в форму.
    Есть смысл в функциях:
    ?
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Вы куда-то не туда полезли. Для сверки подготовленного запроса достаточно.
    --- Добавлено ---
    Плюс, как выше написали, можно дополнительно проверять/фильтровать контент на недопустимые символы и т.п. После этого в нек. случаях можно даже подготовленный запрос не использовать.
     
    AlexandrS нравится это.
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Смысл в функциях есть, но только там, где они уместны. Если, к примеру, у вас в админке используется WYSIWYG-редактор, то strip_tags как-то не очень покатит. Для таких случаев, можно использовать такие решения, как HTML Purifier
    --- Добавлено ---
    И кстати, данные, если мы не говорим об инъекциях, опасны не столько на входе, сколько при выводе.
     
    AlexandrS нравится это.
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Не надо фильтровать скрипты, если только не нужна возможность использовать ограниченное количество тегов html. Просто при выводе htmlspecialchars.
     
    AlexandrS и [vs] нравится это.
  8. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Т.е. по сути в базу пусть пишется всё как приходит, единственное можно (filter_input() / filter_var() и т.д. + (int), а вот отдавать уже через htmlspecialchars
    Я правильно понял?
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    +
    --- Добавлено ---
    1. filter_input_array
    2. prepare DB
    3. html filter
     
    AlexandrS нравится это.
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @AlexandrS Ага. Исключение - если поле должно содержать html, т.е. выводится потом с заданным форматированием. Тогда либо даёшь strip_tags с указанием разрешённых тегов, либо используешь что-то более продвинутое, например, HTMLPurifier
     
    AlexandrS нравится это.
  11. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    (int) / (float) то понятно, filter_input() / filter_var() что фильтрует у вас?
     
  12. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. filter_input_array ( INPUT_POST, [
    2.         'user' => FILTER_DEFAULT,
    3.         'x' => [
    4.             'filter' => FILTER_CALLBACK,
    5.             'options' => function ( $v )
    6.             {
    7.                 if ( in_array ( $v, range ( 1, 73 ) ) )
    8.                 {
    9.                     return (int)$v;
    10.                 }
    11.                
    12.                 return null;
    13.             }
    14.         ],
    15.         'y' => [
    16.             'filter' => FILTER_CALLBACK,
    17.             'options' => function ( $v )
    18.             {
    19.                 if ( in_array ( $v, range ( 1, 54 ) ) )
    20.                 {
    21.                     return (int)$v;
    22.                 }
    23.                
    24.                 return null;
    25.             }
    26.         ],
    27.         'color' => [
    28.             'filter' => FILTER_CALLBACK,
    29.             'options' => function ( $v )
    30.             {
    31.                 if ( in_array ( $v, range ( 1, 17 ) ) )
    32.                 {
    33.                     return (int)$v;
    34.                 }
    35.                
    36.                 return null;
    37.             }
    38.         ]
    39.     ] )
     
  14. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Я вот что не могу сообразить, есть код:

    PHP:
    1. <?php
    2.     function foo(){
    3. $string = "test,+dg...";
    4.         $string = filter_var($string, FILTER_VALIDATE_REGEXP, [
    5.                                                                     'options' => [
    6.                                                                                     "regexp" => "/[a-z0-9-,;=.]+$/is"
    7.                                                                                 ]
    8.                                                                 ]);
    9.         return $string;
    10.     }
    11.  
    12.     echo foo();
    13. ?>
    По сути должно выдать FALSE, но возвращает вводную строку, где-то я туплю, но не могу понять в каком именно месте.
    Мне нужно чтоб проходили строки с допустимыми символами a-z0-9-,;=.
    в строке есть +, но при этом всё нормально проходит валидацию.
     
  15. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Я не обозначил начало строки в регулярке, поэтому она дергала любой понравившейся ей кусок и выдавала TRUE, нужно было:
    PHP:
    1. "regexp" => "/^[a-z0-9-,;=.]+$/is"