Здравствуйте Хочу обсудить стандартные варианты атак и защит, которые должны быть в любом микро-фреймворке, который претендует на практическое использование: SQL-инъекции CSRF-атаки Стандартные проверки данных в форме [rules() в Yii2] на стороне фронта (JS) и на стороне (PHP) Защита от спам-действий от зарегистрированного пользователя (например есть какой-то сложный запрос, который может сделать только зарегистрированный пользователь - и злоумышленник начитает отправлять этот запрос сотни раз в секунду, может быть сразу с нескольких аккаунтов) Защита от спам-действий от незарегистрированного пользователя (например, перебор имен и паролей на странице входа) Какие-нибудь еще есть? P.S. Сделал защиту от всех вариантов, кроме последнего. Над ним еще думаю: делать логи отправки POST данных с IP, и проверять количество аналогичных запросов с аналогичным IP. Если их больше n за единицу времени n - не принимать любые POST данные с этого IP в течении n времени. Вроде бы это самый простой и оптимальный вариант, который никак не повлияет на индексацию сайта поисковыми системами.
А как сделал защиту от спам действия зарегестрированного пользователя? Таблица с временем действяи? и считаем - если например больше 5 действий за минуту то в блок?
Двумя способами (они более узконаправленные именно на тот проект, который делаю - браузерную MMORPG): Такие действия как написание комментария или поста на сайте расходую энергию, которая постепенно регенерирует. Соответственно пользователь физически не может отправить 1000 комментарий за минуту Игровые действия (там, где могут быть тяжелые запросы) происходят на одной странице сайта, и все через метод POST. Сделал защиту от спама просто - пользователь делает действие (оно логируется), проверяется, когда он делал предыдущее действие, если разница между последним действием меньше 0.3 секунд - действие блокируется а пользователь получает сообщение "вы совершаете слишком много действий в секунду!" В будущем планирую доработать последний вариант, и дополнительно считать сколько уведомлений получил пользователь - если больше 10 за час - то он автоматически блокируется на день, к примеру.
PHP: /** * Check that path is really inside that folder, and return path if yes, and false if not. * @param String $path Path to check * @param String $folder Path to folder, where $path have to be in * @return bool|string False on fail, or $path on success * */ function checkPathIsInFolder($path, $folder) { if ($path === '' OR $path === null OR $path === false OR $folder === '' OR $folder === null OR $folder === false) { /* can't use empty() because it can be a string like "0", and it's valid path */ return false; } $path = str_replace('\\', '/', $path); $folder = str_replace('\\', '/', $folder); $folderRealpath = realpath($folder); $pathRealpath = realpath($path); if ($pathRealpath === false OR $folderRealpath === false) { // Some of paths is empty return false; } if (strlen(rtrim($pathRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR) < strlen(rtrim($folderRealpath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR)) { // File path is shorter that a folder path. This file can't be inside that folder. return false; } if (substr($pathRealpath, 0, strlen($folderRealpath)) !== $folderRealpath) { // Path to a folder of file is not equal to a path to a folder where it have to be located return false; } // OK return $pathRealpath; } --- Добавлено --- это моё сокровище
PHP: $a = [ '', null, false ]; if ( in_array ( $path, $a, 1 ) OR in_array ( $folder, $a, 1 ) ) { ... }