Вы можете безопасно удалять теги html, используя атрибут песочницы iframe .
Идея в том, что вместо того, чтобы пытаться пересмотреть нашу строку, мы используем преимущества встроенного в браузер синтаксического анализатора, вставляя текст в элемент DOM и затем запрашивая свойство textContent
/ innerText
этого элемента. *
Наилучшим подходящим элементом для вставки нашего текста является встроенная программа-песочница, таким образом мы можем предотвратить любое выполнение произвольного кода (также известный как XSS ).
Недостатком этого подхода является то, что он работает только в браузерах.
Вот что я придумала (не проверено в бою):
const stripHtmlTags = (() => {
const sandbox = document.createElement("iframe");
sandbox.sandbox = "allow-same-origin"; // <--- This is the key
sandbox.style.setProperty("display", "none", "important");
// Inject the sanbox in the current document
document.body.appendChild(sandbox);
// Get the sandbox's context
const sanboxContext = sandbox.contentWindow.document;
return (untrustedString) => {
if (typeof untrustedString !== "string") return "";
// Write the untrusted string in the iframe's body
sanboxContext.open();
sanboxContext.write(untrustedString);
sanboxContext.close();
// Get the string without html
return sanboxContext.body.textContent || sanboxContext.body.innerText || "";
};
})();
Использование ( демо ):
console.log(stripHtmlTags(`<img onerror='alert("could run arbitrary JS here")' src='bogus'>XSS injection :)`));
console.log(stripHtmlTags(`<script>alert("awdawd");</` + `script>Script tag injection :)`));
console.log(stripHtmlTags(`<strong>I am bold text</strong>`));
console.log(stripHtmlTags(`<html>I'm a HTML tag</html>`));
console.log(stripHtmlTags(`<body>I'm a body tag</body>`));
console.log(stripHtmlTags(`<head>I'm a head tag</head>`));
console.log(stripHtmlTags(null));