我需要尽可能地集中防止XSS攻击,这样我就不必明确清理每个输入。
我的问题是,更好地清理URL /请求处理级别的所有输入,在服务之前编码/清理输入,还是在表示级别(输出清理)? 哪一个更好,为什么?
答案 0 :(得分:2)
您需要注意两个方面:
将输入用作任何语言的脚本一部分的任何地方,最明显包括SQL。在SQL的特定情况下,仅推荐的处理事物的方法是使用参数化查询(这将导致未转义的内容在数据库中,但就像字符串一样:这是理想的)。在将它们直接替换为SQL字符串之前涉及到字符的魔术引用的任何事情都是劣等的(因为它很容易出错)。任何无法通过参数化查询完成的操作都是针对SQL注入提供保护的服务永远不允许用户指定的内容。
您提供作为输出输入的内容的任何地方。输入源可以是直接的(包括通过cookie)或间接的(通过数据库或文件)。在这种情况下,您的默认方法应该是使用户看到的文本成为输入的文本。这很容易正确实现,因为您实际需要引用的唯一字符是<
和&
,您可以将它全部包装在<pre>
中以供显示。
但这通常还不够。例如,您可能希望允许用户进行某种格式化。这是容易出错的地方。在这种情况下,最简单的方法是解析输入并检测所有格式化指令;其他一切都需要正确引用。您应该将格式化版本另外存储在数据库中作为额外列,以便在将其返回给用户时不需要做太多工作,但是您还应该存储用户输入的原始版本,以便您可以搜索它。 不要混淆它们! 真的!审核您的申请,使完全确保您做到了这一点(或者,更好的是,让其他人进行审核)。
但是关于小心SQL的一切仍然适用,并且有许多HTML标记(例如,<script>
,<object>
)和属性(例如,onclick
)从来都不是安全的
您正在寻找有关特定包装的建议吗?你真的需要选择一种语言。以上建议完全与语言无关。附加软件包/库可以使上面的许多步骤在实践中变得非常简单,但你仍然需要小心。