gpt4 book ai didi

asp.net-mvc-4 - 当“新密码无效”时,WebSecurity.ChangePassword何时会失败?

转载 作者:行者123 更新时间:2023-12-02 18:46:39 27 4
gpt4 key购买 nike

这是用于在MVC 4中默认的AccountController中更改密码的代码:

// ChangePassword will throw an exception rather 
//than return false in certain failure scenarios.
bool changePasswordSucceeded;
try
{
string userName = User.Identity.Name;
changePasswordSucceeded = WebSecurity.ChangePassword(userName,
model.OldPassword,
model.NewPassword);
}
catch (Exception)
{
changePasswordSucceeded = false;
}

if (changePasswordSucceeded)
{
return RedirectToAction("Manage", new { Message = ManageMessageId.ChangePasswordSuccess });
}
else
{
ModelState.AddModelError("",
"The current password is incorrect or the new password is invalid.");
}


我的问题是该消息不清楚。如果当前密码不正确,那很好,但是如果新密码无效,我想向用户显示一条更好的消息,告诉他们出了什么问题,并且我想更好地理解“失败情况”,以便我能够进行定制消息。

文档 here专门针对异常,我不认为这些异常应在Action中被吞并并以无效密码报告。

那么为什么在这里“新密码无效”呢?如果我仅在应用程序中使用不带OAuth的SimpleMembershipProvider,可以删除它吗?

编辑:注意此数据注释也出现在“ RegisterModel”类中,因此这里也有密码有效性检查

[StringLength(100, 
ErrorMessage = "The {0} must be at least {2} characters long.",
MinimumLength = 6)]

最佳答案

摘要
现在,这是一个很长的答案,因此我将其编辑为几节。与像rook这样的用户相比,我不是安全专家,甚至他说不要信任他的安全答案或任何其他人的安全答案。始终亲自测试并理解它。任何阅读此内容的Web开发人员都应阅读the OWASP top ten web security flaws,使用诸如Trustworthy Computing之类的在线指南,当然也应使用Mr. Bruce Schneier。安全性对于我们每个人来说都是复杂且太大的,因此请使用可以根据最佳实践来工作的框架。最重要的是,将其全部保留为in perspective
有关这些汇总答案的更多详细信息,请参见下文:

给用户的消息是故意模棱两可的,可以说这是出于安全原因(请参阅下文)
参考“失败场景”,主要是由于模型验证应已捕获的无效输入,当前密码错误或边缘情况异常
由于原始开发人员很懒惰,或者因为他们认为在所有情况下都应该有一个返回消息,所以这些异常被吞并并作为一个呈现(见上文1)
只要您的属性匹配,或者突出显示的代码比ChangePassword中的长度限制更严格,“新密码无效”就不可能。但是,请参阅上面的(1)。
我可以删除它吗?请参阅上面的(1)。
好点,请参阅下面的讨论。

原始答案-概念攻击向量
从安全角度考虑:

我走到坐在酒吧/咖啡厅桌子(或家庭/办公室中的台式计算机)上的手机/平板电脑/笔记本电脑上
我想我可能知道您的密码
我进入“更改密码”并输入我认为您的密码不是的密码
我特意在其中输入了1个字符的新密码

机器告诉我

“当前密码不正确”

现在,我尝试用您当前的密码再次输入:

“新密码无效”

我现在知道您的密码,但是您不知道我做的事,因为我没有更改任何内容。
脚注:我弄错了第一组逻辑,将其删除,编辑并重新发布,但是-I'm not Bruce
类似的攻击
这种攻击有很多组合,但是就像从不良的登录系统中收集电子邮件一样。想一想当我尝试使用电子邮件地址“恢复密码”时收到两条不同的消息,会发生什么情况:

电子邮件已发送到您的地址(用于数据库中的电子邮件)
找不到您的电子邮件(对于明显为假的电子邮件地址)

