element.innerHTML
在这种情况下?
使用 Django 服务器及其模板系统提供响应。
而不是这个:
function loadInfo(endpoint, container) {
$.get(endpoint)
.done(response => $(container).html(response))
}
这样做:
function loadInfo(endpoint, container) {
$.get(endpoint)
.done(response => container.innerHTML = response)
}
这样做的目的是通过尽可能少的 JavaScript 在页面的某些部分实现动态行为
最佳答案
通常,这些都不是安全的做法。
它们都接收原始 HTML 内容并将其注入(inject)到您的页面中。此功能经常被恶意行为者在称为 XSS(跨站点脚本)的攻击类型中滥用。
想象一个假设的场景,您有一个 API 端点,该端点在 <strong>
内返回用户的用户名。标签。
假设用户注册时没有进行验证,因此他们可以将用户名设置为他们想要的任何内容。理论上,他们可以将用户名设置为 <script>alert(1);</script>
。从那时起,无需极其仔细的清理,任何时候您使用任一 .html()
将该用户名插入页面中。或.innerHTML
,您可以插入一个脚本标记。
如果用户可以让一个简单的警报显示 1
,他们可以使用相同的方法从外部网站加载他们想要的任何脚本。利用此漏洞,他们可以使用专门构建的脚本轻松窃取密码、 session cookie 和支付信息。
更好的解决方案是将您的模板包含在客户端代码中,并使用 .text()
将从服务器接收到的纯文本数据插入到该客户端模板中。 , .innerText
,或.textContent
.
关于javascript - 使用 element.innerHTML 插入服务器返回并转义的 html 是安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57630703/