jQuery技巧不对引号进行编码,在IE中,它将删除空格。
基于Django中的转义 templatetag(我猜它已经被大量使用/测试),我制作了此函数来完成所需的工作。
可以说,它比空白消除问题的任何解决方法都更简单(并且可能更快),并且它对引号进行了编码,例如,如果您要在属性值内使用结果,则必须使用引号。
function htmlEscape(str) {
return str
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// I needed the opposite function today, so adding here too:
function htmlUnescape(str){
return str
.replace(/"/g, '"')
.replace(/'/g, "'")
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g, '&');
}
更新2013-06-17:
在寻找最快的转义过程中,我发现了这种replaceAll
方法的实现:
http
: //dumpsite.com/forum/index.php?topic=4.msg29# msg29(也在此处引用:最快替换字符串中字符的所有实例的方法)
此处的一些性能结果:http :
//jsperf.com/htmlencoderegex/25
它给replace
上面的内置链相同的结果字符串。如果有人可以解释为什么它更快,我将非常高兴!
2015年3月4日更新:我刚刚注意到AngularJS正使用上述方法:https :
//github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
它们增加了一些改进-它们似乎正在处理一个晦涩的Unicode问题,以及将所有非字母数字字符转换为实体。我的印象是,只要您为文档指定了UTF8字符集,就不需要后者。
我会注意到(4年后)Django仍然不执行上述任何一项操作,因此我不确定它们的重要性:https :
//github.com/django/django/blob/1.8b1/django/utils /html.py#L44
更新2016-04-06:
您可能还希望转义正斜线/
。正确的HTML编码不是必需的,但是OWASP建议将其作为反XSS安全措施。(感谢@JNF在评论中建议这一点)
.replace(/\//g, '/');