@schukai/monster
Version:
Monster is a simple library for creating fast, robust and lightweight websites.
55 lines (46 loc) • 1.48 kB
JavaScript
/**
* Helper function to sanitize HTML content by removing potentially dangerous content.
* @param {string} htmlString - The HTML string to sanitize.
* @param {Object} [options={}] - Optional configuration options.
* @returns {string} The sanitized HTML string.
*/
export function sanitizeHtml(htmlString, options = {}) {
const parser = new DOMParser();
const doc = parser.parseFromString(htmlString, "text/html");
options = Object.assign(
{
blockedTags: ["script", "iframe", "object", "embed", "link", "meta"],
},
options,
);
const blockedTags = options.blockedTags || [];
blockedTags.forEach((tag) => {
doc.querySelectorAll(tag).forEach((el) => el.remove());
});
// remove dangerous attributes
const dangerousAttr = /^on/i;
const urlAttrs = ["xlink:href", "action", "formaction"];
doc.querySelectorAll("*").forEach((el) => {
// remove dangerous attributes
[...el.attributes].forEach((attr) => {
const name = attr.name;
const value = attr.value;
// remove attributes that start with "on" (event handlers)
if (dangerousAttr.test(name)) {
el.removeAttribute(name);
}
// remove URL attributes that start with javascript:, data:, or vbscript:
if (urlAttrs.includes(name)) {
const val = value.trim().toLowerCase();
if (
val.startsWith("javascript:") ||
val.startsWith("data:") ||
val.startsWith("vbscript:")
) {
el.removeAttribute(name);
}
}
});
});
return doc.body.innerHTML;
}