代码风格
This commit is contained in:
47
lib/index.js
47
lib/index.js
@@ -47,6 +47,18 @@ var defaultWhiteList = {
|
|||||||
video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width'],
|
video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width'],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 正则表达式
|
||||||
|
var REGEXP_LT = /</g;
|
||||||
|
var REGEXP_GT = />/g;
|
||||||
|
var REGEXP_QUOTE = /"/g;
|
||||||
|
var REGEXP_ATTR_NAME = /[^a-zA-Z0-9_:\.\-]/img;
|
||||||
|
var REGEXP_ATTR_VALUE = /&#([a-zA-Z0-9]*);?/img;
|
||||||
|
var REGEXP_DEFAULT_ON_TAG_ATTR_1 = /\/\*|\*\//mg;
|
||||||
|
var REGEXP_DEFAULT_ON_TAG_ATTR_2 = /^[\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;
|
||||||
|
var REGEXP_DEFAULT_ON_TAG_ATTR_3 = /\/\*|\*\//mg;
|
||||||
|
var REGEXP_DEFAULT_ON_TAG_ATTR_4 = /((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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 过滤属性值
|
* 过滤属性值
|
||||||
*
|
*
|
||||||
@@ -55,19 +67,23 @@ var defaultWhiteList = {
|
|||||||
* @param {string} value 属性值
|
* @param {string} value 属性值
|
||||||
* @return {string} 若不需要修改属性值,不返回任何值
|
* @return {string} 若不需要修改属性值,不返回任何值
|
||||||
*/
|
*/
|
||||||
var defaultOnTagAttr = function (tag, attr, value) {
|
function defaultOnTagAttr (tag, attr, value) {
|
||||||
if (attr === 'href' || attr === 'src') {
|
if (attr === 'href' || attr === 'src') {
|
||||||
if (/\/\*|\*\//mg.test(value)) {
|
REGEXP_DEFAULT_ON_TAG_ATTR_1.lastIndex = 0;
|
||||||
|
if (REGEXP_DEFAULT_ON_TAG_ATTR_1.test(value)) {
|
||||||
return '#';
|
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)) {
|
REGEXP_DEFAULT_ON_TAG_ATTR_2.lastIndex = 0;
|
||||||
|
if (REGEXP_DEFAULT_ON_TAG_ATTR_2.test(value)) {
|
||||||
return '#';
|
return '#';
|
||||||
}
|
}
|
||||||
} else if (attr === 'style') {
|
} else if (attr === 'style') {
|
||||||
if (/\/\*|\*\//mg.test(value)) {
|
REGEXP_DEFAULT_ON_TAG_ATTR_3.lastIndex = 0;
|
||||||
|
if (REGEXP_DEFAULT_ON_TAG_ATTR_3.test(value)) {
|
||||||
return '#';
|
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)) {
|
REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0;
|
||||||
|
if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,7 +100,7 @@ var defaultOnTagAttr = function (tag, attr, value) {
|
|||||||
* isClosing:是否为闭合标签,如</a>
|
* isClosing:是否为闭合标签,如</a>
|
||||||
* @return {string} 若不返回任何值,则默认替换<>为<>
|
* @return {string} 若不返回任何值,则默认替换<>为<>
|
||||||
*/
|
*/
|
||||||
var defaultOnIgnoreTag = function (tag, html, options) {
|
function defaultOnIgnoreTag (tag, html, options) {
|
||||||
return noTag(html);
|
return noTag(html);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -95,10 +111,12 @@ var defaultOnIgnoreTag = function (tag, html, options) {
|
|||||||
* @param {string} text
|
* @param {string} text
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
var noTag = function (text) {
|
function noTag (text) {
|
||||||
return text.replace(/</g, '<').replace(/>/g, '>');
|
return text.replace(REGEXP_LT, '<').replace(REGEXP_GT, '>');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* XSS过滤
|
* XSS过滤
|
||||||
*
|
*
|
||||||
@@ -106,7 +124,7 @@ var noTag = function (text) {
|
|||||||
* @param {object} options 选项:whiteList, onTagAttr, onIgnoreTag
|
* @param {object} options 选项:whiteList, onTagAttr, onIgnoreTag
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
exports = module.exports = function (html, options) {
|
function filterXSS (html, options) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
options = options || {};
|
options = options || {};
|
||||||
@@ -123,7 +141,7 @@ exports = module.exports = function (html, options) {
|
|||||||
/**
|
/**
|
||||||
* 过滤不合法的属性
|
* 过滤不合法的属性
|
||||||
*/
|
*/
|
||||||
var filterAttributes = function (tagName, attrs) {
|
function filterAttributes (tagName, attrs) {
|
||||||
tagName = tagName.toLowerCase();
|
tagName = tagName.toLowerCase();
|
||||||
var whites = whiteList[tagName];
|
var whites = whiteList[tagName];
|
||||||
var lastPos = 0;
|
var lastPos = 0;
|
||||||
@@ -136,13 +154,13 @@ exports = module.exports = function (html, options) {
|
|||||||
hasSprit = true;
|
hasSprit = true;
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
name = name.replace(/[^a-zA-Z0-9_:\.\-]/img, '').toLowerCase();
|
name = name.replace(REGEXP_ATTR_NAME, '').toLowerCase();
|
||||||
if (name.length < 1) return;
|
if (name.length < 1) return;
|
||||||
if (whites.indexOf(name) !== -1) {
|
if (whites.indexOf(name) !== -1) {
|
||||||
if (value) {
|
if (value) {
|
||||||
value = value.trim().replace(/"/g, '"e;');
|
value = value.trim().replace(REGEXP_QUOTE, '"e;');
|
||||||
// 转换unicode字符 及过滤不可见字符
|
// 转换unicode字符 及过滤不可见字符
|
||||||
value = value.replace(/&#([a-zA-Z0-9]*);?/img, function (str, code) {
|
value = value.replace(REGEXP_ATTR_VALUE, function (str, code) {
|
||||||
code = parseInt(code);
|
code = parseInt(code);
|
||||||
return String.fromCharCode(code);
|
return String.fromCharCode(code);
|
||||||
});
|
});
|
||||||
@@ -207,7 +225,7 @@ exports = module.exports = function (html, options) {
|
|||||||
/**
|
/**
|
||||||
* 检查标签是否合法
|
* 检查标签是否合法
|
||||||
*/
|
*/
|
||||||
var addNewTag = function (tag, end) {
|
function addNewTag (tag, end) {
|
||||||
rethtml += noTag(html.slice(lastPos, tagStart));
|
rethtml += noTag(html.slice(lastPos, tagStart));
|
||||||
lastPos = end + 1;
|
lastPos = end + 1;
|
||||||
var spos = tag.slice(0, 2) === '</' ? 2 : 1;
|
var spos = tag.slice(0, 2) === '</' ? 2 : 1;
|
||||||
@@ -282,6 +300,7 @@ exports = module.exports = function (html, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 默认配置
|
// 默认配置
|
||||||
|
exports = module.exports = filterXSS;
|
||||||
exports.whiteList = defaultWhiteList;
|
exports.whiteList = defaultWhiteList;
|
||||||
exports.onTagAttr = defaultOnTagAttr;
|
exports.onTagAttr = defaultOnTagAttr;
|
||||||
exports.onIgnoreTag = defaultOnIgnoreTag;
|
exports.onIgnoreTag = defaultOnIgnoreTag;
|
||||||
|
|||||||
Reference in New Issue
Block a user