我正在使用标准的.NET会员提供商,并且认为我会看到是否有人可以发光。
调用ValidateUser返回true或false。现在,由于该方法接受用户名和密码,因此可以推断返回结果将反映无效的用户名或密码。然而,如果我们进一步研究它,我们发现它也在检查IsLockedOut和IsApproved。
public override bool ValidateUser (string username, string password)
{
MembershipUser user = GetUser (username, false);
/* if the user is locked out, return false immediately */
if (user.IsLockedOut)
return false;
/* if the user is not yet approved, return false */
if (!user.IsApproved)
return false;
......
在我的应用程序中,我想以自己的方式使用IsApproved。简单地滚动我自己的提供者是行不通的,因为我仍然受限于bool结果。创建用户可以获得我们需要的所有信息,那么为什么不使用ValidateUser?我错过了什么吗?
答案 0 :(得分:9)
我希望您所看到的是安全决策 - 通过限制返回的信息,他们不会向恶意方提供信息。
想象一下,你是Cyril Cracker,试图闯入一个网站。
场景#1: 您尝试使用密码“密码”输入用户名“Admin”,系统会告诉您不要。您拥有的唯一信息是管理员/密码不是有效组合。
场景#2: 您尝试使用密码“密码”输入用户名“Admin”,系统会告诉您没有该名称的用户。您可以继续尝试不同的用户名,直到找到 已知的用户名。
场景#3:您尝试使用密码“密码”输入用户名“Admin”,系统会告诉您密码无效。突然间,您知道“Admin”是有效用户。你已经学到了一些有用的东西,你需要一直猜测的就是密码。
场景#4:您尝试使用密码“密码”输入用户名“Admin”,系统会告诉您该帐户已被阻止。现在,您知道有效的用户名和密码,并且该帐户已被阻止。你可以稍后回来再试一次。
将那些有效的,有些什么无效的系统称为繁琐的系统,并且它们被认为是不安全的,因为它们更容易破解。
希望这有用。