test: onTagAttr

This commit is contained in:
Zongmin Lei
2014-02-13 15:55:36 +08:00
parent 5632ce9bde
commit 7fc9d3df3a
4 changed files with 62 additions and 14 deletions

View File

@@ -110,10 +110,11 @@ function onTag (tag, html, options) {
通过 `onTagAttr` 来指定相应的处理函数。以下是详细说明:
```JavaScript
function onTagAttr (tag, name, value) {
function onTagAttr (tag, name, value, isWhiteAttr) {
// tag是当前的标签名称比如<a>标签则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参数
// 返回一个字符串表示该属性值
}

View File

@@ -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
}
/**

View File

@@ -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;
}
});

View File

@@ -130,6 +130,52 @@ describe('test custom XSS method', function () {
assert.equal(html, 'dd<a href="#"><b>[removed]haha[/removed]</b></a><br>ff');
});
it('#onTagAttr - match attr', function () {
var source = '<a href="#" target="_blank" checked data-a="b">hi</a href="d">';
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, '<a href="#" target="_blank">hi</a>');
});
it('#onTagAttr - match attr', function () {
var source = '<a href="#" target="_blank" checked data-a="b">hi</a href="d">';
var i = 0;
var html = xss(source, {
onTagAttr: function (tag, name, value, isWhiteAttr) {
console.log(arguments);
return '$' + name + '$';
}
});
console.log(html);
assert.equal(html, '<a $href$ $target$ $checked$ $data-a$>hi</a>');
});
/*
// 自定义过滤属性函数
it('#process attribute value', function () {