你如何使用JavaScript进行HTML编码?

38 浏览
0 Comments

你如何使用JavaScript进行HTML编码?

我正在使用JavaScript从隐藏字段中提取值,并在文本框中显示它。隐藏字段中的值是经过编码的。

例如,


通过一些jQuery从隐藏字段中获取值被提取到


(在这一点上,我失去了编码):

$('#hiddenId').attr('value')

问题是,当我从隐藏字段中读取chalk & cheese时,JavaScript似乎失去了编码。 我不希望值成为chalk & cheese。 我希望字面意义上的amp;被保留。

是否有JavaScript库或jQuery方法可以对字符串进行HTML编码?

admin 更改状态以发布 2023年5月21日
0
0 Comments

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, '/');

0
0 Comments

编辑:此答案很久以前发布,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 $('