我希望以避免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, '<')
.replace(/\//g, '/')
.replace(/>/g, '>')
.replace(/\"/g, '"')
.replace(/\'/g, ''');
}
当我将字符串打印到控制台时,该函数似乎应该做它应该做的事情。
但是,在我做div.innerHTML = escaped_string
的那一刻,html中有一些字符“未转义”(/“和'再次成为单个字符,而不是字符串)
我尝试使用其他方法将字符串放在页面中,包括jquery。总是得到相同的结果。
发生了什么事?
澄清:
我想要的结果是,当我将字符串&</>\"'
添加到文档时,html会显示&</>"'
并显示&</>"'
我通常得到的是一个读取&</>"'
并正确显示的html(即&</>"'
)
(我担心在某种XSS中使用的字符/"'
)
答案 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>";
IE8及更早版本不支持.textContent
,请使用.innerText
。这是一个polyfill