javascript - 使用 element.innerHTML 插入服务器返回并转义的 html 是安全的

标签 javascript html

有时我喜欢向服务器发出 Ajax 请求,但我不是返回 json,而是返回 html 并在该 html 中附加 jQuery html method 。直接使用就安全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/

相关文章:

Javascript 和 Python - 最佳通信方法

javascript - 如何以三元方式使用 insertAfter 和 insertBefore 代码转换 if block ?

javascript - 如何外部化我的数据

javascript - 过滤后 Angular 表达式中出现意外标记

javascript - 网页 : Animated clouds -- overflow and middle mouse click?

javascript - 如何更改外部样式表的CSS规则

html - 导航栏品牌和同一行的其他导航菜单

javascript - 使用数组制作d3.map

javascript - onKeyDown 事件未触发

javascript - 在销毁之前检查 JQueryUI 按钮是否存在?