Веб-приложения уязвимы к различным угрозам безопасности, одной из которых является подделка межсайтовых запросов (CSRF). Атаки CSRF происходят, когда злоумышленник обманом заставляет браузер пользователя выполнять непреднамеренные запросы от его имени. Чтобы снизить этот риск, разработчики должны внедрить надежные механизмы защиты CSRF. В этой статье мы рассмотрим несколько методов предотвращения атак CSRF на примерах кода.
Метод 1: шаблон токена синхронизатора
Шаблон токена синхронизатора — это широко используемый метод предотвращения атак CSRF. Он включает в себя создание уникального токена CSRF для каждого сеанса пользователя и его связывание с каждой отправкой формы. Сервер проверяет полученный токен на соответствие тому, который хранится в сеансе пользователя. Вот пример на PHP:
// Generating and storing the CSRF token
$csrfToken = bin2hex(random_bytes(32));
$_SESSION['csrfToken'] = $csrfToken;
// Adding the CSRF token to the form
echo '<form action="/process" method="POST">';
echo '<input type="hidden" name="csrfToken" value="' . $csrfToken . '">';
// ...other form fields...
echo '</form>';
// Validating the CSRF token on form submission
if ($_POST['csrfToken'] !== $_SESSION['csrfToken']) {
// CSRF token is missing or incorrect
header('HTTP/1.0 403 Forbidden');
die('CSRF token missing or incorrect.');
}
Метод 2: файлы cookie двойной отправки
Метод двойной отправки файлов cookie предполагает установку двух файлов cookie: один содержит идентификатор сеанса пользователя, а другой — токен CSRF. При отправке формы сервер проверяет, соответствует ли токен CSRF в файле cookie токену в полезных данных запроса. Вот пример на JavaScript:
// Setting the CSRF token and session ID cookies
document.cookie = 'sessionId=' + sessionId;
document.cookie = 'csrfToken=' + csrfToken;
// Adding the CSRF token to the form
var form = document.createElement('form');
form.method = 'POST';
form.action = '/process';
var csrfInput = document.createElement('input');
csrfInput.type = 'hidden';
csrfInput.name = 'csrfToken';
csrfInput.value = csrfToken;
form.appendChild(csrfInput);
// ...other form fields...
document.body.appendChild(form);
form.submit();
// Validating the CSRF token on the server
if ($_POST['csrfToken'] !== $_COOKIE['csrfToken']) {
// CSRF token is missing or incorrect
header('HTTP/1.0 403 Forbidden');
die('CSRF token missing or incorrect.');
}
Метод 3. Атрибут файла cookie SameSite
Атрибут SameSite используется для ограничения использования файлов cookie собственными контекстами, предотвращая их отправку в межсайтовых запросах. Установив для атрибута SameSite значение «строгий» или «нестрогий» для файлов cookie сеанса и токенов CSRF, вы можете смягчить атаки CSRF. Вот пример на Python с использованием платформы Flask:
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/process', methods=['POST'])
def process():
csrf_token = request.cookies.get('csrf_token')
if request.form['csrf_token'] != csrf_token:
# CSRF token is missing or incorrect
return make_response('CSRF token missing or incorrect.', 403)
# ...process the request...
return 'Success'
if __name__ == '__main__':
app.run()
Защита веб-приложений от атак CSRF имеет решающее значение для обеспечения целостности данных и доверия пользователей. В этой статье мы обсудили три эффективных метода предотвращения атак CSRF: шаблон токена синхронизатора, файлы cookie двойной отправки и атрибут cookie SameSite. Внедряя эти методы, разработчики могут повысить безопасность своих веб-приложений и защитить пользовательские данные.
Не забывайте всегда быть в курсе последних рекомендаций по обеспечению безопасности и регулярно проверять свое приложение на наличие уязвимостей.