Безопасность — это не галочка «ну у нас есть @csrf в форме». Это постоянная гонка: ты закрываешь дырку — завтра кто-то найдёт новую. Laravel сильно помогает, но если слепо полагаться «фреймворк сам всё сделает», то рано или поздно словишь проблем. Ниже — не мантры из доки, а то, что реально встречается в проектах.

CSRF: не забывай про токен

Laravel сам пихает CSRF-токены во все формы, если ты используешь @csrf. Проблема в том, что люди любят «попроще» — вставляют форму через голый HTML, а токен забывают. Итог — уязвимость.

<form method="POST" action="/profile">
    @csrf
    <input type="text" name="name">
</form>

Хочешь отправлять данные через JS/AJAX? Не забудь передавать токен вручную. Очень много багов было именно на этом месте.

XSS: {{ $safe }} vs {!! $notSafe !!}

Laravel экранирует вывод автоматически, пока ты используешь {{ $var }}. Но стоит кому-то «для красоты» бахнуть {!! $var !!} — и привет, скрипты в продакшене.

Пример:

{{ $user->name }}  // безопасно
{!! $user->name !!} // ты только что открыл сайт для XSS

Если уж вставляешь HTML, пропускай через e() или фильтруй заранее.

SQL-инъекции: забудь про concat

Eloquent и Query Builder защищают тебя параметрами:

DB::table('users')->where('votes', '>', 100)->get();

Но как только кто-то решает «написать руками через DB::select и конкатенировать строку» — ты вляпался:

// не делай так
DB::select("SELECT * FROM users WHERE email = '$email'");

Пусть даже быстро работает, но дырка откроется первой же попыткой.

Аутентификация и авторизация

Не пиши велосипеды. Laravel из коробки даёт Auth::attempt(), Gate, Policy. Десять строк своей логики проверки доступа — и привет, баг. Особенно если кто-то решит «ну я же проверил только role_id».

Пароли: хэшируй или проиграл

Laravel по умолчанию юзает bcrypt/argon2. Если где-то в коде встречаешь md5($password) — лучше беги. Ну или переписывай.

Ограничение логина (throttle)

Если дать атакующему бесконечно подбирать пароль — тебе конец. В Laravel есть встроенный ThrottleRequests и для логина это must have.

Перенаправления: validate!

Laravel проверяет redirect через intended(), но я видел код вроде:

return redirect($_GET['url']);

Это открытое приглашение на фишинг. Никогда так не делай.

Итог

Laravel многое делает за тебя: CSRF, XSS, SQL-инъекции — всё прикрыто. Но почти всегда проблема не в фреймворке, а в «хитром» коде разработчика, который решил обойти встроенные механизмы.