对于网站上的输入验证,向用户准确披露给定字段的有效或无效字符是否存在任何安全问题?
CWE-200: Information Exposure表示应该尽量不披露“可能对攻击有用但攻击者通常无法获得的信息”。一个具体的例子是防止系统暴露堆栈跟踪(由CWE-209 解决:通过错误消息暴露信息)。
是否应该确保错误消息含糊不清,例如“您输入的文本包含无效字符”?
包含用于验证客户端代码(例如 JavaScript)中的输入的正则表达式是否是一个安全漏洞,攻击者可以看到?另一种方法是在服务器端验证输入,这会在一定程度上降低可用性,因为它需要更多的后端通信(例如,它可能导致站点响应和显示错误更慢)。
或者这是一种“通过默默无闻的安全”的形式,因为用户/攻击者可以通过重复提交不同的字符以查看它们是否产生错误来推断哪些字符是有效的?
是否值得通过用户体验来降低攻击速度?
我应该注意,据我所知,OWASP 的Input Validation Cheat Sheet和Data Validation development guide没有提供关于这个主题的方向。
编辑 2020-01-17:
关于为什么要进行任何输入验证,有几个问题(包括我努力撰写评论的答案已被删除) 。
首先,感谢@Loek 对 OWASP 的应用程序安全验证标准的评论,该标准在第 21 页和第 22 页提供了密码指导:“验证没有密码组合规则限制允许的字符类型。应该没有要求用于大写或小写或数字或特殊字符。”。
我认为我们都同意限制密码中的字符通常是一个坏主意(请参阅@Merchako 的回答)。正如@emory 指出的那样,这可能不是一个硬性规定(例如,我看到许多移动应用程序使用更易于使用的辅助“PIN”来保护应用程序,即使其他人有权登录设备。)当我问这个问题时,我并没有真正想到密码,但这是评论和答案的一个方向。因此,出于这个问题的目的,让我们将其视为非密码字段。
输入验证是网站、Web 服务和应用程序“深度防御”的一部分,以防止注入攻击。如 OWASP 所述,注入攻击“可能导致数据丢失、损坏或向未授权方披露、责任丧失或拒绝访问。注入有时会导致主机完全接管。业务影响取决于应用程序和数据。”
有关更多详细信息,请参阅 OWASP 的 #1 漏洞、A1-Injection和CWE-20:不正确的输入验证。请注意,他们都说输入验证不是一种完整的防御,而是软件产品“深度防御”的一层。