\n```\n\nБраузер автоматически отправит твои кукиз с сессией, и перевод произойдёт!\n\n## Как работает CSRF токен\n\nCSRF токен — это уникальная строка, которая:\n1. Генерируется сервером для каждого пользователя\n2. Отправляется в HTML форму\n3. Браузер должен отправить этот токен обратно в POST запросе\n4. Сервер проверяет, что токен совпадает\n\nЗлоумышленник не может узнать этот токен, потому что:\n- Он не может прочитать токен из формы (CORS ограничения)\n- Не может угадать случайный токен\n\n## Пример: Flask с CSRF защитой\n\n```python\nfrom flask import Flask, render_template, request\nfrom flask_wtf.csrf import CSRFProtect\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'secret-key'\ncsrf = CSRFProtect(app)\n\n@app.route('/transfer', methods=['GET'])\ndef transfer_form():\n return render_template('transfer.html')\n\n@app.route('/transfer', methods=['POST'])\n@csrf.protect\ndef transfer_money():\n amount = request.form.get('amount')\n recipient = request.form.get('recipient')\n return f'Перевел {amount} руб.'\n```\n\n## HTML форма с CSRF токеном\n\n```html\n
\n {{ csrf_token() }}\n \n \n \n \n \n \n \n \n
\n```\n\nФласк автоматически генерирует токен и скрывает его в поле csrf_token().\n\n## Пример: Django с CSRF защитой\n\nDjango имеет встроенную защиту:\n\n```python\nfrom django.shortcuts import render\nfrom django.views.decorators.csrf import csrf_protect\nfrom django.http import HttpResponse\n\n@csrf_protect\ndef transfer_money(request):\n if request.method == 'GET':\n return render(request, 'transfer.html')\n \n if request.method == 'POST':\n amount = request.POST.get('amount')\n recipient = request.POST.get('recipient')\n return HttpResponse(f'Перевел {amount} руб.')\n```\n\n```html\n
\n {% csrf_token %}\n \n \n \n
\n```\n\n## CSRF токен в AJAX запросах\n\n```javascript\nconst token = document.querySelector('[name=csrf_token]').value;\n\nfetch('/transfer', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRFToken': token\n },\n body: JSON.stringify({\n amount: 1000,\n recipient: 'john'\n })\n})\n.then(response => response.json())\n.then(data => console.log(data));\n```\n\n## Генерация CSRF токена вручную\n\n```python\nimport secrets\nimport hmac\n\ndef generate_csrf_token(secret_key):\n token = secrets.token_urlsafe(32)\n return token\n\ndef verify_csrf_token(token, stored_token):\n return hmac.compare_digest(token, stored_token)\n\nsecret = 'your-secret-key'\ntoken = generate_csrf_token(secret)\nprint(token)\n```\n\n## Типы CSRF токенов\n\n### 1. Двойной Submit Cookie (Double Submit Cookie)\n\n```python\ntoken = secrets.token_urlsafe(32)\nresponse.set_cookie('csrf_token', token)\nreturn render_template('form.html', csrf_token=token)\n```\n\nКлиент отправляет токен в куке и в заголовке, сервер проверяет совпадение.\n\n### 2. Синхронизация токенов (Synchronizer Token)\n\nТокен хранится в сессии сервера, сравнивается при POST запросе.\n\n### 3. SameSite Cookie флаг\n\n```python\nresponse.set_cookie('session_id', session_token, samesite='Strict')\n```\n\nЭтот флаг запрещает браузеру отправлять куку при cross-site запросах.\n\n## Лучшие практики\n\n1. **Используй фреймворк** (Flask, Django) — они имеют встроенную защиту\n2. **Включай SameSite** на всех куках\n3. **Не отключай CSRF** без веских причин\n4. **Генерируй уникальные токены** для каждого пользователя\n5. **Проверяй токены на всех формах** (GET → POST)\n6. **Логируй ошибки валидации** токенов — это может быть атака\n\nCSRF защита — это обязательный минимум безопасности для веб-приложений.","dateCreated":"2026-03-22T15:27:19.846784","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что такое CSRF токен?

2.0 Middle🔥 231 комментариев
#Безопасность

Комментарии (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 токен — это уникальная строка, которая:

  1. Генерируется сервером для каждого пользователя
  2. Отправляется в HTML форму
  3. Браузер должен отправить этот токен обратно в POST запросе
  4. Сервер проверяет, что токен совпадает

Злоумышленник не может узнать этот токен, потому что:

  • Он не может прочитать токен из формы (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 запросах.

Лучшие практики

  1. Используй фреймворк (Flask, Django) — они имеют встроенную защиту
  2. Включай SameSite на всех куках
  3. Не отключай CSRF без веских причин
  4. Генерируй уникальные токены для каждого пользователя
  5. Проверяй токены на всех формах (GET → POST)
  6. Логируй ошибки валидации токенов — это может быть атака

CSRF защита — это обязательный минимум безопасности для веб-приложений.