Files
js-xss/README.md
2014-02-13 14:58:36 +08:00

6.9 KiB
Raw Blame History

Build Status

XSS代码过滤

xss

注意0.1.x版本与0.0.x版本在自定义配置除白名单配置外格式上有较大改动如果 要使用新版本,请详细阅读下文的使用说明

特性

  • 白名单控制允许的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>
// 使用函数名 filterXSS用法一样
var html = filterXSS('<script>alert("xss");</scr' + 'ipt>');
alert(html);
</script>

自定义过滤规则

在调用 xss() 函数进行过滤时,可通过第二个参数来设置自定义规则:

options = {};  // 自定义规则
html = xss('<script>alert("xss");</script>', options);

具体用法详见下文。

白名单

通过 whiteList 来指定,格式为:{'标签名': ['属性1', '属性2']}。不在白名单中 的标签将被过滤,不在白名单中的属性也会被过滤。以下是示例:

// 只允许a标签该标签只允许href, title, target这三个属性
var options = {
  whiteList: {
    a: ['href', 'title', 'target']
  }
};
// 使用以上配置后下面的HTML
// <a href="#" onclick="hello()"><i>大家好</i></a>
// 将被过滤为
// <a href="#">大家好</a>

默认白名单参考 xss.whiteList

自定义匹配到标签时的处理方法

通过 onTag 来指定相应的处理函数。以下是详细说明:

function onTag (tag, html, options) {
  // tag是当前的标签名称比如<a>标签则tag的值是'a'
  // html是该标签的HTML比如<a>标签则html的值是'<a>'
  // options是一些附加的信息具体如下
  //   isWhite    boolean类型表示该标签是否在白名单中
  //   isClosing  boolean类型表示该标签是否为闭合标签比如</a>时为true
  //   position        integer类型表示当前标签在输出的结果中的起始位置
  //   originPosition  integer类型表示当前标签在原HTML中的起始位置
  // 如果返回一个字符串,则当前标签将被替换为该字符串
  // 如果不返回任何值,则使用默认的处理方法:
  //   在白名单中:  通过onTagAttr来过滤属性详见下文
  //   不在白名单中通过onIgnoreTag指定详见下文
}

自定义匹配到标签的属性时的处理方法

通过 onTagAttr 来指定相应的处理函数。以下是详细说明:

function onTagAttr (tag, name, value) {
  // tag是当前的标签名称比如<a>标签则tag的值是'a'
  // name是当前属性的名称比如href="#"则name的值是'href'
  // value是当前属性的值比如href="#"则value的值是'#'
  // 如果返回一个字符串,则当前属性值将被替换为该字符串
  // 如果不返回任何值,则使用默认的处理方法
  //   在白名单中:  输出该属性
  //   不在白名单中通过onIgnoreTagAttr指定详见下文
}

自定义匹配到不在白名单中的标签时的处理方法

通过 onIgnoreTag 来指定相应的处理函数。以下是详细说明:

function onIgnoreTag (tag, html, options) {
  // 参数说明与onTag相同
  // 如果返回一个字符串,则当前标签将被替换为该字符串
  // 如果不返回任何值则使用默认的处理方法通过escape指定详见下文
}

自定义匹配到不在白名单中的属性时的处理方法

通过 onIgnoreTagAttr 来指定相应的处理函数。以下是详细说明:

function onIgnoreTagAttr (tag, name, value) {
  // 参数说明与onTagAttr相同
  // 如果返回一个字符串,则当前属性值将被替换为该字符串
  // 如果不返回任何值,则使用默认的处理方法(删除该属)
}

自定义HTML转义函数

通过 escapeHtml 来指定相应的处理函数。以下是默认代码 (不建议修改)

function escapeHtml (html) {
  return html.replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

自定义标签属性值的转义函数

通过 safeAttrValue 来指定相应的处理函数。以下是详细说明:

function safeAttrValue (tag, attr, value) {
  // 参数说明与onTagAttr相同没有options参数
  // 返回一个字符串表示该属性值
}

快捷配置

stripIgnoreTag

是否去掉不在白名单只的标签:

  • true:(默认),去掉不在白名单中的标签
  • false:使用配置的escape函数对该标签进行转义

应用实例

去掉<script>标签及标签体内的JS代码

// 待续

允许标签以data-开头的属性

// 待续

允许名称以x开头的标签

// 待续

分析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.