diff --git a/README.md b/README.md index 0771f3d..7e8c465 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,11 @@ function onTag (tag, html, options) { 通过 `onTagAttr` 来指定相应的处理函数。以下是详细说明: ```JavaScript -function onTagAttr (tag, name, value) { +function onTagAttr (tag, name, value, isWhiteAttr) { // tag是当前的标签名称,比如标签,则tag的值是'a' // name是当前属性的名称,比如href="#",则name的值是'href' // value是当前属性的值,比如href="#",则value的值是'#' + // isWhiteAttr是否为白名单中的属性 // 如果返回一个字符串,则当前属性值将被替换为该字符串 // 如果不返回任何值,则使用默认的处理方法 // 在白名单中: 输出该属性 @@ -138,7 +139,7 @@ function onIgnoreTag (tag, html, options) { 通过 `onIgnoreTagAttr` 来指定相应的处理函数。以下是详细说明: ```JavaScript -function onIgnoreTagAttr (tag, name, value) { +function onIgnoreTagAttr (tag, name, value, isWhiteAttr) { // 参数说明与onTagAttr相同 // 如果返回一个字符串,则当前属性值将被替换为该字符串 // 如果不返回任何值,则使用默认的处理方法(删除该属) @@ -160,7 +161,7 @@ function escapeHtml (html) { 通过 `safeAttrValue` 来指定相应的处理函数。以下是详细说明: ```JavaScript -function safeAttrValue (tag, attr, value) { +function safeAttrValue (tag, name, value) { // 参数说明与onTagAttr相同(没有options参数) // 返回一个字符串表示该属性值 } diff --git a/lib/default.js b/lib/default.js index 00b836b..2965535 100644 --- a/lib/default.js +++ b/lib/default.js @@ -55,7 +55,7 @@ var whiteList = { * @return {String} */ function onTag (tag, html, options) { - + // do nothing } /** @@ -67,7 +67,7 @@ function onTag (tag, html, options) { * @return {String} */ function onIgnoreTag (tag, html, options) { - + // do nothing } /** @@ -79,7 +79,7 @@ function onIgnoreTag (tag, html, options) { * @return {String} */ function onTagAttr (tag, name, value) { - + // do nothing } /** @@ -91,7 +91,7 @@ function onTagAttr (tag, name, value) { * @return {String} */ function onIgnoreTagAttr (tag, name, value) { - + // do nothing } /** diff --git a/lib/xss.js b/lib/xss.js index 8b2109a..2280c33 100644 --- a/lib/xss.js +++ b/lib/xss.js @@ -104,16 +104,12 @@ FilterXSS.prototype.process = function (html) { var attrsHtml = parseAttr(attrs.html, function (name, value) { // 调用onTagAttr处理 - var ret = onTagAttr(tag, name, value); + var isWhiteAttr = (whiteAttrList.indexOf(name) !== -1); + var ret = onTagAttr(tag, name, value, isWhiteAttr); if (!isNull(ret)) return ret; // 默认的属性处理方法 - if (whiteAttrList.indexOf(name) === -1) { - // 非白名单属性,调用onIgnoreTagAttr处理 - var ret = onIgnoreTagAttr(tag, name, value); - if (!isNull(ret)) return ret; - return; - } else { + if (isWhiteAttr) { // 白名单属性,调用onIgnoreTagAttr过滤属性值 value = safeAttrValue(tag, name, value); if (value) { @@ -121,6 +117,11 @@ FilterXSS.prototype.process = function (html) { } else { return name; } + } else { + // 非白名单属性,调用onIgnoreTagAttr处理 + var ret = onIgnoreTagAttr(tag, name, value, isWhiteAttr); + if (!isNull(ret)) return ret; + return; } }); diff --git a/test/test_custom_method.js b/test/test_custom_method.js index 93a76a1..df9ee6b 100644 --- a/test/test_custom_method.js +++ b/test/test_custom_method.js @@ -130,6 +130,52 @@ describe('test custom XSS method', function () { assert.equal(html, 'dd[removed]haha[/removed]
ff'); }); + it('#onTagAttr - match attr', function () { + var source = 'hi'; + var i = 0; + var html = xss(source, { + onTagAttr: function (tag, name, value, isWhiteAttr) { + console.log(arguments); + assert.equal(tag, 'a'); + i++; + if (i === 1) { + assert.equal(name, 'href'); + assert.equal(value, '#'); + assert.equal(isWhiteAttr, true); + } else if (i === 2) { + assert.equal(name, 'target'); + assert.equal(value, '_blank'); + assert.equal(isWhiteAttr, true); + } else if (i === 3) { + assert.equal(name, 'checked'); + assert.equal(value, ''); + assert.equal(isWhiteAttr, false); + } else if (i === 4) { + assert.equal(name, 'data-a'); + assert.equal(value, 'b'); + assert.equal(isWhiteAttr, false); + } else { + throw new Error(); + } + } + }); + console.log(html); + assert.equal(html, 'hi'); + }); + + it('#onTagAttr - match attr', function () { + var source = 'hi'; + var i = 0; + var html = xss(source, { + onTagAttr: function (tag, name, value, isWhiteAttr) { + console.log(arguments); + return '$' + name + '$'; + } + }); + console.log(html); + assert.equal(html, 'hi'); + }); + /* // 自定义过滤属性函数 it('#process attribute value', function () {