За последние 24 часа нас посетили 21897 программистов и 1009 роботов. Сейчас ищут 754 программиста ...

Проверка перед вставкой в запрос с помощью Регулярный выражений

Тема в разделе "Регулярные выражения", создана пользователем miltorg, 8 сен 2019.

  1. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    в принципе, на этом можно и остановится.
    нет смысла обсуждать код который написан просто так, без понимания как он вообще должен работать.
    он не решает реальную задачу - валидацию Имени и Фамилии. он проверяет чтото, что даже автор кода незнает что он проверяет.
    он не пропускает то что должен пропускать.
    исходную задачу код решить не может. следовательно рано проверять какуюто безопасность.
    глупо проверять безопасность у формы, если она ещё даже не работает как должна.
     
  2. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Ура. А то я тут уже устал - бесплатным обучением заниматься.
    --- Добавлено ---
    Код с онлайна убрал
     
  3. Emilien

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

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    PHP:
    1. if (preg_match('/\W/u', $imja)) $imja='Vasja';
    Открываем документацию и смотрим какие значения может вернуть функция preg_match.
    Возвращает 1, если есть совпадение с шаблоном, 0 если нет, или FALSE в случае ошибки.
    Теперь смотрим какие это могут быть ошибки https://www.php.net/manual/ru/function.preg-last-error.php
    Поврежденные данные UTF-8 приводят к PREG_BAD_UTF8_ERROR и функция возвращает FALSE.
    http://sandbox.onlinephpfunctions.com/code/94f22c78b3ef1629a39bf53bc46fc02c77f2f6e1
    PHP:
    1. $imja="!@#\x80";
    2.  
    3. if (preg_match('/\W/u', $imja)) $imja='Vasja';
    4.  
    5. var_dump($imja);
    Ещё песочница http://tpcg.io/LDcp7I

    PHP:
    1. $id=1;
    2. $imja="";
    3. $familija="' /*\x80*/ -- '";
    При таких значениях один запрос может стереть имена и фамилии всех юзеров.
    Код (Text):
    1. UPDATE test SET imja='', familija='' /*�*/ -- '' where id=1
     
    villiwalla нравится это.
  4. ElisDN

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

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Вот @Emilien и сломал потенциально все ваши сайты, сделанные за 20 лет. Так что считайте свой код правильным и идеальным дальше.
     
  5. acho

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

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    1. Добро пожаловать в монгу.
    2. Не знаете как работает база. То, что вы указали в пхпмайадминчике 11 - ничего не значит. Реально ограничение в 11 символов сработает только в одном случае. При некой правильной настройке поля. Параметр не указываю, гугл в помощь.
    3. Я передумал сотрудничать даже за 1 евро.
     
  6. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Это круто. Это я не знал. А без u сработает?
    Вот так:
    if(preg_match('/\W/',$imja))$imja='Vasja';
    --- Добавлено ---
    Без u - срабатывает.
    То есть мой метод применим только если нет Юнкода.
    Круто. Спасибо вам
    --- Добавлено ---
    Для Юнкода нужно чтоб переделать всё наоборот?
    Сейчас попробую.
    --- Добавлено ---
    Работает:

    Код (Text):
    1. $imja="'ж!@#\x80";
    2. #$imja="hhhhhh";
    3.  
    4. if (preg_match('/\w/u', $imja)) ;
    5. else $imja='Vasja';
    6.  
    7. print $imja;
    --- Добавлено ---
    @Emilien, вы единственный из тех кто мне тут писал - с которым можно поговорить. Спасибо ещё раз.

    А в моём новом написании нет уязвимостей?
    --- Добавлено ---
    Вы даже не поняли что:
    1. Это только для Юнкода.
    2. Это только для Самописов.

    Я даже вспомнить не могу сейчас - есть ли у меня самописы. Я всё пишу на Друпале
     
  7. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Переписал код:

    PHP:
    1. <?php
    2. $mysqli = new mysqli("localhost", "root", "root", "CODINGGROUND");
    3. $mysqli->query("
    4.    CREATE TEMPORARY TABLE test (
    5.        id INT NOT NULL,
    6.        imja varchar(64) NOT NULL,
    7.        familija varchar(64) NOT NULL
    8.    )
    9. ");
    10. $mysqli->query("INSERT INTO test VALUES (1, 'Ivan', 'Ivanov')");
    11.  
    12.  
    13. $id=1;
    14. $imja="!!! sql !!!'/*\x80*/'";
    15. $familija="Прохоров";
    16. if (preg_match('/\D/', $id)) $id=103;
    17. if (preg_match('/\w/u', $imja)); else $imja='Vasja';
    18. if (preg_match('/\w/u', $familija)); else $familija='Pupkin';
    19.  
    20. $r = $mysqli->query("UPDATE test SET imja='$imja', familija='$familija' where id=$id");
    21. $r = $mysqli->query("SELECT * FROM test where id=$id")->fetch_object();
    22.  
    23. print_r($r);
    --- Добавлено ---
    Теперь это самы безопасный код в мире для Юнкода.
    До этого - был самый безопасный код в мире не для Юнкода.
    --- Добавлено ---
    А ещё ведь можно написать соответствие 0 или 1. Это даже правильней. Сейчас напишу
     
  8. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я чет не могу понять зачем столько сложностей?)
     
  9. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Нет. С FALSE код получается больше и менее наглядный
    --- Добавлено ---
    Чтоб понимать механизмы. Неужели вам это не интересно? Я прям балдею от того что я сегодня узнал про ошибки Юнкода.
    Это ведь круто!
    --- Добавлено ---


    Для всех.
    Жду 3 дня. Если не сломаете - пойдём дальше
     
  10. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я даже не могу вспомнить случая что бы мне когда нибудь понадобились не подготовленные запросы в мускуле))
     
  11. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    И. Самое главное. Я вообще не вижу тут сложностей - Наоборот. Огромное упрощение кода.
    --- Добавлено ---
    Выше есть пример. Если хотите конструктивно участвовать в дискуссии - пишите код. Всё остальное - словеса.
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Для начала вам нужно понять базовый механизм: наличие / отсутствие эксплойта не является критерием существования уязвимости. Вам могут предоставить конкретную реализацию, как сделал @Emilien, могут не предоставить, могут просто не захотеть тратить время на её поиски - всё это не имеет значение. Уязвимость с довольно большим набором векторов атаки уже существует. Всё. Словоблудие - это попытки оспорить этот простой и очевидный всем, кроме вас, факт.
     
  13. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    А вы, вероятно не понимаете что Эксплойт - это УГОЛОВНОЕ преступление.
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    угон машины - это УГОЛОВНОЕ преступление
    противоугонные системы НЕ НУЖНЫ
    --- Добавлено ---
    есть встроенные инструменты, которые развивались долгие годы и отдебажены до блеска
    а, твои ссаные регулярки (в качестве защиты от взлома) уже взломали дважды, а ты всё их отстаиваешь

    тебе никак не вдолбить в голову, что есть инструменты, которые защищают на 99.9%
    а ты не идеален и поэтому твоя регулярка может иметь уязвимости просто за счет человеческого факотора

    то что твои говносайты не взломали ни разу за 20 лет - это потому что ты нахер никому не упал
    взлом - это работа
    а работать просто так ни кто не хочет
     
    Алекс8 и mkramer нравится это.
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    И весь сыр бор, потому что подготовленное выражение сделать, и не парится - ну очень сложно. Если кто-то дойдёт до этого места, ещё раз:
    • Всегда задавайте кодировку соединения с БД. для mysqli - mysqli::set_charset, для PDO сейчас можно прямо в DSN указывать, смотрите в доках
    • Всегда используйте подготовленные запросы (mysqli:: prepare, PDO:: prepare).
    • Любите фреймворки/пакеты, которые это делают за вас
    • Теперь SQL-инъекции вам не страшны
    • Если заказчиком отдельно прописано условие на логин, пароль, имя пользователя и т.п., прямым текстом в ТЗ, есть смысл проверить его с помощью регулярных выражений, что не отменяет всего вышеперечисленного. Т.е. даже если вы проверили регуляркой, всё равно работаем с БД через подготовленные запросы. Завтра требования изменятся, и новая регулярка может пропустить потенциально опасные символы.
     
  16. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    привет)) я как сел за ларку)) не могу остановится ее любить)) она воплощение всех моих мечт о всех моих велосипедах))
     
  17. ElisDN

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

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Код на Ларке:
    Код (PHP):
    1. public function edit(User $user)
    2. {
    3.     return view('users.edit', compact('user'));
    4. }
    5.  
    6. public function update(User $user, Request $request)
    7. {
    8.     $input = $request->validate([
    9.         'first_name' => 'required',
    10.         'last_name' => 'required',
    11.     ]);
    12.     $user->update($input);
    13.     return redirect()->route('users.show', [$user]);
    14. }
    И никаких проблем.
     
    #67 ElisDN, 9 сен 2019
    Последнее редактирование: 9 сен 2019
    Алекс8 нравится это.
  18. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    реквест отдельно вынести - еще красивее будет))
     
  19. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Так. Стоп.
    Я всегда задаю кодировку соединения. Всегда. Иначе на нерусских серверах - кракозябры.
    Я всегда прописываю кодировку в Базе - по той же причине
    Что получится при попытке записать в такую Юнкодную Базу неюнкодных символов?
    Сейчас протестирую на реальной базе
    --- Добавлено ---
    Не понимаю. На реальной базе ничего не ломается!
    Даже в первом варианте.
    Почему?
     
  20. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
  21. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Хотелось бы полный код с формой и пр. - чтоб заценить мощь и красоту. - Я серьёзно.
     
  22. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    HTML такой же будет. Показаны методы контроллера, которые делают всю чистую работу. Черновая, типа подготовленных выражений, скрыта в глубинах фреймворка. Модель будет что-то вроде
    PHP:
    1. class User extends Model {
    2.    protected $fillable = ['first_name', 'last_name'];
    3. }
     
  23. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    То есть ради формы с 3 полями нужно городить несколько файлов и подключать фреймворк.
    Я правильно вас понял?
     
  24. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Написать пару файлов - это не страшно, особенно если в одном из них три строчки. Я файлов не боюсь. Хуже, когда в один всё свалено, чем когда на много разбито.

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

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

    Вот, к примеру, как будет в методе контроллера выглядеть пагинация:
    PHP:
    1. class UsersController {
    2.   // Другие методы контроллера
    3.   // ...
    4.    public function usersList()
    5.    {
    6.          return view("users.list", User::paginate(20));
    7.    }
    8. }
    Всё. Laravel сам произведёт вычисления количества страниц, сам посчитает смещение, сам сделает нужный запрос.

    Ещё раз. Если задача ограничивается обработкой одной формы - напишу один запрос руками, не развалюсь. Подготовленный, обычно через PDO, мне больше нравится, как там подготовленные запросы реализованы - можно передать все параметры прямо в PDOStatament::execute(), а не биндить по одному. Если в проекте предполагается делать что-то ещё, то воспользуюсь тем, что умные люди уже всё сделали за меня. Но я уже давно не занимаюсь задачами, ограничивающимися одной несчастной формой.
    --- Добавлено ---
    @ElisDN тоже не занимается проектами из одной формы :)
     
    #73 mkramer, 9 сен 2019
    Последнее редактирование: 9 сен 2019
  25. miltorg

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

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Это где я писал?
    Я сайты на Друпале делаю. Там про это думать вообще не нужно.
    Я это всё спросил именно потому, что изредка бывает что нужна простенькая форма.
    --- Добавлено ---
    Я это писал. Там 3 строчки кода и 1 запрос.
     
  26. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    А посчитать количество страниц, и проверить, не превышает ли запрошенная? Если что, я тоже могу написать это без фреймворка, формула элементарная, согласен. Хочу ли - другой вопрос.
    --- Добавлено ---
    А, плюс Laravel ещё сам просчитывает smart пагинацию, чтоб не выводить все 100 номеров страниц. Вот это уже я самостоятельно делать не люблю. Где пропустить, где не пропустить, и т.п.