使用jQuery逃离HTML
我想出了一个黑客使用jQuery转义HTML,我想知道是否有人看到它的问题。
$('<i></i>').text(TEXT_TO_ESCAPE).html();
<i>
标签只是一个虚拟的,因为jQuery需要一个容器来设置文本。
有没有更简单的方法来做到这一点? 请注意,我需要存储在variables中的文本,而不是显示(否则我可以只是调用elem.text(TEXT_TO_ESCAPE);
)。
谢谢!
这是一个非常标准的做法,我的版本使用了一个<div>
:
return $('<div/>').text(t).html();
尽pipeMike Samuel指出,这在技术上不是100%安全的,但在实践中可能是相当安全的。
目前的Prototype.js是这样做的:
function escapeHTML() { return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); }
但它曾经使用“把文本放在div中并提取HTML”的伎俩。
在下划线中也有_.escape
,就是这样的:
// List of HTML entities for escaping. var htmlEscapes = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/' }; // Regex containing the keys listed immediately above. var htmlEscaper = /[&<>"'\/]/g; // Escape a string for HTML interpolation. _.escape = function(string) { return ('' + string).replace(htmlEscaper, function(match) { return htmlEscapes[match]; }); };
这几乎和Prototype一样。 我最近做的大部分JavaScript都有_.escape
所以我倾向于使用_.escape
这些日子。
不能保证html()
将被完全转义,所以在连接后结果可能是不安全的。
html()
基于innerHTML
,并且浏览器可以在不违反许多期望的情况下实现innerHTML
使$("<i></i>").text("1 <").html()
为"1 <"
,那$("<i></i>").text("b>").html()
是"b>"
。
然后,如果连接这两个单独的安全结果,则会得到"1 <b>"
,这显然不是两个纯文本片断连接的HTML版本。
因此,从最初的原则中扣除这个方法并不安全,并且没有广泛遵循innerHTML
规范(虽然HTML5确实解决了这个问题)。
最好的方法来检查它是否做你想要的是testing像这样的angular落案件。
这应该工作。 这基本上是Prototype.js库如何做,或者至less它是如何做到的。 我通常做三个电话“.replace()”,但这大多只是一个习惯。