Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# CSRF токены: защита веб-приложений
CSRF (Cross-Site Request Forgery) токен — это механизм безопасности, который защищает приложение от атак, когда злоумышленник заставляет пользователя выполнить нежелательное действие на другом сайте.
Суть проблемы: CSRF атака
Представь: ты залогинен в банке (example-bank.com), затем заходишь на вредоносный сайт (evil.com). Этот сайт может содержать скрытую форму:
<!-- На evil.com -->
<form action="https://example-bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="recipient" value="attacker">
<input type="submit" value="Click me!">
</form>
<script>
document.forms[0].submit();
</script>
Браузер автоматически отправит твои кукиз с сессией, и перевод произойдёт!
Как работает CSRF токен
CSRF токен — это уникальная строка, которая:
- Генерируется сервером для каждого пользователя
- Отправляется в HTML форму
- Браузер должен отправить этот токен обратно в POST запросе
- Сервер проверяет, что токен совпадает
Злоумышленник не может узнать этот токен, потому что:
- Он не может прочитать токен из формы (CORS ограничения)
- Не может угадать случайный токен
Пример: Flask с CSRF защитой
from flask import Flask, render_template, request
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret-key'
csrf = CSRFProtect(app)
@app.route('/transfer', methods=['GET'])
def transfer_form():
return render_template('transfer.html')
@app.route('/transfer', methods=['POST'])
@csrf.protect
def transfer_money():
amount = request.form.get('amount')
recipient = request.form.get('recipient')
return f'Перевел {amount} руб.'
HTML форма с CSRF токеном
<form method="POST" action="/transfer">
{{ csrf_token() }}
<label>Сумма:</label>
<input type="number" name="amount" required>
<label>Получатель:</label>
<input type="text" name="recipient" required>
<button type="submit">Отправить</button>
</form>
Фласк автоматически генерирует токен и скрывает его в поле csrf_token().
Пример: Django с CSRF защитой
Django имеет встроенную защиту:
from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect
from django.http import HttpResponse
@csrf_protect
def transfer_money(request):
if request.method == 'GET':
return render(request, 'transfer.html')
if request.method == 'POST':
amount = request.POST.get('amount')
recipient = request.POST.get('recipient')
return HttpResponse(f'Перевел {amount} руб.')
<form method="POST">
{% csrf_token %}
<input type="number" name="amount" required>
<input type="text" name="recipient" required>
<button type="submit">Отправить</button>
</form>
CSRF токен в AJAX запросах
const token = document.querySelector('[name=csrf_token]').value;
fetch('/transfer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': token
},
body: JSON.stringify({
amount: 1000,
recipient: 'john'
})
})
.then(response => response.json())
.then(data => console.log(data));
Генерация CSRF токена вручную
import secrets
import hmac
def generate_csrf_token(secret_key):
token = secrets.token_urlsafe(32)
return token
def verify_csrf_token(token, stored_token):
return hmac.compare_digest(token, stored_token)
secret = 'your-secret-key'
token = generate_csrf_token(secret)
print(token)
Типы CSRF токенов
1. Двойной Submit Cookie (Double Submit Cookie)
token = secrets.token_urlsafe(32)
response.set_cookie('csrf_token', token)
return render_template('form.html', csrf_token=token)
Клиент отправляет токен в куке и в заголовке, сервер проверяет совпадение.
2. Синхронизация токенов (Synchronizer Token)
Токен хранится в сессии сервера, сравнивается при POST запросе.
3. SameSite Cookie флаг
response.set_cookie('session_id', session_token, samesite='Strict')
Этот флаг запрещает браузеру отправлять куку при cross-site запросах.
Лучшие практики
- Используй фреймворк (Flask, Django) — они имеют встроенную защиту
- Включай SameSite на всех куках
- Не отключай CSRF без веских причин
- Генерируй уникальные токены для каждого пользователя
- Проверяй токены на всех формах (GET → POST)
- Логируй ошибки валидации токенов — это может быть атака
CSRF защита — это обязательный минимум безопасности для веб-приложений.