Login 登录安全理念
我收到了其他开发人员的一些代码,他们创建了一些登录安全策略。例如,如果您尝试使用数据库中存在的用户名登录,它将开始记录失败登录尝试的次数。然后,在达到3次登录尝试后,它会在日志中添加另一个条目,但会将位1添加到LockedOut 你们认为这是一个好的安全政策吗?如果有人试图进入,难道不只是尝试大量随机用户名并强制将所有人锁定在他们的帐户之外吗?这似乎是一种糟糕的安全哲学 我认为一个更好的安全程序应该是根据一个IP表锁定任何进行了3次尝试的人,该IP表跟踪各种用户尝试,并在30分钟左右到期,以防止DDoS 你们如何设计你们的登录安全??以下是这位开发人员的基本工作:Login 登录安全理念,login,security,Login,Security,我收到了其他开发人员的一些代码,他们创建了一些登录安全策略。例如,如果您尝试使用数据库中存在的用户名登录,它将开始记录失败登录尝试的次数。然后,在达到3次登录尝试后,它会在日志中添加另一个条目,但会将位1添加到LockedOut 你们认为这是一个好的安全政策吗?如果有人试图进入,难道不只是尝试大量随机用户名并强制将所有人锁定在他们的帐户之外吗?这似乎是一种糟糕的安全哲学 我认为一个更好的安全程序应该是根据一个IP表锁定任何进行了3次尝试的人,该IP表跟踪各种用户尝试,并在30分钟左右到期,以防止
if username is in database:
if first login: increase fail-attempt counter.
if second login: lock out username.
else: don't let him in.
else:
incorrect password.
编辑:最终程序:
public void ResolveTimeouts()
{
if (data.Expire <= DateTime.Now)
{ // it will only delete ONE single entry from the database,
// that happens to be this user's IP
// If and only if, The expiration date is older than right now.
Delete(this.data);
data.Attempts = 0;
}
}
int uid = UserExists(username);
if(uid < 1){
ResolveTimeOuts(); // this will delete IPs from table if expiration passed
if(loginAttempts >= 3){
"Fail login, you have been locked out for " + TIMEOUT + " minutes";
ExtendExpiration(TIMEOUT);
} else {
IncrementAttempts();
"fail login, incorrect username or password.";
}
} else {
if(authenticate(uid, password)){
"Successfully logged in.";
} else {
// INSERT lock out specific username feature here.
"failed login, incorrect username or password.";
}
}
public void ResolveTimeouts()
{
如果(data.Expire我更愿意在一段时间内限制登录失败的次数,那么可以暂时禁用用户,或者暂时拒绝从该IP地址进一步登录
练习的重点是防止暴力攻击。我不想进入我自己的个人哲学,我会听从那些只考虑适当安全的人
也就是说,有一些准则和标准被认为是最佳实践。我建议从OWASP开始:
正常的模式是在一定次数的尝试后一段时间内禁用用户,以防止暴力。我在编写良好的web应用程序实践中看到的通常标准是3次无效尝试会导致锁定1小时
顺便说一下,锁定的具体问题在OWASP网站上有介绍:
引自文章(我用粗体字强调):
如果攻击者能够猜到
密码,而不必更改帐户
由于身份验证失败而禁用
尝试,这提供了
被袭击者的机会
继续进行暴力攻击
直到账户被泄露
自动使用暴力/密码
对web应用程序的猜测攻击
这是一个微不足道的挑战。密码
应采用锁定机构
如果超过
预设的登录失败次数
有人尝试过
密码锁定机制确实具有
然而,逻辑上的弱点是
攻击者可能会尝试
大量身份验证
对已知帐户名的尝试
导致锁定整个区块
应用程序用户帐户的数目
考虑到密码的意图
锁定系统是为了防止
蛮力攻击,明智的选择
策略是锁定一个客户的帐户
小时数。这非常重要
减慢攻击者的速度,同时允许
为合法目的开立的账户
用户
我不同意。我觉得完全锁定用户名更安全(不考虑IP)
当恶意黑客伪造IP地址时会发生什么情况?黑客可以在IP地址之间移动,并不断地强制输入用户名
我试了三次15分钟才把门锁上
对您的编辑的评论:
我会这样做:
if(resolveTimeOuts()){
bool uid = UserExists();
//do other stuff
}else{
"Your IP has been locked. Enter this code to prove you are human."
// Captcha or math equation.
}
if(resolveTimeOut()){
bool uid = UserExists();
//do other stuff
}else{
"Your IP has been locked. Enter this code to prove you are human."
if(rand(1,5) == 5){
// or something equivalent
deleteExpiredRequests();
}
// Captcha or math equation.
}
不过,我不会在resolveTimeOuts()
中删除过期的IP请求。这可能会增加函数的执行时间。请执行以下操作:
if(resolveTimeOuts()){
bool uid = UserExists();
//do other stuff
}else{
"Your IP has been locked. Enter this code to prove you are human."
// Captcha or math equation.
}
if(resolveTimeOut()){
bool uid = UserExists();
//do other stuff
}else{
"Your IP has been locked. Enter this code to prove you are human."
if(rand(1,5) == 5){
// or something equivalent
deleteExpiredRequests();
}
// Captcha or math equation.
}
这将加快执行resolveTimeOut()
的速度,如果IP请求过快,那么所有过期的超时都将被删除。这对DoS黑客来说是一种双重打击。他们会得到不同的页面,页面的生成可能会通过deleteExpiredRequests()减慢
如果有大量到期债务
编辑两个:
这或多或少是我要实现的,我会写完整的代码,但我用PHP编程
bool function humanRequest(){
// decide if the request lag is humanistic or bot speed
// for example: last_request > this_request - 500;
}
if(!humanRequest()){
// redirect to a Captcha page or die with a warning or something (like SO does)
}
uid = getUsername(username);
if(uid > 0){
// validated request
}
else{
// increase attempts
// you could have a separate column for IP requests or whatever
// lock out username after 3 attempts
}
您可以将humanRequest()
放在用户名验证的两种情况下。基本上,如果他们在短时间内请求任何用户名,请将其列入黑名单。但是如果您在特殊页面中验证用户名(仅当有人尝试登录时才包括此项),这已经足够了
这样,您只需添加另一个表。无需修改现有的表。一种折衷方法是锁定一段短时间,以大大降低自动攻击的速度,但对于创建“合法”的合法用户来说,锁定时间不会太长错误。IMHO,在大多数情况下,10秒就足够了,如果强制执行强密码策略我见过的最好的两全其美的方法是在N次登录尝试失败后在表单上使用验证码
这使得可能真的忘记了密码的真实用户可以选择继续尝试,尽管速度较慢,并有效地阻止自动暴力攻击。这使得攻击者使用的IP数量无关紧要。如果你为公司客户服务,你不能通过IP将用户锁定。公司防火墙通常不会o对web服务器隐藏用户的IP地址。防火墙后面的任何三个用户的三次不成功尝试都可能锁定整个组织(或者一个非常愚蠢的用户,如果按下,他从不检查自己的上限是否锁定).@Jason,但是他们可以将大量用户锁定数小时,实际上并不能阻止暴力强迫。@Dexter-它可以阻止暴力强迫,但不能阻止拒绝服务(如您所指出的)。我不知道如何防止它,但我可能会先记录IP地址,然后检查当前访问时间和上次访问时间。人工访问和机器人访问之间必须有区别(请求之间的时间可能是毫秒而不是秒)。当然,就像我说的,我从来没有这样做过