输入净化

从用户输入中移除或中和有害代码和无效字符的过程。是防御 XSS 和 SQL 注入的基本手段。

输入净化是从用户输入数据中移除或中和有害代码和无效字符串的过程。它是 Web 应用安全中最基本的防御手段之一,基于"永远不信任输入,必须验证和转换"的原则。如果忽略净化处理,攻击者可以通过表单或 URL 参数注入恶意代码,导致数据泄露或系统被入侵。

在 XSS (跨站脚本) 攻击中,恶意 JavaScript 代码通过用户输入嵌入到网页中。例如,如果在论坛的发帖栏中输入 <script>alert('XSS')</script>,在没有净化处理的情况下,该脚本会在其他用户的浏览器中执行。SQL 注入则是将恶意 SQL 语句插入数据库查询中,导致数据篡改或泄露。搜索肛塞 (Amazon)系统介绍了这些技术。

净化方法有多种途径。HTML 转义将特殊字符转换为实体引用,将 < 替换为 &lt;,将 > 替换为 &gt;。白名单方式只允许许可的字符或标签通过,适用于安全显示富文本编辑器的输出。黑名单方式移除禁止的模式,但由于无法应对未知的攻击模式,白名单方式被认为安全性更高。

在实际开发中,净化通常与验证 (检查输入值是否符合预期格式) 配合使用。验证判断"输入是否符合预期格式",净化则"将输入转换为安全格式"。例如在邮箱输入框中,推荐采用双重防御:验证检查格式,净化中和 HTML 标签。大多数框架都提供了内置的净化功能,使用框架功能比自行实现更加安全。

净化和转义经常被混淆,但严格来说是不同的概念。净化是移除或转换危险元素的综合处理,而转义是将在特定上下文 (HTML、SQL、URL 等) 中具有特殊含义的字符转换为安全表示的处理。根据输出目标的上下文选择适当的转义方式至关重要:HTML 输出使用 HTML 转义,SQL 查询使用参数化查询 (预处理语句)。

从字符计数角度看,净化处理可能改变字符串长度。例如 < 转换为 &lt; 时,1 个字符变为 4 个。在设计数据库列长度或表单字符数限制时,需要考虑净化后的字符串长度。用户输入的字符数与净化后存储在数据库中的字符数不一致,是常见的 bug 来源。探索搭讪书籍 (Amazon)提供了更多指导。

分享这篇文章