Мне нужно проверить ввод HTML в веб-приложении с помощью JavaScript.
Что я сделал до сих пор, основываясь на этом вопросе : я использую стороннюю библиотеку, sanitize-html , чтобы очистить ввод и затем сравнить его с исходным.Если они различаются, Html недействителен.
const isValidHtml = (html: string): boolean => {
let sanitized = sanitizeHtml(html, sanitizationConfig);
sanitized = sanitized.replace(/\s/g, '').replace(/<br>|<br\/>/g, ''); // different browser's behavior for <br>
html = html.replace(/\s/g, '').replace(/<br>|<br\/>/g, '');
return sanitized === html;
}
Вышеупомянутый метод отлично работает с неэкранированным Html, но не с экранированным.
isValidHtml('<'); // false
isValidHtml('<'); // true
isValidHtml('<script>'); // false
isValidHtml('<script>'); // true, this should be false also!!!
- Я что-то упустил с этимметод?
- Есть ли лучший способ выполнить эту задачу?
РЕДАКТИРОВАТЬ: Как подсказывает @brad в комментариях, я сначала попытался декодировать HTML:
decodeHtml(html: string): string {
const txt = document.createElement('textarea');
txt.innerHTML = html;
const decodedHtml = txt.value;
txt.textContent = null;
return decodedHtml;
}
и затем позвоните isValid(decodedHtml)
, я получил такой результат:
isValidHtml('<'); // false
isValidHtml('<'); // false, this should be true!!!
isValidHtml('<script>'); // false
isValidHtml('<script>'); // false