- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是用于在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.");
}
[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 false
和MembershipUser.ChangePassword
)。
如果那没有发生,那它将
尝试从数据库中获取UserId
(如果失败,则返回false),
检查当前密码是否正确(如果失败则返回false),
最后使用UPDATE查询更新密码,并在输入时为您设置PasswordChangedDate
然后更新MembershipUser
上的内部数据
关于asp.net-mvc-4 - 当“新密码无效”时,WebSecurity.ChangePassword何时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547821/
我正在开发 Meteor 应用程序,我想将调用转至 Accounts.changePassword从客户端到方法。但是,当我尝试运行该方法时,出现此服务器错误: Exception while inv
我正在尝试使用以下脚本重置密码 /* *@NApiVersion 2.0 *@NScriptType ClientScript */ require(['N/auth'], function(
我们的应用使用 Firebase 简单登录。它似乎工作得很好,包括它们包含的大多数额外调用,如 resetPassword。 changePasswordForEmail 似乎也有效。当用户给它正确的
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我使用 控件,但我不知道如何将新密码文本和其他字段对齐到左侧而不是右侧。我已经尝试添加一个类并执行 text-align: left , 但对齐仍然在右边。 是否可以左对齐?
MembershipService.ChangePassword 不更改密码问题。我不知道为什么... var userUsers = from n in db.aspnet_Users where
设置:我将 Meteor 1.4.4.2 与 React 和 accounts-password package 一起使用(版本 accounts-base@1.2.17,accounts-passw
我遇到了 mvc4 成员资格问题,我无法像更改用户密码一样 public bool SetNewPassword(string newPassword) { var gener
所以我使用 asp:changePassword 来显示允许用户显示密码的表单;然后我将面板居中放置在屏幕上。但是我想在行之间添加间距/单元格填充:到目前为止我有:
无论我试图向它抛出什么,这里的这个方法总是导致以下异常: var retVal = this.DirectoryEntry.Invoke("ChangePassword", new
我有一个自定义门户与自定义站点集成,使用 Apex/Visualforce。我想在为站点/门户启用的 Visualforce 页面上提供自定义密码更改功能。 Site 静态类方法几乎没有文档记录,在结
我正在处理一个 Razor 项目,需要将现有的用户数据库集成到 SimpleMembership 提供程序数据库架构中。这是通过指定我现有的用户表以及 SimpleMembership API 将哪些
我无法访问代码隐藏中的任何 asp 控件。 .aspx页面如下
我无法访问代码隐藏中的任何 asp 控件。 .aspx页面如下
我有一个应用程序,当用户提示忘记密码时,管理员可以设置用户密码。 我的应用程序使用 (UserPrincipal).SetPassword(newPassword); 并且有效,但它完全忽略策略,并让
我将以下代码作为我的 Active Directory 用户的 Web 应用程序的一部分,以便能够更新他们的密码(同时用于 Active Directory 和 gmail)。我将 C# 与 Syst
DirectoryEntryObject.Invoke("ChangePassword", new object[] { oldPassword, newPassword } ); 抛出以下错误: "
我只是在学习如何加密/解密 SQLite 数据库。 我找到了一种加密方法,如这篇文章 SQLite with encryption/password protection 此页面的最佳答案说我们可以使
我有一个使用 ActiveDirectoryMembershipProvider 进行表单例份验证的 Web 应用程序。效果很好...用户可以成功登录。 用户登录后,可以更改密码。我们使用 Chang
我正在考虑在 ASP.NET 2.0 Webform 上使用 ChangePassword 控件。我不想显示“取消”按钮。 有没有一种好的方法可以隐藏它,而不必诉诸愚蠢的“宽度= 0”之类的游戏? 或
我是一名优秀的程序员,十分优秀!