使用javascript转义用户给出的文本。插入页面时有些东西'unescape'

时间:2014-10-03 23:26:30

标签: javascript jquery dom

我希望以避免XSS的方式将用户输入转移到另一个用户看到的页面中。

我的文字进入div。所以,我想遵循以下建议:https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content

(也就是说,我想逃避&<>“'和/)

我正在使用这个javascript来做那个

escapeHTML: function (unsafe_str) {
                return unsafe_str
                        .replace(/&/g, '&')
                        .replace(/</g, '&lt;')
                        .replace(/\//g, '&#x2F;')
                        .replace(/>/g, '&gt;')
                        .replace(/\"/g, '&quot;')
                        .replace(/\'/g, '&#39;');
}

当我将字符串打印到控制台时,该函数似乎应该做它应该做的事情。

但是,在我做div.innerHTML = escaped_string的那一刻,html中有一些字符“未转义”(/“和'再次成为单个字符,而不是字符串)

我尝试使用其他方法将字符串放在页面中,包括jquery。总是得到相同的结果。

发生了什么事?


澄清:

我想要的结果是,当我将字符串&</>\"'添加到文档时,html会显示&amp;&lt;&#x2F;&gt;&quot;&#39;并显示&</>"'

我通常得到的是一个读取&amp;&lt;/&gt;"'并正确显示的html(即&</>"'

(我担心在某种XSS中使用的字符/"'

1 个答案:

答案 0 :(得分:1)

使用.textContent代替.innerHTML。然后,数据将按字面插入,而不是被解析为HTML,因此您不需要将特殊字符转换为实体。

HTML:

<div id="target"></div>

JS:

document.getElementById("target").textContent = "<a>This is not a link & you can't click on it</a>";

DEMO

IE8及更早版本不支持.textContent,请使用.innerText。这是一个polyfill