Санитизация (очистка) пользовательского ввода — ключевой аспект безопасности и стабильности веб-приложений. В контексте использования Element Plus она особенно важна, так как библиотека активно взаимодействует с формами, модальными окнами и компонентами ввода. Неправильная обработка данных может привести к XSS-уязвимостям, нарушению целостности данных и непредсказуемому поведению интерфейса.
Компонент <el-form> вместе с
<el-form-item> предоставляет возможность
централизованной проверки данных. Валидационные правила задаются через
свойство rules:
<el-form :model="formData" :rules="rules" ref="formRef">
<el-form-item label="Имя" prop="name">
<el-input v-model="formData.name"></el-input>
</el-form-item>
</el-form>
const rules = {
name: [
{ required: true, message: 'Имя обязательно', trigger: 'blur' },
{ min: 3, max: 20, message: 'Длина имени от 3 до 20 символов', trigger: 'blur' },
{ pattern: /^[a-zA-Zа-яА-Я\s]+$/, message: 'Только буквы', trigger: 'blur' }
]
};
Ключевой момент: проверка на регулярные выражения позволяет предотвращать ввод нежелательных символов ещё до отправки данных на сервер.
Даже при использовании регулярных выражений пользователи могут вставлять HTML-код или скрипты. Для защиты используется функция санитизации:
import DOMPurify from 'dompurify';
const sanitizedInput = DOMPurify.sanitize(userInput);
Применение DOMPurify совместимо с Element Plus, например, для
текстовых областей <el-input type="textarea"> и
rich-text компонентов, позволяя безопасно рендерить пользовательский
контент.
Важно: не полагаться только на клиентскую проверку — сервер должен повторять санитизацию.
Element Plus активно использует динамическое
обновление интерфейса через v-model и слоты. При этом
особое внимание уделяется:
@input,
@change)el-input с prefix-icon,
maxlength)vue-the-mask или v-money)Пример с маской телефона:
<el-input v-model="formData.phone" placeholder="Телефон">
<template #prefix>+7</template>
</el-input>
В обработчике можно очищать ввод от посторонних символов:
watch(() => formData.phone, (val) => {
formData.phone = val.replace(/\D/g, '');
});
Использование ElMessage и ElMessageBox позволяет информировать пользователя о некорректном вводе:
if (!isValid(formData.email)) {
ElMessage.error('Неверный формат email');
}
При больших формах удобно объединять валидацию и санитизацию в единую функцию:
function validateAndSanitize(formData) {
const sanitized = {
name: DOMPurify.sanitize(formData.name),
email: DOMPurify.sanitize(formData.email)
};
const valid = rulesCheck(sanitized);
if (!valid) {
ElMessage.warning('Некорректные данные');
}
return valid ? sanitized : null;
}
Если используется <el-input type="textarea"> с
rich-text плагинами, необходимо:
<script>,
<iframe>)<b>,
<i>, <p>, <ul>,
<li>)const cleanHtml = DOMPurify.sanitize(richTextContent, {
ALLOWED_TAGS: ['b', 'i', 'p', 'ul', 'li']
});
ElDialog и динамически создаваемые формы требуют особого внимания:
Vuex, Pinia)const handleSubmit = () => {
const sanitizedData = validateAndSanitize(formData);
if (sanitizedData) {
store.commit('addUser', sanitizedData);
}
};
Соблюдение этих принципов позволяет использовать Element Plus безопасно и эффективно, минимизируя риски XSS и обеспечивая стабильную работу интерфейса даже при работе с большими объемами пользовательских данных.