你如何使用JavaScript进行HTML编码?
你如何使用JavaScript进行HTML编码?
我正在使用JavaScript从隐藏字段中提取值,并在文本框中显示它。隐藏字段中的值是经过编码的。
例如,
通过一些jQuery从隐藏字段中获取值被提取到
(在这一点上,我失去了编码):
$('#hiddenId').attr('value')
问题是,当我从隐藏字段中读取chalk & cheese
时,JavaScript似乎失去了编码。 我不希望值成为chalk & cheese
。 我希望字面意义上的amp;
被保留。
是否有JavaScript库或jQuery方法可以对字符串进行HTML编码?
jQuery的技巧不能编码引号,在IE中它将剥离你的空格。
基于Django中的escape模板标记,我猜它已经被大量使用/测试了,我制作了这个函数来完成所需的操作。
这可能比任何处理空格剥离问题的解决方案都更简单(可能也更快) - 并且它编码了引号,这是必要的,如果你将使用结果在属性值内部,例如。
function htmlEscape(str) { return str .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-03-04:
我刚刚注意到AngularJS正在使用上述方法:
https://github.com/angular/angular.js/blob/v1.3.14/src/ngSanitize/sanitize.js#L435
他们增加了一些改进-他们似乎在处理一个隐晦的Unicode问题以及将所有非字母数字字符转换为实体。我认为只要为文档指定了UTF8字符集,后者就不是必需的。我会注意到,django仍然没有做这些事情,因此我不确定它们有多重要。
更新于2016-04-06:
您可能还想转义正斜线/。这不是正确的HTML编码所必需的,但是作为反XSS安全措施,OWASP推荐使用。 (感谢@JNF在评论中提出这个建议)
.replace(/\//g, '/');
编辑:此答案很久以前发布,htmlDecode
函数引入了XSS漏洞。已经修改临时元素,从div
改为textarea
,减少了XSS的机会。但是现在,我建议您使用其他答案中提到的DOMParser API。
我使用这些函数:
function htmlEncode(value){ // Create a in-memory element, set its inner text (which is automatically encoded) // Then grab the encoded contents back out. The element never exists on the DOM. return $('').text(value).html(); } function htmlDecode(value){ return $('').html(value).text(); }
基本上,在内存中创建一个textarea元素,但它从未添加到文档中。
在htmlEncode
函数中,我设置了元素的innerText
,并检索了编码后的innerHTML
;在htmlDecode
函数中,我设置了元素的innerHTML
值,检索innerText
。
检查此处的运行示例。