过滤用户输入数据是否足够,还是应该对其进行解析?

信息安全 Web应用程序 xss 应用安全 攻击预防
2021-08-30 04:25:17

在 Web 应用程序中,可能有两种方法可以缓解 XSS 攻击:

  • 可以过滤所有输入数据(删除所有“坏”数据),或
  • 可以仅使用允许的标签等对输入进行解析、标记化和输出

从安全角度来看,应该首选哪种方法?

无论哪种方法,有什么问题?

4个回答

我同意@Jorn关于验证 的回答。

但是,您仍然在这里忘记了一个非常重要的步骤,那就是输出编码
例如,在输出任何内容之前进行 HTML 编码(或属性编码,或 Javascript 编码等)...事实上,这可以说比输入验证重要(可以说,不是绝对的,也绝对不是在所有情况下...
)任何事件都不应该是/或,它绝对是严格的输入验证+输出编码。

现在,如果您指的是在输出中包含“安全”HTML 标签(那么它在您的问题中不是很清楚),那么您仍然应该对所有内容进行编码,然后解码您正在寻找的特定标签,而无需任何标签的属性

Ps 如果您指的是 .NET 应用程序,MS 的 AntiXSS(在 WPL 中)提供了一.GetSafeHTMLXXX组方法。

对于输入验证,我建议结合通过或拒绝的白名单方法。所以定义什么是有效的,只接受有效的输入,拒绝其他的。

如果您构建了一个将 html 发送到服务器的富文本编辑器,您可以使用 JavaScript 来清理输入,以便从 Word 粘贴 html 最终可以正常工作。然而,您的服务器不会接受任何未经处理的输入。

尝试清理可能会出错,因为这通常比确定输入是否有效要复杂得多。

白名单对于良好的安全性至关重要。您可以随时决定接受更多输入,同时保持控制。在黑名单方法中,您总是必须赶上最新的黑客攻击。

有关输出,请参阅其他答案。

你的问题“用户输入数据,过滤足够还是应该被解析?” 比 XSS 的情况更普遍。我想,您想针对 XSS 进行具体说明,但通常用户输入会导致许多额外的漏洞利用,例如 SQL 注入、路径遍历、XSS ......随着您的问题在 XSS 上变得更加具体,我会参考已经说过的内容并继续输入过滤和输出编码(始终是服务器端!!)以及一些已知的对策,如OWASP提供的。

不过,我想指出,解决可能由未经检查的输入引起的 SQL 注入的最佳方法是在参数化查询(SQL 注入预防备忘单)中,然后如果您考虑路径遍历漏洞,我的方法将是一些白名单方法。

这个问题太宽泛了。最好的答案是:视情况而定。这取决于用户数据的格式,以及您正在执行的安全策略。

  • 例如,如果您在 SQL 查询中包含用户数据,最好的答案是使用准备好的语句。

  • 例如,如果您在 HTML 页面中包含用户数据(例如,他们的全名),最好的答案可能是使用输出编码。

  • 例如,如果您正在构建一个允许人们发送 HTML 电子邮件的网络邮件服务,并且您希望向用户显示 HTML 电子邮件,但前提是该电子邮件不包含任何活动内容,那么最佳答案将涉及解析和过滤解析的内容。

最佳答案取决于域。要获得更有用的答案,您将需要提供有关您要解决的具体问题的更多细节。