test: onTagAttr
This commit is contained in:
@@ -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参数)
|
||||
// 返回一个字符串表示该属性值
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
15
lib/xss.js
15
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;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
Reference in New Issue
Block a user