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 () {