有人知道一个简单的方法来转义HTML从字符串在jQuery?我需要能够传递一个任意字符串,并有它正确转义显示在HTML页面(防止JavaScript/HTML注入攻击)。我确信可以通过扩展jQuery来实现这一点,但目前我对框架的了解还不够,无法实现这一点。
当前回答
一个速度优化版本:
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));
其他回答
我知道我来这个派对有多晚,但我有一个非常简单的解决方案,不需要jQuery。
escaped = new Option(unescaped).innerHTML;
编辑:不转义引号。需要转义引号的唯一情况是,内容将内联粘贴到HTML字符串中的属性。我很难想象这样做会是好的设计。
编辑3:要获得最快的解决方案,请检查上面萨拉姆的答案。这个是最短的。
如果你将这些信息保存在数据库中,使用客户端脚本转义HTML是错误的,这应该在服务器中完成。否则很容易绕过你的XSS保护。
为了让我的观点更清楚,这里有一个例子,使用其中的一个答案:
假设你正在使用函数escapeHtml来转义博客评论中的Html,然后将其发布到服务器上。
var entityMap = {
"&": "&",
"<": "<",
">": ">",
'"': '"',
"'": ''',
"/": '/'
};
function escapeHtml(string) {
return String(string).replace(/[&<>"'\/]/g, function (s) {
return entityMap[s];
});
}
用户可以:
编辑POST请求参数并用javascript代码替换注释。 使用浏览器控制台重写escapeHtml函数。
如果用户将这个代码段粘贴到控制台中,它将绕过XSS验证:
function escapeHtml(string){
return string
}
如果你走的是正则表达式路线,上面tghw的例子中就有一个错误。
<!-- WON'T WORK - item[0] is an index, not an item -->
var escaped = html;
var findReplace = [[/&/g, "&"], [/</g, "<"], [/>/g,">"], [/"/g,
"""]]
for(var item in findReplace) {
escaped = escaped.replace(item[0], item[1]);
}
<!-- WORKS - findReplace[item[]] correctly references contents -->
var escaped = html;
var findReplace = [[/&/g, "&"], [/</g, "<"], [/>/g, ">"], [/"/g, """]]
for(var item in findReplace) {
escaped = escaped.replace(findReplace[item[0]], findReplace[item[1]]);
}
在mustache.js中也有解决方案
var entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/',
'`': '`',
'=': '='
};
function escapeHtml (string) {
return String(string).replace(/[&<>"'`=\/]/g, function (s) {
return entityMap[s];
});
}
很容易使用下划线:
_.escape(string)
下划线是一个实用库,它提供了很多原生js不提供的功能。还有lodash,它是与下划线相同的API,但被重写以提高性能。