CSRF (Cross-Site Request Forgery) — это тип атаки, при которой злоумышленник заставляет браузер пользователя выполнять нежелательные действия на доверенном сайте, где пользователь аутентифицирован. В современных веб-приложениях защита от CSRF критически важна, особенно при работе с формами и AJAX-запросами. Quasar, как фреймворк на базе Vue.js, предоставляет инструменты для интеграции CSRF токенов в клиентскую часть.
Генерация токена на сервере Сервер создает уникальный CSRF токен для каждой сессии пользователя. Токен должен быть случайным, сложно предсказуемым и привязанным к конкретной сессии.
Передача токена клиенту Обычно токен отправляется вместе с HTML страницей через скрытое поле формы или в заголовке ответа. В SPA (Single Page Application) приложениях, построенных на Quasar, токен часто передается через API-запрос при аутентификации.
Включение токена в запросы Все защищенные POST, PUT, PATCH и DELETE запросы должны включать CSRF токен. Сервер сверяет полученный токен с сохраненным значением и разрешает или отклоняет запрос.
Quasar рекомендует использовать axios для выполнения
HTTP-запросов. CSRF токены можно автоматически включать в заголовки
запросов:
import axios from 'axios';
const api = axios.create({
baseURL: 'https://example.com/api',
withCredentials: true
});
// Получение CSRF токена из мета-тега
const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
api.interceptors.request.use(config => {
if (token) {
config.headers['X-CSRF-TOKEN'] = token;
}
return config;
});
Пояснение:
withCredentials: true обеспечивает отправку cookies
вместе с запросом, что необходимо для сессий.X-CSRF-TOKEN соответствует стандартной
практике передачи токена на сервер.Quasar предоставляет компоненты форм: q-form,
q-input, q-btn. Включение CSRF токена в формы
осуществляется через скрытое поле:
<q-form @submit="submitForm">
<input type="hidden" name="_csrf" :value="csrfToken">
<q-input filled v-model="formData.name" label="Имя"></q-input>
<q-btn type="submit" label="Отправить"></q-btn>
</q-form>
<script>
export default {
data() {
return {
formData: {
name: ''
},
csrfToken: document.querySelector('meta[name="csrf-token"]').getAttribute('content')
};
},
methods: {
submitForm() {
this.$axios.post('/submit', {
...this.formData,
_csrf: this.csrfToken
}).then(response => {
console.log('Успешно отправлено', response.data);
}).catch(error => {
console.error('Ошибка при отправке', error);
});
}
}
};
</script>
Ключевые моменты:
_csrf для серверной
проверки.В сложных приложениях CSRF токен может обновляться без перезагрузки страницы. Для этого используется отдельный API-эндпоинт, возвращающий новый токен:
async function refreshCsrfToken() {
const response = await api.get('/csrf-token');
const newToken = response.data.token;
document.querySelector('meta[name="csrf-token"]').setAttribute('content', newToken);
return newToken;
}
Далее новый токен подставляется в заголовки всех последующих запросов и скрытые поля форм. Такой подход предотвращает ошибки при долгих сессиях.
Single Page Application В SPA нет полной перезагрузки страницы, поэтому мета-теги могут устаревать. Токен должен храниться в состоянии приложения, например, в Vuex или Pinia.
AJAX-запросы Все POST,
PUT, PATCH, DELETE запросы через
Axios должны включать актуальный CSRF токен.
Обновление после аутентификации После входа пользователя токен может измениться. Нужно обновить локальное состояние и скрытые поля форм.
CSRF токены в сочетании с компонентами Quasar позволяют создавать безопасные формы и запросы, сохраняя при этом удобство SPA-разработки. Их корректная интеграция обеспечивает защиту от подделки запросов и поддерживает надежную работу клиент-серверной архитектуры.