如何避免“跨站点脚本攻击”

时间:2010-08-09 11:48:28

标签: javascript xss

如何避免跨站点脚本攻击?

Cross-site script attacks(或跨网站脚本)是指您的主页上有一个留言板,并且客户发布了一些fx 重定向您的javascript代码到另一个网站或通过电子邮件将您的cookie发送给恶意用户,或者它可能是很多其他可能对您和访问您网页的人员造成真正伤害的东西。

我确信它可以做到fx。在PHP中通过验证表单,但我没有经验足够fx。禁止javascript或其他可能伤害你的东西。

我希望你能理解我的问题,并且能够帮助我。

2 个答案:

答案 0 :(得分:14)

  

我确信它可以做到fx。在PHP中通过验证表单

不是真的。输入阶段完全是解决XSS问题的错误地方。

如果用户在输入中输入<script>alert(document.cookie)</script>,则其本身没有任何问题。我刚刚在这条消息中做到了,如果StackOverflow不允许它,我们在网站上谈论JavaScript时会遇到很大困难!在大多数情况下,您希望允许任何输入(*),以便用户可以使用<字符来表示小于号。

问题是,当您将一些文本写入HTML页面时,您必须正确地将其转义为它所进入的上下文。对于PHP,这意味着在输出阶段使用htmlspecialchars()

<p> Hello, <?php echo htmlspecialchars($name); ?>! </p>

[PHP提示:你可以自己定义一个名称较短的函数echo htmlspecialchars,因为每次你想把变量放到某些HTML中时,这都是很多的输入。]

无论文本来自何处,无论是否来自用户提交的表单,都必须这样做。虽然用户提交的数据是忘记HTML编码的最危险的地方,但关键是你要用一种格式的字符串(纯文本)并将其插入另一种格式(HTML)的上下文中。每当您将文本放入不同的上下文时,您将需要一个适合该上下文的编码/转义方案。

例如,如果将文本插入JavaScript字符串文字中,则必须转义引号字符,反斜杠和换行符。如果将文本插入URL中的查询组件,则需要将大多数非字母数字转换为%xx序列。每个环境都有自己的规则;你必须知道哪个是你选择的语言/框架中每个上下文的正确功能。你无法通过在输入阶段修改表单提交来解决这些问题 - 尽管许多天真的PHP程序员都会尝试,这就是为什么如此多的应用程序在极端情况下搞砸了你的输入但仍然不安全。

(*:好吧,差不多。有一个合理的论据可以从提交的文本中过滤掉ASCII控制字符。允许它们做任何好事都是不太可能的。  此外,您还需要进行特定于应用程序的验证,例如确保电子邮件字段看起来像电子邮件地址,或者数字确实是数字。但是,这不是可以全面应用于所有输入以使您摆脱困境的东西。)

答案 1 :(得分:9)

当服务器接受来自客户端的输入,然后盲目地将该输入写回页面时,就会发生跨站点脚本攻击(XSS)。大多数针对这些攻击的保护涉及转义输出,因此Javascript变为纯HTML。

要记住的一件事是,不仅是直接来自客户端的数据可能包含攻击。 存储的XSS 攻击涉及将恶意JavaScript写入数据库,然后由Web应用程序查询其内容。如果数据库可以与客户端分开编写,则应用程序可能无法确定数据是否已正确转义。出于这个原因,Web应用程序应该将它写入客户端的所有数据视为可能包含攻击。

有关如何保护自己的详尽资源,请参阅此链接:http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet