清理用户输入的最佳方法是什么?

时间:2013-02-19 08:19:49

标签: php web-applications web tcl xss

我需要尽可能地集中防止XSS攻击,这样我就不必明确清理每个输入。

我的问题是,更好地清理URL /请求处理级别的所有输入,在服务之前编码/清理输入,还是在表示级别(输出清理)? 哪一个更好,为什么?

1 个答案:

答案 0 :(得分:2)

您需要注意两个方面:

  1. 将输入用作任何语言的脚本一部分的任何地方,最明显包括SQL。在SQL的特定情况下,推荐的处理事物的方法是使用参数化查询(这将导致未转义的内容在数据库中,但就像字符串一样:这是理想的)。在将它们直接替换为SQL字符串之前涉及到字符的魔术引用的任何事情都是劣等的(因为它很容易出错)。任何无法通过参数化查询完成的操作都是针对SQL注入提供保护的服务永远不允许用户指定的内容。

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

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

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


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