【发布时间】:2015-11-13 11:57:10
【问题描述】:
我正在使用 Django 开发一个 Web 应用程序。
目前我正在发送“重置密码链接”完整的电子邮件(亚马逊简单电子邮件服务 - SES)
我使用的机制,与下面链接“simeonwillbanks”的答案相同
Secure ways to reset password or to give old password
- 为用户提供重置密码选项。
- 此选项为用户保存唯一令牌。令牌最终会过期(几小时、几天或几天)。
- 包含令牌的链接通过电子邮件发送给用户。
- 用户点击电子邮件链接。
- 如果令牌存在且未过期,则链接会加载新的密码表单。如果没有,请不要加载新密码表单。
- 用户设置新密码后,删除令牌并向用户发送确认电子邮件。
我担心的是,我不确定这种方式在安全性方面是否安全。如果电子邮件被黑客捕获怎么办?
我在几个主要网站上测试了他们对此的关心程度。
- 获取“重置密码”电子邮件并复制链接。
- 将链接提供给其他人,看看他是否可以更改我帐户的密码。
通过这次测试,我发现其他人也只能通过链接更改我的密码。
如果我不能对链接做任何事情,有没有办法让电子邮件更安全? 像网站上ssl(https)的机制吗?
谢谢!
【问题讨论】:
-
您唯一能做的就是使用 SMTP/S 而不是普通 SMTP 发送电子邮件,并尽可能缩短令牌的有效期(几分钟而不是几小时或几天),但您'是的,这种常用的重置密码流程本质上是不安全的。
-
您可以首先在输入令牌时询问一些额外的安全细节,或者使用短信/手机号码等第二个因素。您也可以不要求提供电子邮件,而是要求登录,该登录永远不会向网站上的任何人显示(即,如果您想攻击某人,则无法仅使用电子邮件地址重置他的帐户)。所有这些都增加了一个小的附加层,但也增加了支持请求(忘记用户名等)。
-
谢谢大家的回答! @Robby Cornelissen,你能解释一下关于 SMTP/S 的更多信息吗?我试图研究它,没有足够的参考。
-
我也在为 ses 使用 boto(AWS 的 Python 库),根据他们的文档,Amazon SES 通过受 TLS 保护的连接(仅限 TLS 1.0 版)发送消息默认。这种方法称为机会 TLS,意味着当 Amazon SES 与接收邮件服务器建立 SMTP 连接时,如果接收邮件服务器支持 TLS,Amazon SES 会使用 STARTTLS 协议升级连接。如果接收服务器不通告 STARTTLS 或 TLS 协商失败,则连接以明文方式进行 TLS 不够安全?
标签: security email reset-password