Директива v-html используется для вставки HTML-кода
напрямую в шаблон компонента Vue. Она позволяет рендерить динамически
сформированный HTML, что особенно полезно при работе с содержимым,
полученным с сервера, или при создании сложных интерфейсов в приложениях
на базе Element Plus.
Однако использование v-html несёт потенциальные риски
безопасности, связанные с XSS-атаками (Cross-Site
Scripting). Любой HTML-код, который вставляется без фильтрации,
может содержать вредоносные скрипты. Поэтому важно сочетать
функциональность v-html с безопасными практиками.
Перед вставкой данных через v-html необходимо убедиться,
что HTML безопасен. Наиболее распространённые подходы:
Использование библиотек для очистки HTML
Популярные библиотеки, такие как DOMPurify,
позволяют безопасно очищать HTML, удаляя потенциально опасные элементы и
атрибуты. Пример интеграции:
import DOMPurify from 'dompurify';
export default {
data() {
return {
rawHtml: 'Безопасный текст
'
};
},
computed: {
sanitizedHtml() {
return DOMPurify.sanitize(this.rawHtml);
}
}
};
В шаблоне:
Ключевой момент: никогда не вставлять данные напрямую из внешнего источника без очистки.
Разрешение только конкретных тегов и атрибутов
DOMPurify позволяет ограничивать разрешённые элементы, что дополнительно повышает безопасность:
DOMPurify.sanitize(this.rawHtml, {ALLOWED_TAGS: ['p', 'strong', 'em', 'ul', 'li']});
Это исключает возможность внедрения или
.
В Element Plus часто требуется отображать HTML внутри компонентов,
таких как el-tooltip,
el-popover,
el-card. В этих случаях
v-html может использоваться, но с учётом безопасности:
Примечания:
Если HTML обновляется динамически, необходимо применять очистку на каждом шаге:
watch: {
rawHtml(newVal) {
this.sanitizedHtml = DOMPurify.sanitize(newVal);
}
}
Это гарантирует, что любое новое содержимое будет безопасным перед вставкой.
Даже при очистке HTML могут быть опасны inline-обработчики событий,
например . DOMPurify
по умолчанию удаляет такие атрибуты, но при кастомной конфигурации
необходимо внимательно проверять список разрешённых атрибутов.
el-card и v-html
el-popover и динамический контент
el-table и безопасный HTML в ячейках
Важно: каждая ячейка обрабатывается отдельно и должна проходить очистку.
v-html для контента от ненадёжных
источников без фильтрации.v-html,
когда это возможно.Паттерн с отдельным компонентом для HTML-контента:
// SafeHtml.vue
Использование в Element Plus:
Такой подход позволяет централизовать логику
очистки, минимизируя риск ошибок и XSS-уязвимостей при
использовании v-html.