Основы защиты от CSRF-атак: примеры на языках программирования

Основы защиты от CSRF-атак: примеры на языках программирования

CSRF (Cross-Site Request Forgery) — одна из самых опасных атак на веб-приложения. Она направлена на выполнение нежелательных действий от имени пользователя без его ведома. В этой статье вы узнаете:

  • Что такое CSRF и как она работает.
  • Чем угрожает CSRF вашему приложению.
  • Как защититься от CSRF-атак на примерах с использованием разных языков программирования.

Что такое CSRF?

CSRF — это атака, при которой злоумышленник заставляет пользователя отправить запрос на сервер без его ведома. Этот запрос выглядит легитимным, так как содержит пользовательские сессии или токены авторизации.

Пример атаки:

  1. Пользователь авторизован в интернет-банке.
  2. Злоумышленник отправляет пользователю ссылку на поддельный сайт.
  3. Поддельный сайт выполняет запрос на перевод денег, используя сессию пользователя.

Результат — сервер принимает запрос как действие пользователя и выполняет его.

Чем опасны CSRF-атаки?

CSRF-атаки могут:

  • Переводить деньги без согласия пользователя.
  • Изменять пароли.
  • Удалять данные или менять настройки аккаунтов.

Как защититься от CSRF-атак?

Основные способы защиты:

  1. Использование CSRF-токенов.
  2. Проверка Referer-заголовка.
  3. Ограничение запросов только на определенные HTTP-методы (POST, PUT, DELETE).

Давайте разберем эти способы с примерами на разных языках.

1. Использование CSRF-токенов

PHP (Laravel)

Laravel автоматически защищает формы от CSRF-атак с помощью встроенных токенов.

Пример кода

// HTML-форма с CSRF-токеном
<form method="POST" action="/transfer">
    @csrf
    <input type="text" name="amount" placeholder="Сумма">
    <button type="submit">Отправить</button>
</form>

Laravel автоматически проверяет токены через middleware VerifyCsrfToken. Если токен отсутствует или неверен, запрос будет отклонен.

Django (Python)

В Django также есть встроенная защита.

Пример кода

# views.py
from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def transfer_view(request):
    if request.method == 'POST':
        # Обработка формы
        pass
    return render(request, 'transfer.html')

В шаблоне нужно добавить токен

<form method="POST" action="/transfer">
    {% csrf_token %}
    <input type="text" name="amount" placeholder="Сумма">
    <button type="submit">Отправить</button>
</form>

Node.js (Express)

Для защиты можно использовать пакет csurf.

Пример кода

const express = require('express');
const csurf = require('csurf');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));

// Middleware для CSRF-защиты
const csrfProtection = csurf();
app.use(csrfProtection);

app.get('/form', (req, res) => {
    res.send(`
        <form method="POST" action="/transfer">
            <input type="hidden" name="_csrf" value="${req.csrfToken()}">
            <input type="text" name="amount" placeholder="Сумма">
            <button type="submit">Отправить</button>
        </form>
    `);
});

app.post('/transfer', (req, res) => {
    res.send('Токен успешно проверен!');
});

2. Проверка Referer-заголовка

Некоторые серверы проверяют Referer, чтобы убедиться, что запрос отправлен с доверенного домена.

Python (Flask)

from flask import request, abort

@app.route('/transfer', methods=['POST'])
def transfer():
    referer = request.headers.get('Referer')
    if not referer or 'yourdomain.com' not in referer:
        abort(403)  # Запрос отклонен
    # Обработка запроса
    return 'Успешно!'

Этот метод прост, но Referer-заголовок может быть отключен в браузере или изменен злоумышленником.

3. Ограничение запросов на определенные HTTP-методы

Для выполнения критически важных операций лучше использовать только POST, PUT или DELETE.

Пример конфигурации Nginx

location /transfer {
    limit_except POST {
        deny all;
    }
}

Таким образом, только POST-запросы будут обрабатываться сервером.

Заключение

CSRF-атаки представляют серьезную угрозу безопасности вашего веб-приложения. Чтобы защититься:

  • Всегда используйте CSRF-токены.
  • Проверяйте заголовки запросов.
  • Ограничивайте запросы на критически важные действия.

Эти меры помогут минимизировать риски и сохранить безопасность данных ваших пользователей.

Пример для старта: Если вы используете фреймворк вроде Laravel или Django, встроенные инструменты уже обеспечивают защиту от CSRF. Просто не забывайте включать их и тестировать свои приложения!

Ссылки

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x