从输入字段读取属性时,HTML编码丢失。

30 浏览
0 Comments

从输入字段读取属性时,HTML编码丢失。

我正在使用JavaScript从隐藏字段中获取值并将其显示在文本框中。隐藏字段中的值是编码的。

例如,


被提取为


通过使用一些jQuery来从隐藏字段中获取值(在此时会丢失编码):

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

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

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

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

jQuery的技巧不会编码引号,在IE中它会剥夺你的空格。

基于Django中的escape templatetag,我想这已经被大量使用/测试过了,我制作了这个函数完成需要的工作。

这可能比解决空格剥夺问题的任何解决方法都要简单(可能更快)-它编码了引号,如果你要在属性值中使用结果,这是必不可少的。

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
(也在这里引用: Fastest method to replace all instances of a character in a string
这里有一些性能结果:
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仍然没有做这两件事,所以我不确定它们有多重要:
https://github.com/django/django/blob/1.8b1/django/utils/html.py#L44

更新 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 $('