CSRF (Cross-Site Request Forgery) — это тип атаки, при котором злоумышленник заставляет пользователя выполнить нежелательное действие на доверенном сайте, где он авторизован. Основной защитой от таких атак является использование CSRF-токенов — уникальных случайных значений, которые сервер генерирует для каждого сеанса или формы и проверяет при получении запросов, изменяющих состояние.
На практике токен обычно передаётся сервером в HTML-странице. Наиболее распространённый подход — хранение токена в мета-теге:
<meta name="csrf-token" content="123abc456def">
В jQuery его можно извлечь следующим образом:
var csrfToken = $('meta[name="csrf-token"]').attr('content');
Теперь переменная csrfToken содержит актуальное значение
токена, которое можно использовать в AJAX-запросах.
Для защиты серверных маршрутов, изменяющих данные (POST, PUT, DELETE), токен нужно отправлять вместе с запросом. jQuery позволяет это сделать несколькими способами.
1. Через headers в отдельном
запросе:
$.ajax({
url: '/update-profile',
type: 'POST',
headers: {
'X-CSRF-TOKEN': csrfToken
},
data: {
username: 'new_username',
email: 'new_email@example.com'
},
success: function(response) {
console.log('Профиль обновлён', response);
},
error: function(xhr) {
console.error('Ошибка запроса', xhr);
}
});
2. Через глобальную настройку jQuery
($.ajaxSetup)
Если на странице выполняется множество AJAX-запросов, удобнее настроить передачу токена глобально:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': csrfToken
}
});
После этого каждый последующий запрос jQuery автоматически будет включать CSRF-токен.
CSRF-токен можно также добавлять напрямую в формы, чтобы при отправке POST-запроса через AJAX он передавался вместе с данными:
$('#myForm').submit(function(event) {
event.preventDefault();
var formData = $(this).serializeArray();
formData.push({ name: '_csrf', value: csrfToken });
$.ajax({
url: $(this).attr('action'),
type: 'POST',
data: $.param(formData),
success: function(response) {
console.log('Данные успешно отправлены', response);
},
error: function(xhr) {
console.error('Ошибка при отправке формы', xhr);
}
});
});
Использование метода serializeArray() обеспечивает
корректное получение всех полей формы, после чего токен добавляется
вручную.
Для проектов с большим количеством форм и AJAX-вызовов часто применяется подход, когда токен автоматически включается во все POST-запросы:
$(document).ajaxSend(function(event, xhr, settings) {
if (settings.type === 'POST') {
xhr.setRequestHeader('X-CSRF-TOKEN', csrfToken);
}
});
Этот приём гарантирует, что независимо от того, где инициирован запрос, сервер всегда получает актуальный CSRF-токен.
Если токен обновляется сервером после каждой операции или после авторизации, необходимо следить за его актуальностью. jQuery позволяет динамически обновлять переменную токена при изменении DOM:
function refreshCsrfToken() {
csrfToken = $('meta[name="csrf-token"]').attr('content');
}
$(document).on('ajaxComplete', function() {
refreshCsrfToken();
});
Такой подход предотвращает ситуации, когда устаревший токен вызывает ошибки на сервере.
CSRF-токены в связке с jQuery обеспечивают надёжную защиту при работе
с AJAX-запросами и формами. Использование глобальной настройки
$.ajaxSetup, динамическое обновление токена и правильная
интеграция с формами минимизируют риск атак CSRF и упрощают работу с
безопасными запросами на стороне клиента.