目前,我正在学习API以及如何在动态网站中使用它们。我编写了一些示例网站,在那里我从API获取数据。
我一直在使用innerHTML
将内容添加到我的页面。
我的老师使用createElement
textContent
和appendChild
在课程期间将内容添加到他的页面。
当被问到时,他解释说innerHTML比textContent更加不安全,例如如果API不可靠或者注入了恶意代码,innerHTML可以编辑整个HTML,而不仅仅是带有textContent的内容。 ChaseMoskal也尝试在此评论中解释innerText vs innerHtml vs label vs text vs textContent vs outerText
我得到了基本的想法,但是,通过以下代码示例解释,我觉得两者都存在相同的安全问题。
var container = document.querySelector("#container");
var json1 = "Link to an image of my house";
var json2 = "Link to an image of my boat";
var jsonMaliciousCode = "maliciousCode3000"
// Create p element with innerHTML
container.innerHTML += "<a href=\""+maliciousCode+"\">" + json1 + "</a>";
// Create p element with textContent, href and appendChild
var innerExample = document.createElement('a');
innerExample.textContent = json2;
innerExample.href = maliciousCode;
container.appendChild(innerExample);
工作示例:https://jsfiddle.net/vh8hLhbj/4/
我没有得到或错过了什么?
答案 0 :(得分:2)
当您使用innerHTML
时,任何内容都可以在其中呈现,而您无法控制它。
检查以下示例。
var codeSnippet = "<div style='height:100px;width:100px;background-color:red' onclick='window.console.log(\"Anything!!!\");'><a href='#'>Click Here</a></div>";
document.getElementById('unsafe').innerHTML = codeSnippet;
document.getElementById('safe').textContent = codeSnippet;
&#13;
<div id="unsafe">
</div>
<br>
<div id="safe">
</div>
&#13;
答案 1 :(得分:1)
区别在于恶意代码的使用方式。 使用以下代码可能会显示差异:
var container = document.querySelector("#container");
var json1 = "Link to an image of my house";
var json2 = "Link to an image of my boat";
var maliciousCode = "javascript:alert('test');\" xxx=\"maliciousCode3000\""
// Create p element with innerHTML
container.innerHTML += "<a href=\""+maliciousCode+"\">" + json1 + "</a>";
// Create p element with textContent, href and appendChild
var innerExample = document.createElement('a');
innerExample.textContent = json2;
innerExample.href = maliciousCode;
container.appendChild(innerExample);
这里是小提琴:https://jsfiddle.net/vh8hLhbj/6/
您将看到第一个示例显示弹出窗口,而第二个示例没有。想象一下,例如,是否有一些javascript访问cookie,或者观看键盘输入。