从输入字段读取属性时,HTML编码丢失。
从输入字段读取属性时,HTML编码丢失。
我正在使用JavaScript从隐藏字段中获取值并将其显示在文本框中。隐藏字段中的值是编码的。
例如,
被提取为
通过使用一些jQuery来从隐藏字段中获取值(在此时会丢失编码):
$('#hiddenId').attr('value')
问题是,当我从隐藏字段中读取chalk & cheese
时,JavaScript似乎丢失了编码。我不希望值为chalk & cheese
。我希望保留字面amp;
。
是否有JavaScript库或jQuery方法可以对字符串进行HTML编码?
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
他们添加了一些改进-他们似乎处理了一个
我会注意到(四年后),Django仍然没有做这两件事,所以我不确定它们有多重要:
https://github.com/django/django/blob/1.8b1/django/utils/html.py#L44
更新 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
。
在这里查看运行示例。