根据白名单过滤HTML(防止XSS攻击)
注意:0.1.x版本与0.0.x版本在自定义配置(除白名单配置外)格式上有较大改动,如果
要使用新版本,请详细阅读下文的使用说明
xss
是一个用于对用户输入的内容进行过滤,以避免遭受XSS攻击的模块
(什么是XSS攻击?)。只要用于论坛、博客、网上商店等等一些可允许用户录入页面排版、
格式控制相关的HTML的场景,xss
模块通过白名单来控制允许的标签及相关的标签属性,
另外还提供了一系列的接口以便用户扩展,比其他同类模块更为灵活。
项目主页: https://github.com/leizongmin/js-xss
特性
- 白名单控制允许的HTML标签及各标签的属性
- 通过自定义处理函数,可对任意标签及其属性进行处理
参考资料
使用方法
在Node.js中使用
安装:
$ npm install xss
简单使用方法:
var xss = require('xss');
var html = xss('<script>alert("xss");</script>');
console.log(html);
在浏览器端使用
<script src="https://raw.github.com/leizongmin/js-xss/master/build/xss.js"></script>
<script>
var html = filterXSS('<script>alert("xss");</scr' + 'ipt>');
alert(html);
</script>
自定义过滤规则
在调用 xss()
函数进行过滤时,可通过第二个参数来设置自定义规则:
options = {};
html = xss('<script>alert("xss");</script>', options);
如果不想每次都传入一个 options
参数,可以创建一个 FilterXSS
实例
(使用这种方法速度更快):
options = {}; // 自定义规则
myxss = new xss.FilterXSS(options);
// 以后直接调用 myxss.process() 来处理即可
html = myxss.process('<script>alert("xss");</script>');
options
参数的详细说明见下文。
白名单
通过 whiteList
来指定,格式为:{'标签名': ['属性1', '属性2']}
。不在白名单上
的标签将被过滤,不在白名单上的属性也会被过滤。以下是示例:
var options = {
whiteList: {
a: ['href', 'title', 'target']
}
};
默认白名单参考 xss.whiteList
。
自定义匹配到标签时的处理方法
通过 onTag
来指定相应的处理函数。以下是详细说明:
function onTag (tag, html, options) {
}
自定义匹配到标签的属性时的处理方法
通过 onTagAttr
来指定相应的处理函数。以下是详细说明:
function onTagAttr (tag, name, value, isWhiteAttr) {
}
自定义匹配到不在白名单上的标签时的处理方法
通过 onIgnoreTag
来指定相应的处理函数。以下是详细说明:
function onIgnoreTag (tag, html, options) {
}
自定义匹配到不在白名单上的属性时的处理方法
通过 onIgnoreTagAttr
来指定相应的处理函数。以下是详细说明:
function onIgnoreTagAttr (tag, name, value, isWhiteAttr) {
}
自定义HTML转义函数
通过 escapeHtml
来指定相应的处理函数。以下是默认代码 (不建议修改) :
function escapeHtml (html) {
return html.replace(/</g, '<').replace(/>/g, '>');
}
自定义标签属性值的转义函数
通过 safeAttrValue
来指定相应的处理函数。以下是详细说明:
function safeAttrValue (tag, name, value) {
}
快捷配置
去掉不在白名单只的标签
通过 stripIgnoreTag
来设置:
true
:(默认),去掉不在白名单上的标签false
:使用配置的escape
函数对该标签进行转义
示例:
当设置 stripIgnoreTag = true
时,以下代码
code:<script>alert(/xss/);</script>
过滤后将输出
code:alert(/xss/);
去掉不在白名单上的标签及标签体
通过 stripIgnoreTagBody
来设置:
false|null|undefined
:(默认),不特殊处理'*'|true
:去掉所有不在白名单上的标签['tag1', 'tag2']
:仅去掉指定的不在白名单上的标签
示例:
当设置 stripIgnoreTagBody = ['script']
时,以下代码
code:<script>alert(/xss/);</script>
过滤后将输出
code:
应用实例
允许标签以data-开头的属性
var source = '<div a="1" b="2" data-a="3" data-b="4">hello</div>';
var html = xss(source, {
onIgnoreTagAttr: function (tag, name, value, isWhiteAttr) {
if (name.substr(0, 5) === 'data-') {
return name + '="' + xss.escapeAttrValue(value) + '"';
}
}
});
console.log('%s\nconvert to:\n%s', source, html);
运行结果:
<div a="1" b="2" data-a="3" data-b="4">hello</div>
convert to:
<div data-a="3" data-b="4">hello</div>
允许名称以x-开头的标签
var source = '<x><x-1>he<x-2 checked></x-2>wwww</x-1><a>';
var html = xss(source, {
onIgnoreTag: function (tag, html, options) {
if (tag.substr(0, 2) === 'x-') {
return html;
}
}
});
console.log('%s\nconvert to:\n%s', source, html);
运行结果:
<x><x-1>he<x-2 checked></x-2>wwww</x-1><a>
convert to:
<x><x-1>he<x-2 checked></x-2>wwww</x-1><a>
分析HTML代码中的图片列表
var source = '<img src="img1">a<img src="img2">b<img src="img3">c<img src="img4">d';
var list = [];
var html = xss(source, {
onTagAttr: function (tag, name, value, isWhiteAttr) {
if (tag === 'img' && name === 'src') {
list.push(xss.friendlyAttrValue(value));
}
}
});
console.log('image list:\n%s', list.join(', '));
运行结果:
image list:
img1, img2, img3, img4
去除HTML标签(只保留文本内容)
var source = '<strong>hello</strong><script>alert(/xss/);</script>end';
var html = xss(source, {
whiteList: [],
stripIgnoreTag: true,
stripIgnoreTagBody: ['script']
});
console.log('text: %s', html);
运行结果:
text: helloend
性能(仅作参考)
- xss模块:8.2 MB/s
- validator@0.3.7模块的xss()函数:4.4 MB/s
测试代码参考 benchmark 目录
单元测试
在源码目录执行命令: npm test
在线测试
在源码目录执行命令: node lib/cli.js
,可在命令行中输入HTML代码,并看到过滤后的代码
MIT协议
Copyright (c) 2012-2014 Zongmin Lei(雷宗民) <leizongmin@gmail.com>
http://ucdok.com
The MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.