Model view controller 获得副作用vs.获得密码重置

Model view controller 获得副作用vs.获得密码重置,model-view-controller,forms,httpwebrequest,get,Model View Controller,Forms,Httpwebrequest,Get,一般来说,get请求并不意味着有任何副作用。但是,许多网站允许您通过单击电子邮件中嵌入的链接重置密码或验证电子邮件/用户。由于我们不想发送HTML电子邮件,因此无法使用发布数据的表单,因此我们必须使用get请求。 然而,使用GET进行请求并产生副作用被认为是糟糕的设计。你对此有什么看法?有没有办法解决这个难题?是的,链接到一个没有副作用的页面,可以发布来执行重置。是的,链接到一个没有副作用的页面,可以发布来执行重置。通常这种链接只包含一个标识要重置密码的用户的令牌。重置密码的请求。它不会登录用户

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

是的,链接到一个没有副作用的页面,可以发布来执行重置。

是的,链接到一个没有副作用的页面,可以发布来执行重置。

通常这种链接只包含一个标识要重置密码的用户的令牌。重置密码的请求。它不会登录用户

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

无论如何,GET请求应该是幂等的并不是一个硬事实,它更像是一个指导原则。如果它提高了用户的可用性,而不是坚持该准则,那么就去做(当然,在考虑了替代方案和后果之后)。最后,可用性很重要

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

更新


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

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

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

无论如何,GET请求应该是幂等的并不是一个硬事实,它更像是一个指导原则。如果它提高了用户的可用性,而不是坚持该准则,那么就去做(当然,在考虑了替代方案和后果之后)。最后,可用性很重要

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

更新


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

GET必须是幂等的-获取相同的资源应给出相同的值,并且应该是安全的。安全意味着使用者对任何副作用不承担责任

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


如果用户有一个邮件代理,可以检索和缓存邮件中的所有URL,那么用户无意中触发的效果将是确认收到了电子邮件(这是无害的,并且是“真的”),或无意中检索表单以重置其密码。如果重置链接实际上重置了GET上的密码,而不是表单的POST上的密码,则该链接更为灰色,但更为重要的是可用性问题-如果重置令牌仅适用于给定的点击次数,则不会构成拒绝服务。

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

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


如果用户有一个邮件代理,可以检索和缓存邮件中的所有URL,那么用户无意中触发的效果将是确认收到了电子邮件(这是无害的,并且是“真的”),或无意中检索表单以重置其密码。如果重置链接实际上重置了GET上的密码,而不是表单的POST上的密码,则该链接更为灰色,但更为重要的是可用性问题-如果重置令牌仅适用于给定的点击次数,则不会构成拒绝服务。

这是一个错误有趣的用法,我相信这是一种可以接受的做法。但这并不是规则的例外。基本上,按照通常的实施方式,您必须以不同的方式提前启动密码重置,通常是通过在POST表单中输入您的用户名或电子邮件

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