XSS (Cross-Site Scripting) — это уязвимость веб-приложений, которая позволяет злоумышленнику внедрять вредоносный JavaScript-код на страницы, просматриваемые другими пользователями. XSS может приводить к краже сессий, подделке запросов, перенаправлению на вредоносные сайты и другим атакам.
Основные типы XSS:
Quasar построен поверх Vue.js, что даёт ряд встроенных механизмов защиты, но требует внимательного подхода при работе с динамическим контентом.
v-html с осторожностьюДиректива v-html позволяет вставлять HTML-код напрямую в
шаблон. Это самый частый источник XSS. Прямое
использование v-html с непроверенным вводом крайне опасно.
Пример потенциально уязвимого кода:
<template>
<div v-html="userInput"></div>
</template>
Если userInput приходит от пользователя, в него можно
внедрить скрипт. Защитный подход — очистка входных
данных перед вставкой. Для этого можно использовать библиотеки,
например DOMPurify:
import DOMPurify from 'dompurify';
export default {
data() {
return {
rawInput: '',
sanitizedInput: ''
}
},
watch: {
rawInput(newVal) {
this.sanitizedInput = DOMPurify.sanitize(newVal);
}
}
}
И вставка безопасного контента:
<div v-html="sanitizedInput"></div>
Vue и, соответственно, Quasar, по умолчанию экранируют
данные, вставляемые через двойные фигурные скобки
{{ }}. Это защищает от XSS без дополнительных действий:
<p>{{ userInput }}</p>
Даже если userInput содержит
<script>alert('XSS')</script>, браузер покажет
текст, а скрипт не выполнится.
Компоненты Quasar, такие как QInput, QForm, QBtn, сами по себе не уязвимы к XSS при стандартном использовании. Однако опасность возникает при обработке пользовательского ввода:
DOMPurify для
HTML-колонок.Для дополнительной защиты рекомендуется использовать заголовок CSP, который ограничивает выполнение скриптов:
Content-Security-Policy: default-src 'self'; script-src 'self';
CSP позволяет:
Даже при безопасной фронтенд-практике серверная фильтрация обязательна. Примеры:
<script> и атрибутов
on* в текстовых полях.Quasar использует Vue Router, и XSS может возникать через параметры маршрута. Примеры мер:
params и query перед
использованием в шаблоне.encodeURIComponent для формирования
URL.<template>
<q-card>
<q-card-section>
<h6>Комментарии пользователей</h6>
<div v-for="comment in safeComments" :key="comment.id">
<p>{{ comment.author }}: {{ comment.text }}</p>
</div>
</q-card-section>
</q-card>
</template>
<script>
import DOMPurify from 'dompurify';
export default {
data() {
return {
comments: [
{ id: 1, author: 'Alice', text: '<script>alert(1)</script>Hello' },
{ id: 2, author: 'Bob', text: 'Hi there!' }
]
};
},
computed: {
safeComments() {
return this.comments.map(c => ({
...c,
text: DOMPurify.sanitize(c.text)
}));
}
}
};
</script>
В этом примере все потенциально опасные скрипты удаляются, но текст остаётся читаемым для пользователя.
v-html с непроверенными
данными без очистки.Такой подход обеспечивает комплексную защиту от большинства XSS-атак в современных приложениях на Quasar.