Man kennt es von diversen Foren: nach dem 3. Anmeldeversuch muss man 15 Minuten warten bis der nächste Anmeldevorgang möglich ist.

Was auch bekannt ist: ein User darf sich nur vom 1.3.08 bis 31.3.08 anmelden.

Dies kann für weitere Sicherheit sorgen und unterbindet bruteforceattacken.

Wie implementieren?

Ausgangssituation: RestfulAuthentication.

Neue Attribute am User:

  • login_from :datetime
  • login_till :datetime
  • loginTries :integer, :default => 0

Erweiterung um validierung eines passenden timeframes:

aus:

def self.authenticate(login, password)
u = find_in_state :first, :active, :conditions => {:login => login} # need to get the salt
u && u.authenticated?(password) ? u : nil
end

wird:

def self.authenticate(login, password)
u = find_in_state :first, :active, :conditions => {:login => login} # need to get the salt
u && u.loginframe_valid? && u.authenticated?(password) ? u : nil
end

und die neue Methode loginframe_valid? wird folgendermaßen implementiert:

def loginframe_valid?
startValid = login_from.nil? || Time.now > login_from
endValid = login_till.nil? || Time.now < login_till

return startValid && endValid
end

nun muss nur noch aus der authenticated?(password) Methode die Anzahl der loginversuche ausgewertet werden:

def authenticated?(password)
result = crypted_password == encrypt(password)

# validate the logins
if result
if self.loginTries != 0
self.loginTries = 0
self.save
end
else
self.loginTries = self.loginTries + 1

if self.loginTries == 3
self.login_from = Time.now + 15.minutes
self.loginTries = 0
logger.info “User #{id} has been blocked for 15 minutes with his third failed attempt!”
end
self.save
end

result
end

Einzigstes Problem, das nun noch auftreten kann, ist, dass der Counter eventuell in einem Szenario falsch gesetzt ist.
Dabei könnte man noch ein Attribut last_logintry :datetime anfügen, das ausgewertet werden müsste bei einem Anmeldeversuch, wenn der Counter > 0 ist und den dann wenn last_logintry < Time.now - 15.minutes ist, den Counter wieder auf 0 setzen.

Nur als kleiner trick, der dafür sorgt, dass user sich nicht immer anmelden können.
Ach ja: eine Meldung erscheint nicht, da dies zu viel Aufschluss geben könnte was passiert ist.
Diese Arbeit wäre dem Administrator überlassen, wenn diese in den Userinformationen, die nur er sieht, dort dann passend alles ermitteln kann.

convert this post to pdf.