Ответ
CSRF (Cross-Site Request Forgery) токен — это уникальный, секретный и непредсказуемый ключ, который сервер генерирует для каждого пользовательского сеанса. Он добавляется в формы или запросы, требующие аутентификации, чтобы защитить от подделки межсайтовых запросов.
Как это работает:
- Сервер генерирует токен и привязывает к сессии пользователя
- Токен встраивается в форму как скрытое поле (
<input type="hidden" name="_csrf" value="токен">) - При отправке формы сервер проверяет соответствие токена в запросе и сессии
Пример в Express.js:
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });
app.get('/form', csrfProtection, (req, res) => {
res.render('form', { csrfToken: req.csrfToken() });
});
app.post('/process', csrfProtection, (req, res) => {
// Запрос будет отклонен, если токен неверен
});
В форме:
<form action="/process" method="POST">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<!-- остальные поля формы -->
</form> Ответ 18+ 🔞
Да ты послушай, что за дичь придумали эти умники от безопасности! Сидит где-то чувак, пьёт кофе, и ему в голову приходит: «А давайте-ка мы будем каждому пользователю на сайте выдавать по секретному, блядь, пропуску! Чтобы всякие левые пидарасы не могли от его имени запросы слать!». И назвали это CSRF-токен, ёпта.
Вот смотри, как это работает, если на пальцах:
- Ты заходишь на сайт, авторизуешься. Сервер тебе в сессию (или в куку) тихонечко подсовывает этот самый токен — случайную хуйню вроде
a7b3f1. Это типа твой личный пароль на один запрос. - Тебе показывают форму, скажем, для перевода денег. И в эту форму, как скрытое поле, засунут этот токен. Ты его не видишь, но он там есть, хитрая жопа.
- Ты жмёшь «Отправить». Вместе с суммой и номером счёта летит на сервер и этот самый
a7b3f1. - Сервер получает это всё, достаёт из твоей сессии ожидаемый токен, сравнивает с тем, что пришёл. Если сошлось — всё чики-пуки, операция проходит. Если нет — ну, извини, дружок, но это похоже на хуйню. Запрос отбрасывается, потому что доверия к нему — ноль ебать.
А без этого токена что? Да любая мартышлюшка с другого сайта могла бы тебе подсунуть форму, которая от твоего имени бабки переводит. Ты бы даже не заметил, пока не проверишь выписку. Страшно, да? Вот именно.
Теперь, как это в коде выглядит, например, на Node.js с Express. Смотри, не пугайся, тут всё просто:
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });
// Показываем форму — генерируем и передаём токен
app.get('/form', csrfProtection, (req, res) => {
res.render('form', { csrfToken: req.csrfToken() }); // Вот он, родимый!
});
// Принимаем данные — проверяем, не подсунули ли нам хуй с винтом
app.post('/process', csrfProtection, (req, res) => {
// Если токен не совпал — сюда даже не зайдём, получим ошибку 403
// Значит, всё ок, можно работать с req.body
});
А в самой HTML-форме (шаблон) это будет выглядеть так, ебать мои старые костыли:
<form action="/process" method="POST">
<!-- Вот эта строчка — наша главная защита от распиздяев! -->
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<!-- А тут уже твои обычные поля: -->
<input type="text" name="amount">
<button type="submit">Перевести</button>
</form>
Вот и вся магия. Суть в том, что зловредный сайт этот самый {{csrfToken}} узнать не может — он же генерится уникальным для каждой сессии. Поэтому подделать запрос от твоего имени у него не выйдет. Гениально и просто, как тапок. Главное — не забыть это говно вставить куда надо.