如何在JavaScript中unescape html?

DFe*_*oso 17 html javascript escaping

我正在使用一个Web服务,它会给我以下值:

var text = "<<<&&&";
Run Code Online (Sandbox Code Playgroud)

我需要使用javascript将其打印为"<<< &&&".

但是这里有一个问题:我不能使用内部HTML(我实际上是将这些值发送到创建文本节点的原型库,因此它不会取消我的原始html字符串.如果编辑库不是一个选项,如何你会忘记这个HTML吗?

我需要在这里承担真正的交易,这种类型的字符串有什么风险?innerHTML是如何做到的?还有哪些其他选择?

编辑 - 问题不是关于使用javascript普通的escape/unescape甚至jQuery/prototype实现它们,而是关于可能来自使用任何这些的安全问题...又名"他们告诉我使用它们是非常不安全的"

(对于那些试图用innerHTML来解决这个奇怪字符串的问题,请看看这个简单的例子:

<html>
<head>
<title>createTextNode example</title>

<script type="text/javascript">

var text = "&lt;&lt;&lt;&amp;&amp;&amp;";
function addTextNode(){
    var newtext = document.createTextNode(text);
    var para = document.getElementById("p1");
    para.appendChild(newtext);
}
function innerHTMLTest(){
    var para = document.getElementById("p1");
    para.innerHTML = text;
}
</script>
</head>

<body>
<div style="border: 1px solid red">
<p id="p1">First line of paragraph.<br /></p>
</div><br />

<button onclick="addTextNode();">add another textNode.</button>
<button onclick="innerHTMLTest();">test innerHTML.</button>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Sto*_*bor 11

更改您的测试字符串以&lt;b&gt;&lt;&lt;&amp;&amp;&amp;&lt;/b&gt;更好地处理风险是什么...(或更好地,&lt;img src='http://www.spam.com/ASSETS/0EE75B480E5B450F807117E06219CDA6/spamReg.png' onload='alert(document.cookie);'&gt;对于cookie窃取垃圾邮件)

请参阅http://jsbin.com/uveme/139/上的示例(基于您的示例,使用原型进行取消转换.)尝试单击四个不同的按钮以查看不同的效果.只有最后一个是安全风险.(您可以在http://jsbin.com/uveme/139/edit查看/编辑源代码)该示例实际上并没有窃取您的Cookie ...

  1. 如果您的文本来自已知安全的来源且不基于任何用户输入,那么您就是安全的.
  2. 如果您createTextNode用于创建文本节点并将未appendChild更改的节点对象直接插入到文档中,那么您就是安全的.
  3. 否则,您需要采取适当的措施,以确保不安全的内容无法进入您的浏览器浏览器.

注意:正如Ben Vinegar指出的那样使用createTextNode它并不是一个神奇的子弹:使用它来逃避字符串,然后使用textContentinnerHTML获取转义文本并使用它做其他事情并不能保护您的后续使用.特别是,如果用于填充属性,下面的Peter Brown的回答中escapeHtml方法是不安全的.


PET*_*OWN 5

一个非常好的阅读是http://benv.ca/2012/10/4/you-are-probably-misusing-DOM-text-methods/,这解释了为什么使用createTextNode的常规智慧实际上根本不安全.

一个代表性的例子来自上面的风险文章:

function escapeHtml(str) {
    var div = document.createElement('div');
    div.appendChild(document.createTextNode(str));
    return div.innerHTML;
};

var userWebsite = '" onmouseover="alert(\'derp\')" "';
var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
var div = document.getElementById('target');
div.innerHtml = profileLink;
// <a href="" onmouseover="alert('derp')" "">Bob</a>
Run Code Online (Sandbox Code Playgroud)