元素中,它将被移除。因此,在使用 Sanitizer.sanitizeFor() 方法时,必须将目标元素的标签指定为参数。
sanitizeFor(element, input)
这里也可以使用 HTML 元素中的 .innerHTML 来获取字符串形式的清理结果。
sanitizer.sanitizeFor("div", user_input).innerHTML // Hello There
当已经有一个用户可控的 DocumentFragment 时,可以使用 Sanitizer.sanitize() 方法对 DOM 树节点进行净化。
const sanitizer = new Sanitizer()
const $userDiv = ...;
$div.replaceChildren(s.sanitize($userDiv));
除此之外,Sanitizer API 还通过删除和过滤属性和标签来修改 HTML 字符串。例如,Sanitizer API:
Summer
自定义
默认情况下,Sanitizer 实例仅用于防止 XSS 攻击。但是,在某些情况下,可能需要自定义配置的清理器。接下来,下面来看看如何自定义 Sanitizer API。
如果想创建自定义的清理器配置,只需要创建一个配置对象,并在初始化 Sanitizer API 时将其传递给构造函数即可。
const config = {
allowElements: [],
blockElements: [],
dropElements: [],
allowAttributes: {},
dropAttributes: {},
allowCustomElements: true,
allowComments: true
};
// 清理结果由配置定制
new Sanitizer(config)
以下配置参数定义了清理器应如何处理给定元素的净化结果。
const str = `hello there`
new Sanitizer().sanitizeFor("div", str)
//hello there
new Sanitizer({allowElements: [ "b" ]}).sanitizeFor("div", str)
//hello there
new Sanitizer({blockElements: [ "b" ]}).sanitizeFor("div", str)
//hello there
new Sanitizer({allowElements: []}).sanitizeFor("div", str)
//hello there
使用 allowAttributes 和 dropAttributes 参数可以定义允许或删除哪个属性。
const str = ``
new Sanitizer().sanitizeFor("div", str)
//
new Sanitizer({allowAttributes: {"style": ["span"]}}).sanitizeFor("div", str)
//hello there
new Sanitizer({dropAttributes: {"id": ["span"]}}).sanitizeFor("div", str)
//
AllowCustomElements 参数允许或拒绝使用自定义元素。
const str = `hello there`
new Sanitizer().sanitizeFor("div", str);
//
new Sanitizer({ allowCustomElements: true,
allowElements: ["div", "elem"]
}).sanitizeFor("div", str);
//hello there
注意:如果创建的 Sanitizer 没有任何参数且没有明确定义的配置,则将应用默认配置值。
Summer
浏览器支持
目前,浏览器对 Sanitizer API 的支持有限,并且规范仍在制定中。该 API 仍处于实验阶段,因此在生产中使用之前应关注其变化进展。
# ON
第三方库
Summer IS HERE
到这里我们就知道了,原生 API 和常用的前端框架都没有提供可用的方式来安全的渲染HTML。在实际的开发中,我们可以借助已有的第三方库来安全的渲染 HTML,下面就来介绍几个常用给的库。
Summer
DOMPurify
DOMPurify 是一款流行的JavaScript库,用于在浏览器环境下进行HTML净化和防止跨站脚本攻击(XSS)。它通过移除恶意代码、过滤危险标签和属性等方式来保护网页免受XSS攻击的威胁。DOMPurify使用了严格的解析和验证策略,并提供了可配置的选项,以便开发人员根据自己的需求进行定制。它可以轻松地集成到现有的Web应用程序中,并且被广泛认为是一种安全可靠的HTML净化解决方案。
可以通过以下步骤来使用 DOMPurify:
首先,安装DOMPurify库。可以通过运行以下命令来安装它:
npm install dompurify
在需要使用的组件文件中,引入DOMPurify库:
import DOMPurify from 'dompurify';
在组件的适当位置,使用 DOMPurify 来净化HTML字符串,下面以 React 为例:
import React from 'react';
const MyComponent = () => {
const userInput = 'alert("XSS");Hello, World!
';
const cleanedHtml = DOMPurify.sanitize(userInput);
return <div dangerouslySetInnerHTML={{ __html: cleanedHtml }}></div>;
};
这里通过在React组件的dangerouslySetInnerHTML属性中传递净化后的HTML内容来显示安全的HTML。
DOMPurify提供了一些选项和配置,可以使用这些选项来自定义DOMPurify的行为:
import DOMPurify from 'dompurify';
// 创建自定义的白名单(允许的标签和属性)
const myCustomWhiteList = DOMPurify.sanitize.defaults.allowedTags.concat(['custom-tag']);
const myCustomAttributes = ['data-custom-attr'];
// 创建自定义选项
const myOptions = {
ALLOWED_TAGS: myCustomWhiteList,
ATTRIBUTES: {
...DOMPurify.sanitize.defaults.ALLOWED_ATTR,
'custom-tag': myCustomAttributes,
},
};
const userInput = 'alert("XSS");Hello, World!
Custom Content';
const cleanedHtml = DOMPurify.sanitize(userInput, myOptions);
console.log(cleanedHtml);
// 输出:Hello, World!
Custom Content
这里定义了一个自定义的白名单myCustomWhiteList,包含了DOMPurify默认的允许标签,并添加了一个名为custom-tag的自定义标签。我们还定义了一个包含自定义属性data-custom-attr的对象myCustomAttributes。然后,创建了一个自定义选项myOptions,通过覆盖ALLOWED_TAGS和ATTRIBUTES来应用自定义的白名单和属性规则。最后,使用DOMPurify.sanitize()方法,并传入用户输入的HTML和自定义选项myOptions,DOMPurify 会根据自定义规则进行过滤和净化。
可以根据需要定义自己的白名单(允许的标签)和属性,并在自定义选项中使用它们来自定义DOMPurify的行为。
Summer
js-xss
js-xss是一个JavaScript库,用于防御和过滤跨站脚本攻击(XSS)。它提供了一组方法和函数,可以净化和转义用户输入的HTML内容,以确保在浏览器环境中呈现的HTML是安全的。
js-xss库使用白名单过滤器的概念来防御XSS攻击。它定义了一组允许的HTML标签和属性,同时还提供了一些选项和配置来定制过滤规则。使用js-xss,可以对用户提交的HTML内容进行净化,删除或转义所有潜在的危险代码,只保留安全的HTML标签和属性。
可以通过以下步骤来使用 js-xss:
安装js-xss库:通过npm或yarn安装js-xss库。
npm install xss
导入js-xss库:在React组件文件中导入js-xss库。
import xss from 'xss';
使用js-xss过滤HTML内容:在需要过滤HTML的地方,调用js-xss的方法来净化HTML。
import React from 'react';
import xss from 'xss';
const MyComponent = () => {
const userInput = 'alert("XSS");Hello, World!
';
const cleanedHtml = xss(userInput);
return <div dangerouslySetInnerHTML={{ __html: cleanedHtml }} />;
};
export default MyComponent;
这里在MyComponent组件中使用了dangerouslySetInnerHTML属性来渲染HTML内容。通过调用xss()函数并传入用户输入的HTML,我们可以将其过滤和净化,并将结果设置为组件的内容。
js-xss库提供了一些选项和配置,可以使用这些选项来定义自定义的过滤规则:
import xss from 'xss';
// 创建自定义WhiteList过滤规则
const myCustomWhiteList = {
a: ['href', 'title', 'target'], // 只允许'a'标签的'href', 'title', 'target'属性
p: [], // 允许空白的'p'标签
img: ['src', 'alt'], // 只允许'img'标签的'src', 'alt'属性
};
// 创建自定义选项
const myOptions = {
whiteList: myCustomWhiteList, // 使用自定义的WhiteList过滤规则
};
const userInput = 'alert("XSS");Hello, World!
Example';
const cleanedHtml = xss(userInput, myOptions);
console.log(cleanedHtml);
// 输出:Hello, World!
Example
这里定义了一个自定义的WhiteList过滤规则myCustomWhiteList,并将其传递给定义的选项myOptions。然后,调用xss()函数时传入用户输入的HTML和自定义选项,js-xss库会根据自定义的规则进行过滤和净化。
Summer
sanitize-html
sanitize-html 是一个用于净化和过滤HTML代码的JavaScript库。它被设计用于去除潜在的恶意或不安全的内容,以及保护应用程序免受跨站脚本攻击(XSS)等安全漏洞的影响。它提供了一种简单而灵活的方式来清理用户输入的HTML代码,以确保只有安全的标签、属性和样式保留下来,并且不包含任何恶意代码或潜在的危险内容。
sanitize-html使用一个白名单(配置选项)来定义允许的标签、属性和样式,并将所有不在白名单内的内容进行过滤和删除。它还可以处理不匹配的标签、标签嵌套问题和其他HTML相关的问题。
可以通过以下步骤来使用 sanitize-html:
在项目中安装sanitize-html库:
npm install sanitize-html
在组件中引入sanitize-html库:
import sanitizeHtml from 'sanitize-html';
在组件中使用sanitizeHtml函数来净化和过滤HTML代码。例如,您以将用户输入的HTML存储在组件的状态或属性中,并在渲染时应用sanitizeHtml函数:
import React from 'react';
import sanitizeHtml from 'sanitize-html';
function MyComponent() {
const userInput = 'alert("XSS");Hello, World!
';
const cleanedHtml = sanitizeHtml(userInput);
return (
<div>
<div dangerouslySetInnerHTML={{ __html: cleanedHtml }}></div>
</div>
);
}
这里在组件内部定义了用户输入的HTML代码,并使用sanitizeHtml函数对其进行净化。然后,使用dangerouslySetInnerHTML属性将经过净化的HTML代码渲染到页面上。
可以使用sanitize-html提供的sanitize函数并传递一个配置对象作为参数来自定义sanitize-html的配置,配置对象可以包含一系列选项,用于定义过滤规则和允许的HTML标签和属性等。
import sanitizeHtml from 'sanitize-html';
const customConfig = {
allowedTags: ['b', 'i', 'u'], // 允许的标签
allowedAttributes: {
a: ['href'] // 允许的a标签属性
},
allowedSchemes: ['http', 'https'], // 允许的URL协议
allowedClasses: {
b: ['bold', 'highlight'], // 允许的b标签的class
i: ['italic'] // 允许的i标签的class
},
transformTags: {
b: 'strong', // 将b标签转换为strong标签
i: 'em' // 将i标签转换为em标签
},
nonTextTags: ['style', 'script', 'textarea', 'noscript'] // 不允许解析的标签
};
const userInput = 'Hello World Link';
const cleanedHtml = sanitizeHtml(userInput, customConfig);
这里创建了一个名为customConfig的配置对象,其中包含了一些自定义的过滤规则和选项。这个配置对象定义了允许的标签、允许的属性、允许的URL协议、允许的CSS类名、标签的转换规则以及不允许解析的标签等。
然后,将用户输入的HTML代码作为第一个参数传递给sanitizeHtml函数,并将customConfig作为第二个参数传递。sanitizeHtml函数将根据配置对象中定义的规则对HTML代码进行过滤和净化,并返回经过净化后的HTML代码。
Summer
往期推荐
暂无评论内容