За последние 24 часа нас посетили 26672 программиста и 1544 робота. Сейчас ищут 892 программиста ...

Свой микрофреймворк: какие дыры нужно закрывать

Тема в разделе "PHP для новичков", создана пользователем Walk, 14 мар 2018.

  1. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Здравствуйте

    Хочу обсудить стандартные варианты атак и защит, которые должны быть в любом микро-фреймворке, который претендует на практическое использование:
    • SQL-инъекции
    • CSRF-атаки
    • Стандартные проверки данных в форме [rules() в Yii2] на стороне фронта (JS) и на стороне (PHP)
    • Защита от спам-действий от зарегистрированного пользователя (например есть какой-то сложный запрос, который может сделать только зарегистрированный пользователь - и злоумышленник начитает отправлять этот запрос сотни раз в секунду, может быть сразу с нескольких аккаунтов)
    • Защита от спам-действий от незарегистрированного пользователя (например, перебор имен и паролей на странице входа)
    Какие-нибудь еще есть?

    P.S.
    Сделал защиту от всех вариантов, кроме последнего. Над ним еще думаю: делать логи отправки POST данных с IP, и проверять количество аналогичных запросов с аналогичным IP. Если их больше n за единицу времени n - не принимать любые POST данные с этого IP в течении n времени.

    Вроде бы это самый простой и оптимальный вариант, который никак не повлияет на индексацию сайта поисковыми системами.
     
    glorsh66 нравится это.
  2. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    А как сделал защиту от спам действия зарегестрированного пользователя?
    Таблица с временем действяи? и считаем - если например больше 5 действий за минуту то в блок?
     
  3. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    Двумя способами (они более узконаправленные именно на тот проект, который делаю - браузерную MMORPG):
    • Такие действия как написание комментария или поста на сайте расходую энергию, которая постепенно регенерирует. Соответственно пользователь физически не может отправить 1000 комментарий за минуту
    • Игровые действия (там, где могут быть тяжелые запросы) происходят на одной странице сайта, и все через метод POST. Сделал защиту от спама просто - пользователь делает действие (оно логируется), проверяется, когда он делал предыдущее действие, если разница между последним действием меньше 0.3 секунд - действие блокируется а пользователь получает сообщение "вы совершаете слишком много действий в секунду!"
    В будущем планирую доработать последний вариант, и дополнительно считать сколько уведомлений получил пользователь - если больше 10 за час - то он автоматически блокируется на день, к примеру.
     
    glorsh66 нравится это.
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    PHP:
    1.     /**
    2.      * Check that path is really inside that folder, and return path if yes, and false if not.
    3.      * @param String $path Path to check
    4.      * @param String $folder Path to folder, where $path have to be in
    5.      * @return bool|string False on fail, or $path on success
    6.      *
    7.      */
    8.     function checkPathIsInFolder($path, $folder) {
    9.         if ($path === '' OR $path === null OR $path === false OR $folder === '' OR $folder === null OR $folder === false) {
    10.             /* can't use empty() because it can be a string like "0", and it's valid path */
    11.             return false;
    12.         }
    13.         $path = str_replace('\\', '/', $path);
    14.         $folder = str_replace('\\', '/', $folder);
    15.         $folderRealpath = realpath($folder);
    16.         $pathRealpath = realpath($path);
    17.         if ($pathRealpath === false OR $folderRealpath === false) {
    18.             // Some of paths is empty
    19.             return false;
    20.         }
    21.         if (strlen(rtrim($pathRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR) < strlen(rtrim($folderRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR)) {
    22.             // File path is shorter that a folder path. This file can't be inside that folder.
    23.             return false;
    24.         }
    25.         if (substr($pathRealpath, 0, strlen($folderRealpath)) !== $folderRealpath) {
    26.             // Path to a folder of file is not equal to a path to a folder where it have to be located
    27.             return false;
    28.         }
    29.         // OK
    30.         return $pathRealpath;
    31.     }
    --- Добавлено ---
    это моё сокровище
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
    PHP:
    1. $a = [ '', null, false ];
    2.  
    3. if ( in_array ( $path, $a, 1 ) OR in_array ( $folder, $a, 1 ) )
    4. {
    5.     ...
    6. }
     
  6. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    а что за игра?)) расскажи)
     
    glorsh66 нравится это.
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    PHP:
    1. if (!strlen($path) || !strlen($folder)) {
    2.  
    3. }
     
    igordata нравится это.
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @Deonis отличное решение!
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.814
    Симпатии:
    1.332
    Адрес:
    Лень
  10. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    браузерная MMORPG

    пока лишь сырые наработки, ничего достойного для демонстрации нет)
     
  11. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    а тематика?))
     
  12. Walk

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

    С нами с:
    7 сен 2008
    Сообщения:
    452
    Симпатии:
    86
    фентези