1.4.1 重新设置密码
小结:按照精心计划的过程重新设置被丢失或遗忘的密码
威胁:暴力攻击、账户劫持
为了避免客户付出处理丢失密码的系统开销,许多Web站点允许用户方便地找回或重新设置他们自己的密码。如果没有正确地实现重新设置密码的特性,则该特性可能将安全弱点引入Web应用程序中。
应该总是将丢失密码作为安全事件对待,采取额外的预防方法来保护用户的账户不被侵入。许多Web站点都采用一种临时的方法来处理丢失的密码:用户输入用户名和电子邮件地址(如图1-7和图1-8所示),几分钟后,可以接收到一份电子邮件,其中包含原始密码。实际上,经常访问站点的用户有时会使用一个方便的密码找回过程,而不是使用其他方法来记录或记住密码。

图1-7 只使用电子邮件的密码找回方法

图1-8 另一种只使用电子邮件的密码找回方法
但是,找回密码就意味着Web应用程序将密码存储在普通文本中,或者使用了可逆的加密方法,这两种方法都很糟糕,前面的“存储密码”一节已经描述过这两种方法。如果发生丢失密码的事件,应该总是放弃旧的密码,而要求用户设置新密码。绝对不应该允许用户找回丢失的密码,而只是设置新密码。提醒用户实际密码的提示并不是一个好的方法,特别是当提示就是密码自身时。
不发送原有密码并强迫用户重新设置新密码的另一个优点是,防止攻击者在用户一无所知的情况下获取用户的密码。虽然熟练的攻击者能够获得足够的信息和权限来重新设置用户密码,但这种攻击很难做到神不知、鬼不觉,用户下一次尝试登录到账户,但发现密码不再可用时,必将引起警觉。
重新设置密码的困难之处在于,希望为用户重新设置密码而提供方便,但又不希望在该过程中削弱密码的安全性。在应用重新设置密码之前,应该合理地确定事务的另一端是用户,而不是冒名顶替者。因为用户不再有初始的密码来证明其身份,必须采取其他步骤来验证用户的身份。下面是验证身份的一些方法:
n 通过分配账户的地址,给用户发送一封电子邮件。
n 请求用户回答一个或多个预先选择的秘密问题。
n 请求用户提供一条或多条与账户相关的信息(如邮政编码或出生日期)。
对于较高级的安全环境或处理特殊的敏感信息时,甚至可以采取进一步的措施来验证用户的身份:
n 通过账户提供的电话号码,打电话给用户。
n 通过预先选择的传真号,发送给用户一份传真。
n 通过邮局服务,给用户发送信件。
n 请求用户亲自到总公司或分公司表明身份。
请求用户回答秘密问题或提供其他信息的目的在于验证他们是否了解该账户,如图1-9所示。这将帮助防止对用户的随机匿名攻击,但它并不能保护用户不受到对

图1-9 使用个人信息找回密码的示例
用户熟悉的人的攻击。给用户发送电子邮件证明请求重新设置密码的人拥有用户电子邮件账户的使用权限。攻击者可能获得用户电子邮件账户的使用权限。但是,如果攻击者确实可以回答秘密的问题,并且阅读了用户的电子邮件,那么可能用户一方存在更严重的问题,服务商也无能为力。无论如何,仍然应该严禁在电子邮件中显示原有密码,而只提供链接以重新设置密码。
设计带有重新设置密码过程中清晰事件流程的系统。在整个过程中使用短时间内过期的安全会话标记。不要在任何URL上放置用户名、电子邮件地址或其他标志信息。
重新设置密码的过程具体如下:
1.请求用户提供账户名,并且回答一个或多个问题,这些问题可表明用户对该账户的了解程度,如图1-10所示。记录发出请求的客户端IP地址,并且将一个安全标记分配给重新设置密码会话。设置短时间内到期的会话——24小时或更短。

图1-10 重新设置密码的过程
2.发送一封电子邮件给账户分配的地址,解释已经请求重新设置密码;包括发出请求的客户IP地址。使用链接到重新设置过程的临时标记,来提供到Web站点的安全链接。如果不是发出重新设置密码请求的用户,则总是提供用户的电子邮件地址或URL,以此报告安全事故。
3.用户点击链接后,请求用户提供一个新密码和任选的新安全问题及答案。总是检查会话标记,以确保它没有过期。
有时用户会同时丢失用户名和密码,或者不能再使用用于建立账户的电子邮件地址。在这种情况下,可能需要提供手工验证过程,需要用户通过电子邮件或电话联系客户服务代表,以验证其身份。
图1-11显示了一个重新设置密码过程的示例。这个特殊的界面显示站点正确地要求设置新密码,而不是找回旧密码。虽然该站点要求电子邮件地址和一些个人信息,但就算是信用卡号,也绝对不能足够安全地用来验证用户账户。从用户处接受在线订单的任何商家都会要求用户在这个表单上填写所有必需的信息。初看之下,该过程似乎更为安全,因为它发送给用户一封电子邮件,但请记住,这是用户的电子邮件账户,如果用户已经忘记了账户密码,则不可能成功发送该电子邮件。在这种情况下,必须充分进行验证,从而允许完全访问该账户。除了询问信用卡信息之外,该过程还应该询问其他个人信息,并且请求用户回答一个秘密问题。

图1-11 重新设置密码过程的示例
重新设置密码过程中的一个常见缺陷是,Web应用程序使用隐藏表单字段或查询字符串将状态信息从一个页面传递到下一个页面。例如,为了询问用户秘密问题,首先必须查找该用户是谁,然后再查找相关的秘密问题。因此,大多数重新设置密码的过程都首先要求用户在Web表单中输入电子邮件地址。在下一个页面中,Web应用程序给出一个秘密问题,并且请求用户回答。最后,验证这个秘密问题,并且采取行动以找回或重新设置密码。但有时候,Web站点会将用户的电子邮件地址或用户名作为隐藏的表单字段进行传递,攻击者可修改这个隐藏的表单字段。有时,这将导致密码被发往所选择的电子邮件地址。另一个常见的缺陷是,可以使用一个账户开始该过程,然后在中途修改一个参数,跳到另一个账户,再结束该过程。
回顾重新设置密码的过程,应确保应用在发送电子邮件之前,充分验证用户的身份。绝对不要将电子邮件发送给该账户所分配地址之外的地址。浏览重新设置密码的过程,检查每个步骤,确保适当和安全地链接到前一个步骤。确保不会在重新设置过程的中途切换到另一个账户。
安全策略
n 将重新设置密码作为安全事件对待,记录客户端的IP地址,并且采取其他实际的安全措施。
n 绝对不要找回用户的密码;只允许用户设置新密码。
n 绝对不要使用密码提示来提醒用户实际密码。
n 通过回答安全问题或提供与账户相关的信息,请求用户表明对该账户的了解程度。绝对不允许匿名重新设置密码。
n 发送给用户一封电子邮件,确认重新设置密码,提供一个安全链接以完成该过程。
n 如果可行的话,清除任何使用账户存储的敏感信息,例如,信用卡号。
n 在重新设置密码后终止所有现有的会话。







