2013-02-19 65 views
0

我需要尽可能以集中的方式防止XSS攻击,这样我就不必显式清理每个输入。消毒用户输入的最佳方式是什么?

我的问题是在URL /请求处理级别消毒所有输入,在服务之前对输入进行编码/消毒,还是在显示级别(输出消毒)都更好? 哪一个更好?为什么?

+4

仅在必要时进行消毒:请勿在此之前进行此项工作。 (例如,不要将保存在数据库中的htmlspecialchars中传递的值)仅在需要打印输出时才执行此操作。 [Twig](http://twig.sensiolabs.org/)已自动转义,您不必担心应用程序的这一方面。 – Federkun 2013-02-19 08:54:47

+0

谢谢,但为什么不呢?在将数据插入数据库之前已经清理数据的问题是什么?我试图集中它来减少工作量。 – 2013-02-19 09:22:27

+0

可能的重复[在PHP网站中避免xss攻击的最佳实践](http://stackoverflow.com/questions/71328/what-are-the-best-practices-for-avoiding-xss-attacks- in-a-php-site) – Quentin 2013-02-19 09:26:13

回答

2

有,你需要注意两个方面:

  1. 任何地方,你在任何语言中,最值得注意的是,包括SQL中使用输入作为脚本的一部分。在SQL的特殊情况下,只有推荐的处理事情的方式是使用参数化查询(这会导致非转义内容在数据库中,但正如字符串:这很理想)。在将字符直接替换为SQL字符串之前,任何涉及字符的神奇引用都是次要的(因为它很容易出错)。任何无法通过参数化查询完成的事情都是针对SQL注入的服务应该永远不允许用户指定。

  2. 任何地方,您呈现的内容都是输入的内容。输入源可以是直接的(包括通过cookie)或间接的(通过数据库或文件)。在这种情况下,您的默认方法应该是将用户看到的文本作为输入的文本。这很容易正确实现,因为您实际上只需引用的字符是<&,并且您可以将其全部包装在<pre>中进行显示。

但这通常是不够的。例如,您可能想要允许用户进行某种格式化。这是它容易出错的地方。在这种情况下最简单的方法是解析输入并检测所有格式化指令;一切都需要正确引用。您应该将格式化版本额外存储在数据库中作为额外的列,以便在将其返回给用户时不需要做太多工作,但是您还应该存储用户输入的原始版本,以便您可以搜索它。 不要混淆!真的!审核您的应用程序,使完全确保您得到这个权利(或者,更好的是让别人来做审计)。

但是,关于使用SQL小心的一切仍然适用,并且有许多永远不会安全的HTML标记(例如,<script><object>)和属性(例如,onclick)。


您正在寻找有关特定包做的工作的建议?你真的需要选择一种语言。上述建议完全与语言无关。附加软件包/库可以使上述许多步骤在实践中变得非常简单,但您仍然需要小心。

+0

非常感谢您的答复,它正是我所需要的,实际上我从来没有打算将它作为一个语言特定的问题,因为它的价值在于使用TCL作为实现语言。 – 2013-02-19 09:49:46

相关问题