得到副作用与获取密码重置

时间:2010-07-08 09:30:02

标签: model-view-controller forms httpwebrequest get

通常,获取请求并不意味着有任何副作用。但是,许多网站允许您通过单击电子邮件中嵌入的链接重置密码或验证您的电子邮件/用户。由于我们不想发送HTML电子邮件,因此无法使用POST数据的表单,因此我们必须使用get请求。 然而,使用具有副作用的GET的请求被认为是不好的设计。你对此有何看法?有没有办法解决这个难题?

4 个答案:

答案 0 :(得分:3)

通常,此类链接仅包含一个标记,用于标识要重置密码的用户。重置密码的请求。它不会登录用户。

然后会显示一个表单,用户可以在其中创建新密码。

无论如何,GET请求应该是幂等的并不是一个很难的事实,它更像是一个指导原则。如果它提高了用户不遵守该指导方针的可用性,那么(在考虑替代方案和后果之后)。最后,可用性很重要。

但是如果您想通过生成随机密码重置密码并将其发送给用户,请不要这样做。在未加密的电子邮件中发送明文密码是一个非常糟糕的主意。在这种情况下,我宁愿在安全性之前使用安全性,让用户自己选择它。

<强>更新

顺便说一下。这些URL的一个非常重要的一点是它们通常只能访问一次或至少只有用户没有完成该过程才能访问。因此,尽管您可能会使用GET请求更改某些内容,但无论如何都会删除该资源。

答案 1 :(得分:1)

这是一个有趣的用法,我相信这是一种可以接受的做法。但这不是规则的例外。基本上,通常采用这种方式,您必须事先以不同的方式重置密码,通常是在POST表单中输入您的用户名或电子邮件。

您可以将POST请求视为重置密码的操作。但即使您已经开始重置密码的过程,系统仍需要验证您的身份。这通常通过发送SMS消息或电子邮件来完成,该消息或电子邮件包含链接到该POST请求的代码/安全令牌。需要完成的所有过程都是系统以任何可能的方式从您那里接收代码。您可以将其键入另一个POST表单(例如,如果您通过SMS接收它),也可以将其嵌入到电子邮件链接中。

所以即使从技术上讲,你的最终GET请求有副作用,它仍然是一个幂等操作。因为除非您已经发出了早期的POST请求以启动重置过程,否则该链接本身不会执行任何操作。对GET url的任何后续请求都不起作用。

修改

我认为还应该注意的是,将链接放入电子邮件可以避免网络浏览器意外触发非幂等操作的问题。此外,大多数此类链接立即重定向到无副作用页面的事实,以及页面本身具有一次性令牌的事实意味着后退和刷新按钮不会导致任何不必要的副作用任

答案 2 :(得分:0)

是的,要链接到没有可以POST执行重置的副作用的页面。

答案 3 :(得分:0)

GET必须是幂等的 - 获得相同的资源应该给出相同的值,它应该是安全的。安全意味着用户不对任何副作用负责。

虽然幂等性和安全性通常意味着没有副作用,但我会考虑确认收到电子邮件或重置密码是幂等和安全的 - 承认或要求表格重置不止一次不会改变资源(假设重置密码的响应是显示一个POST表格以输入新密码)。

如果用户有一个邮件代理检索并缓存了邮件中的所有URL,那么用户无意中触发的效果就是确认收到了电子邮件(这是无害的,并且是'真''),或者无意中检索了一个表单来重置他的密码。如果重置链接实际上重置了GET而不是表单的POST上的密码,那么它会更加灰色,但更多的可用性问题比其他任何事情都重要 - 如果重置令牌仅对给定数量的命中有效,那么它不能构成拒绝服务。