Безопасность — это не галочка «ну у нас есть @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-инъекции — всё прикрыто. Но почти всегда проблема не в фреймворке, а в «хитром» коде разработчика, который решил обойти встроенные механизмы.
0 комментариев