我正在开发的 Web 应用程序是 100% 受 SSL 保护的(或者更确切地说是 TLS,因为它现在被称为......)。该应用程序最近已由一家安全公司审核。我大多同意他们的结果,但有一件事引发了激烈的辩论:
作为用户密码更改过程的一部分,用户必须提供旧密码和新密码两次——这并不罕见。除此之外,新密码必须符合密码策略(最小长度,yadda yadda)。
该应用程序是通过 Vaadin 实现的,它使用小的 AJAX 消息来更新 UI。应用程序的整个逻辑都存在于服务器上。这意味着密码更改表单的所有验证都发生在服务器上。为了验证表单,旧密码和两个新密码(当然应该匹配)都必须发送到服务器。如果有任何错误(旧密码错误、新密码不匹配、新密码不符合密码策略),用户会收到错误消息。不幸的是,作为同步过程的一部分,Vaadin 将所有表单数据再次发送回客户端——包括旧密码和新密码。
由于这一切都是通过 SSL 发生的,我从来没有考虑过,但安全公司认为这是最严重的安全风险。请注意,安全公司眼中的问题不是数据被发送到服务器,而是服务器在其响应中包含数据以防验证失败。因此,我们当前的解决方案是在验证失败时清空所有字段。这会导致糟糕的用户体验,因为如果密码反复与密码策略不匹配,用户必须一次又一次地填写三个文本字段。
我是否天真地认为这太过分了?我的意思是,如果攻击者破坏了加密,他们无论如何都可以访问整个流量。
编辑:关于肩部冲浪,我想明确指出,没有任何密码会回传给用户。所有输入字段都是正确的密码字段,仅显示占位符但不显示实际字符。