🔐 CSRF: защита от подделки запросов
Laravel по умолчанию защищает от CSRF-атак во всех POST, PUT, PATCH, DELETE-запросах. Всё, что нужно — вставить @csrf в формы:
<form method="POST" action="/submit">
@csrf
...
</form>
Если используешь JS-фреймворк, не забывай отправлять CSRF-токен в заголовке:
axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]') .getAttribute('content');
Совет: не отключай VerifyCsrfToken middleware без крайней необходимости.
🧼 XSS: защита от скриптов в HTML
Самый частый способ XSS — пользователь вводит <script>>, а ты его отображаешь без фильтрации.
Laravel по умолчанию экранирует всё, что выводится через {{ }}:
{{ $user->name }} // безопасно
{!! $user->bio !!} // опасно, если не фильтруешь
Правило простое:
— {{ }} — безопасно
— <{!! !!} — только если ты точно знаешь, что делаешь
Если нужно отобразить HTML, используй проверенные фильтры, например strip_tags(), или кастомные Blade-компоненты, где ты сам контролируешь контент.
📥 Валидация данных: фильтрация на входе
Никогда не доверяй данным из запроса. Даже если форма выглядит нормальной, пользователь может легко отправить что угодно через Postman.
Используй Form Request классы:
php artisan make:request StorePostRequest
public function rules()
{
return [
'title' => 'required|string|max:255',
'body' => 'required|string',
];
}
И в контроллере:
public function store(StorePostRequest $request)
{
// данные уже валидированы
}
Удобно, безопасно, и код чище.
✔ SQL-инъекции: Eloquent защищает, но не расслабляйся
Laravel использует PDO и привязку параметров, так что обычные SQL-инъекции тебе не страшны, если ты используешь Eloquent или Query Builder:
User::where('email', $request->input('email'))->first(); // безопасно
Но если ты пишешь сырой SQL — будь внимателен:
// НЕПРАВИЛЬНО — опасно
DB::select("SELECT * FROM users WHERE email = '$email'");
// ПРАВИЛЬНО — безопасно
DB::select("SELECT * FROM users WHERE email = ?", [$email]);
🔒 Headers и конфиги
В .env не забывай отключить отладку в продакшене:
APP_DEBUG=false
Убедись, что настроен HTTPS и APP_URL=https://твой_сайт
Хедеры можно добавить через middleware или .htaccess:
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
✅ Бонус: rate limiting
Laravel легко позволяет ограничивать количество запросов. Например:
Route::middleware('throttle:60,1')->group(function () {
Route::post('/login', 'AuthController@login');
});
Это значит: не больше 60 запросов в минуту с одного IP.
✅ Вывод
Laravel многое делает за тебя, но ответственность всё равно на тебе.
Проверяй входящие данные, не открывай доступ к тому, что не нужно, и не игнорируй базовые настройки.
Меньше «а, и так сойдёт» — больше «а вдруг?»
Так живут проекты, которые не ломаются при первой же бот-атаке или баге.