登录
注册
node.js 学习社区
HTML标签防XSS攻击过滤模块

大天才

2014-12-07 21:50

过滤XSS攻击

http://travis-ci.org/leizongmin/js-xss

安装

npm install xss

原理

通过标签白名单及属性白名单来过滤HTML标签,同时对包含特殊字符的属性值进行处理。默认配置可过滤大多数的XSS攻击代码,可根据实际应用场景来定制白名单及过滤方法。

使用方法

载入模块

var xss = require('xss');

使用默认的配置

var html = xss('<script>alert("xss");</script>');
console.log(html);

修改默认配置

// 添加或更新白名单中的标签 标签名(小写) = ['允许的属性列表(小写)']
xss.whiteList['p'] = ['class', 'style'];
// 删除默认的白名单标签
delete xss.whiteList['div'];

// 自定义处理属性值函数
xss.onTagAttr = function (tag, attr, vaule) {
  // tag:当前标签名(小写)
  // attr:当前属性名(小写)
  // value:当前属性值
  // 返回新的属性值,如果想使用默认的处理方式,不返回任何值即可
  // 比如把属性值中的双引号替换为&quote;:return value.replace(/"/g, '&quote;');
  // 以下为默认的处理代码:
  if (attr === 'href' || attr === 'src') {
    if (/\/\*|\*\//mg.test(value)) {
      return '#';
    }
    if (/^[\s"'`]*((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a):/ig.test(value)) {
      return '#';
    }
  } else if (attr === 'style') {
    if (/\/\*|\*\//mg.test(value)) {
      return '#';
    }
    if (/((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a):/ig.test(value)) {
      return '';
    }
  }
};

// 自定义处理不在白名单中的标签
xss.onIgnoreTag = function (tag, html) {
  // tag:当前标签名(小写),如:a
  // html:当前标签的HTML代码,如:<a href="ooxx">
  // 返回新的标签HTML代码,如果想使用默认的处理方式,不返回任何值即可
  // 比如将标签替换为[removed]:return '[removed]';
  // 以下为默认的处理代码:
  return html.replace(/</g, '<').replace(/>/g, '>');
}

使用临时配置

var options = {
  whiteList:   {},        // 若不指定则使用默认配置,可参考xss.whiteList
  onTagAttr:   function () {},  // 若不指定则使用默认配置,可参考xss.onTagAttr
  onIgnoreTag: function () {}   // 若不指定则使用默认配置,可参考xss.onIgnoreTag
};
var html = xss('<script>alert("xss");</script>', options);
console.log(html);

测试

单元测试

在源码目录执行命令:npm test

在线测试

在源码目录执行命令:node cli.js,可在命令行中输入HTML代码,并看到过滤后的代码

性能

解析速度为5.81MB/s,而另外一个validator模块的xss()函数速度仅为2.48MB/s

测试代码参考benchmark目录

项目地址:https://github.com/leizongmin/js-xss

希望此模块能完美解决XSS问题,我好将功补过 @suqian @snoopy @jiyinyiyong @j4cnodejs @atian25 @saighost

原文引自:http://cnodejs.org/topic/5058962f8ea56b5e7806b2a3

回复 · 0

发表回复

你可以在回复中 @ 其他人