有没有人知道在jQuery中从字符串中轻松转义HTML的方法?我需要能够传递任意字符串并使其正确地转义以在HTML页面中显示(防止JavaScript/HTML注入攻击)。我相信可以扩展jQuery来做到这一点,但是我目前还不了解该框架足够的知识以实现此目标。
有没有人知道在jQuery中从字符串中轻松转义HTML的方法?我需要能够传递任意字符串并使其正确地转义以在HTML页面中显示(防止JavaScript/HTML注入攻击)。我相信可以扩展jQuery来做到这一点,但是我目前还不了解该框架足够的知识以实现此目标。
function htmlDecode(t){
if (t) return $('<div />').html(t).text();
}
非常好用
function htmlEscape(str) {
var stringval="";
$.each(str, function (i, element) {
alert(element);
stringval += element
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(' ', '-')
.replace('?', '-')
.replace(':', '-')
.replace('|', '-')
.replace('.', '-');
});
alert(stringval);
return String(stringval);
}
用于转义HTML特殊字符(UTF-8)
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\//g, '/')
.replace(/=/g, '=')
.replace(/`/g, '`');
}
用于反转义 HTML 特殊字符(UTF-8)
function htmlUnescape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(///g, '/')
.replace(/=/g, '=')
.replace(/`/g, '`');
}
function escapeHtml(s) {
let out = "";
let p2 = 0;
for (let p = 0; p < s.length; p++) {
let r;
switch (s.charCodeAt(p)) {
case 34: r = """; break; // "
case 38: r = "&" ; break; // &
case 39: r = "'" ; break; // '
case 60: r = '<' ; break; // <
case 62: r = '>' ; break; // >
default: continue;
}
if (p2 < p) {
out += s.substring(p2, p);
}
out += r;
p2 = p + 1;
}
if (p2 == 0) {
return s;
}
if (p2 < s.length) {
out += s.substring(p2);
}
return out;
}
const s = "Hello <World>!";
document.write(escapeHtml(s));
console.log(escapeHtml(s));
如果你不防止重新转义,所有的解决方案都是无用的,例如,大多数解决方案会将&
转义为&
。
escapeHtml = function (s) {
return s ? s.replace(
/[&<>'"]/g,
function (c, offset, str) {
if (c === "&") {
var substr = str.substring(offset, offset + 6);
if (/&(amp|lt|gt|apos|quot);/.test(substr)) {
// already escaped, do not re-escape
return c;
}
}
return "&" + {
"&": "amp",
"<": "lt",
">": "gt",
"'": "apos",
'"': "quot"
}[c] + ";";
}
) : "";
};
这个答案提供了jQuery和常规JS方法,但是这是最短的,而不使用DOM:
unescape(escape("It's > 20% less complicated this way."))
It%27s%20%3E%2020%25%20less%20complicated%20this%20way.
如果转义的空格让您感到不方便,请尝试:unescape(escape("It's > 20% less complicated this way.").replace(/%20/g, " "))
转义字符串:这样做会使它变得不那么复杂,减少了20%的工作量。
不幸的是,在JavaScript版本1.5中,escape()
函数已经被弃用。 encodeURI()
或encodeURIComponent()
是替代方案,但它们忽略'
,所以最后一行代码会变成这样:
decodeURI(encodeURI("It's > 20% less complicated this way.").replace(/%20/g, " ").replace("'", '%27'))
所有主要的浏览器仍然支持短代码,并且考虑到旧网站的数量,我认为这种情况不会很快改变。
var entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
function escapeHtml(string) {
return String(string).replace(/[&<>"'\/]/g, function (s) {
return entityMap[s];
});
}
用户可以:
如果用户将此片段粘贴到控制台中,则可以绕过XSS验证:
function escapeHtml(string){
return string
}