那么我就可以轻松地从您的站点中找到有效的成员电子邮件,以对该用户进行有针对性的网络钓鱼攻击,或者仅建立垃圾邮件的有效电子邮件地址列表。
可能的解决方案
在这两种情况下,对于我们的密码更改,更加用户友好但同样安全的错误消息是:

“当前密码不正确或新密码无效。请记住您的密码区分大小写,并且新密码必须具有[64 letters/5 numbers/4 characters / 3个希腊神的名称]”

为了保持理智,请在您的应用程序使用时保持其理智,但是请记住,无论您是否喜欢,您都应对更大的生态系统和users share passwords between websites负责。
ChangePassword何时返回false?
关于ChangePassword何时返回false的问题部分:
本质上是WebSecurity.ChangePassword
总之,如果满足以下条件,它将返回false

任何参数都无法通过null,空或长度检查;要么
数据库连接失败;要么
UserId在数据库中不再存在;要么
当前密码错误;要么
(很明显,如果发生任何其他异常,它将设置changePasswordSucceeded = false)。
newPassword的调用内没有ChangePassword有效性检查

因此,从理论上讲,如果您正确设置了验证属性并忽略了小写字母,则只有在有小写字母(用户已在Get和Post之间被删除,否则我们无法删除)的情况下,才可以使用return false击数据库,或者当前密码无效)。
即使当攻击者绕过浏览器中的UI(他们将这样做)时,这一切都是正确的,因为Action本身在模型上调用IsValid
客户端消息
这里有一个严重的免责声明:我不会一生都致力于安全性。我遵循设计安全原则(例如,我遵守the OWASP top ten project),并相信我对最重要的安全原则有很好的认识。因此,我可能有些错误的逻辑。
如果没有客户端“密码要求”验证-会发生什么?用户必须等待Post返回以查明发生了什么。
如果存在客户端“密码要求”验证,是否会削弱我们的界面?我不这么认为。:

服务器仍然执行要求和当前密码验证
服务器无法区分这两种故障情况(实际上可以,请参见下文)
因此,服务器只会在当前密码有效以及密码更改时告诉您当前密码是否有效。
希望该站点还可以:

防止更改回旧密码
发送电子邮件通知您您的密码已更改(可能要等待15分钟,以防止攻击者从您打开的电子邮件中删除密码,而当您将手机留在未打开状态的栏中时,该手机也已打开我们的网站,并且我们的电子邮件也会打开)



MFA不会执行AFAIK的任何一项操作,因此这会开始崩溃。
由于操作中的Model.IsValid测试,由于我们从服务器返回了不同的错误和消息,因此它也分崩离析,该操作强制执行新的密码验证以及针对此失败的不同错误消息。因此,在当前的实现中,单一错误消息方法是有缺陷的。
摘要
那我会改变一切的方式吗?希望我会及时改进其他部分,但可能不会,除了将返回消息更改为更长且更具信息性之外。
这是个人观点,可以反驳

细节:

呼叫Membership.GetUser(userName, true).ChangePassword(...)。对于ArgumentException see docs,它将返回false
然后在实际的提供程序上调用ChangePassword(例如SimpleMembershipProvider.ChangePassword),如果失败,则返回false

实际的提供程序实现变得复杂。例如,对于SimpleMembershipProvider

如果尚未初始化,它可能会将调用传递给“先前的提供程序”。
否则,如果密码/用户名为空,空,太长等,它可能会抛出一个ArgumentExceptions(在catch中冒泡为return falseMembershipUser.ChangePassword)。
如果那没有发生,那它将

尝试从数据库中获取UserId(如果失败,则返回false),
检查当前密码是否正确(如果失败则返回false),
最后使用UPDATE查询更新密码,并在输入时为您设置PasswordChangedDate


然后更新MembershipUser上的内部数据

关于asp.net-mvc-4 - 当“新密码无效”时,WebSecurity.ChangePassword何时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com