diff --git a/README.md b/README.md index 897a534..8be3634 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ [![Build Status](https://secure.travis-ci.org/leizongmin/js-xss.png?branch=master)](http://travis-ci.org/leizongmin/js-xss) -过滤XSS攻击 +XSS代码过滤 ====== ![xss](https://nodei.co/npm/xss.png?downloads=true&stars=true) +**注意:0.1.x版本与0.0.x版本在自定义配置(除白名单配置外)格式上有较大改动,如果 +要使用新版本,请详细阅读下文的使用说明** + + +## 特性 + ++ 白名单控制允许的HTML标签及各标签的属性 ++ 通过自定义处理函数,可对任意标签及其属性进行处理 + ## 参考资料 @@ -15,90 +24,27 @@ + [XSS with Data URI Scheme](http://hi.baidu.com/badzzzz/item/bdbafe83144619c199255f7b) -## 安装 +## 使用 -**npm install xss** +### 在Node.js中使用 +安装: -## 原理 +```bash +$ npm install xss +``` -通过标签白名单及属性白名单来过滤HTML标签,同时对包含特殊字符的属性值进行处理。默认配置可过滤大多数的XSS攻击代码,可根据实际应用场景来定制白名单及过滤方法。 +简单使用方法: - -## 使用方法 - -### 载入模块 - -```javascript +```JavaScript var xss = require('xss'); -``` - -### 使用默认的配置 - -```javascript var html = xss(''); console.log(html); ``` -### 修改默认配置 - -```javascript -// 添加或更新白名单中的标签 标签名(小写) = ['允许的属性列表(小写)'] -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代码,如: - // 返回新的标签HTML代码,如果想使用默认的处理方式,不返回任何值即可 - // 比如将标签替换为[removed]:return '[removed]'; - // 以下为默认的处理代码: - return html.replace(//g, '>'); -} -``` - -### 使用临时配置 - -```javascript -var options = { - whiteList: {}, // 若不指定则使用默认配置,可参考xss.whiteList - onTagAttr: function () {}, // 若不指定则使用默认配置,可参考xss.onTagAttr - onIgnoreTag: function () {} // 若不指定则使用默认配置,可参考xss.onIgnoreTag -}; -var html = xss('', options); -console.log(html); -``` - ### 在浏览器端使用 -``` +```HTML ', options); +``` + +具体用法详见下文。 + +### 白名单 + +通过 `whiteList` 来指定,格式为:`{'标签名': ['属性1', '属性2']}`。不在白名单中 +的标签将被过滤,不在白名单中的属性也会被过滤。以下是示例: + +```JavaScript +// 只允许a标签,该标签只允许href, title, target这三个属性 +var options = { + whiteList: { + a: ['href', 'title', 'target'] + } +}; +// 使用以上配置后,下面的HTML +// 大家好 +// 将被过滤为 +// 大家好 +``` + +默认白名单参考 `xss.whiteList`。 + +### 自定义匹配到标签时的处理方法 + +通过 `onTag` 来指定相应的处理函数。以下是详细说明: + +```JavaScript +function onTag (tag, html, options) { + // tag是当前的标签名称,比如标签,则tag的值是'a' + // html是该标签的HTML,比如标签,则html的值是'' + // options是一些附加的信息,具体如下: + // isWhite boolean类型,表示该标签是否在白名单中 + // isClosing boolean类型,表示该标签是否为闭合标签,比如时为true + // position integer类型,表示当前标签在输出的结果中的起始位置 + // originPosition integer类型,表示当前标签在原HTML中的起始位置 + // 如果返回一个字符串,则当前标签将被替换为该字符串 + // 如果不返回任何值,则使用默认的处理方法(通过onIgnoreTag指定,详见下文) +} +``` + +### 自定义匹配到标签的属性时的处理方法 + +通过 `onTagAttr` 来指定相应的处理函数。以下是详细说明: + +```JavaScript +function onTagAttr (tag, name, value, options) { + // tag是当前的标签名称,比如标签,则tag的值是'a' + // name是当前属性的名称,比如href="#",则name的值是'href' + // value是当前属性的值,比如href="#",则value的值是'#' + // options是一些附加的信息,与onTag相同 + // 如果返回一个字符串,则当前属性值将被替换为该字符串 + // 如果不返回任何值,则使用默认的处理方法(通过onIgnoreTagAttr指定,详见下文) +} +``` + +### 自定义匹配到不在白名单中的标签时的处理方法 + +通过 `onIgnoreTag` 来指定相应的处理函数。以下是详细说明: + +```JavaScript +function onIgnoreTag (tag, html, options) { + // 参数说明与onTag相同 + // 如果返回一个字符串,则当前标签将被替换为该字符串 + // 如果不返回任何值,则使用默认的处理方法(通过escape指定,详见下文) +} +``` + +### 自定义匹配到不在白名单中的属性时的处理方法 + +通过 `onIgnoreTagAttr` 来指定相应的处理函数。以下是详细说明: + +```JavaScript +function onIgnoreTagAttr (tag, name, value, options) { + // 参数说明与onTagAttr相同 + // 如果返回一个字符串,则当前属性值将被替换为该字符串 + // 如果不返回任何值,则使用默认的处理方法(去掉该属) +} +``` + +### 自定义HTML转义函数 + +通过 `escape` 来指定相应的处理函数。以下是默认代码 **(不建议修改)** : + +```JavaScript +function escape (html) { + return html.replace(//g, '>'); +} +``` + +### 自定义标签属性值的转义函数 + +通过 `safeAttrValue` 来指定相应的处理函数。以下是详细说明: + +```JavaScript +function safeAttrValue (tag, attr, value) { + // 参数说明与onTagAttr相同(没有options参数) + // 返回一个字符串表示该属性值 +} +``` + +### 快捷配置 + +#### stripIgnoreTag + +是否去掉不在白名单只的标签: + ++ `true`:(默认),去掉不在白名单中的标签 ++ `false`:使用配置的`escape`函数对该标签进行转义 -## 测试 +## 应用实例 -### 单元测试 +### 去掉