Ваше Laravel-додаток піддається атакам з боку різних ботів, які надсилають численні некоректні запити. Багато з них намагаються знайти вразливі місця, зокрема відомі ендпоінти, такі як /wp-admin/, login.php або .env
Основну частину часу веб-сервер просто повертає відповідь 404 Not Found. Але він все ще опрацьовує ці запити. Якщо ваш сайт популярний, ви можете отримувати десятки або навіть сотні таких запитів за одну секунду
Протягом останнього місяця я працював над покращенням часу завантаження для laravelshift.com. За принципом 80/20, більшість часу завантаження йде на обробку запитів. Так, виконання запитів до бази даних чи складні обчислення займають час, але це нічого в порівнянні з загальним часом, який витрачається на з'єднання, обробку та відповідь на веб-запит
Моя мета — зменшити кількість запитів до веб-сервера. У наступних статтях я розгляну більше стратегій. У цьому матеріалі я розповім, як запобігти некоректним запитам, що дозволить звільнити ресурси сервера для обробки коректних запитів. Менше навантаження на сервер також важливо, якщо ви використовуєте послуги з оплатою за запит, такі як Nightwatch
Ця ідея виникла після прочитання статті Майкла Дирінди про захист ендпоінтів Laravel Cloud. Він виявив багато некоректних запитів у своїх логах, що шкодило його ліміту запитів
Він налаштував правило безпеки в Cloudflare для блокування запитів до цих ендпоінтів. Це спонукало мене задуматися: "А що, якщо я зможу заблокувати всі некоректні запити?" Я запам'ятав урок зі свого курсу безпеки комп'ютерних систем: краще визначити, що дозволено, ніж що заборонено. Дозволене — це відомий, обмежений список, а заборонене — це невідомий, безмежний список
Ми знаємо, які ендпоінти дозволені в нашому Laravel-додатку. Їх можна отримати, запустивши команду artisan route:list. Перетворити це на дійсне правило досить просто. Будь-який ендпоінт з параметрами, такими як зв'язування моделі, може стати шаблоном зі зірочкою. Усе інше — точні збіги
Наприклад, такі маршрути:
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::view('/faq', 'faq');
Route::get('shifts', [ShiftController::class, 'index'])->name('shifts');
Route::get('workbench/{task:slug}', [TaskController::class, 'show'])->name('task.show');
Можна представити таким чином:
not (http.request.uri.path in {"/" "/faq" "/shifts"} or http.request.uri.path wildcard "/workbench/*")
Я активував таке правило безпеки в Cloudflare для laravelshift.com. Тепер мій додаток дозволяє трафік лише до існуючих ендпоінтів. Усе інше блокується Cloudflare. За перший тиждень було заблоковано понад 5000 некоректних запитів, що звільнило ресурси мого сервера для обробки коректних запитів
Як завжди, це має свої мінуси. Безкоштовний тариф Cloudflare дозволяє лише дії типу Block, що відображає сторінку помилки Cloudflare з відповіддю 403 Forbidden. Ідеально було б відповідати простим 404 Not Found. Але я спокійний у зв'язку з трафіком, який я блокую. Однак легітимні користувачі з помилками в адресі чи зламаними посиланнями отримають цю сторінку помилки Cloudflare. Це можна зменшити, забезпечивши перенаправлення для поширених помилок або перейменованих шляхів
Якщо ви зацікавлені в створенні такого правила, JT Smith працює над пакетом, який надає команду для генерації правила для вашого додатка. Він також оптимізує правило та скорочує його до 4096 символів, які дозволяє Cloudflare