Eindringlingserkennung / Intrusion Detection
Brute-Force-Schutz für ein Login-Formular
Login-Formulare bedürfen eines besonderen Schutzes, da der Anwender in der Regel nach erfolgreichem Login authorisiert wird, auf Daten zuzugreifen. Missbrauch von Logins sollten daher mit einem Banning abgestraft werden. Verwenden Sie dazu das Plugin security\intrusion_detection.
Controller
use brandbox\security\intrusion_detection;
...
/**
* @param string $username
* @param string $password
*/
public function login($username, $password) {
$engineIntrusionDetection = $this
->getAppFactory(intrusion_detection\engine::class)
;
$formIdentificationKey = 'my-login';
// Anwender ist bereits gesperrt
if($engineIntrusionDetection->isBanned($formIdentificationKey, $throwBanMessage = true)):
throw new lib\exception\yourException();
endif;
// Brute Force Attacke verhindern
if(true !== $engineIntrusionDetection->isValidRequest()):
$engineIntrusionDetection->banIP($formIdentificationKey, $setIsBanned = true, $lifetime = 30);
throw new lib\exception\yourException();
endif;
}
Nach nochmaligem Aufruf des Logins soll dem Anwender das Login-Fenster nicht mehr angezeigt werden.
In diesem Beispiel wurde der Anwender für 30 Sekunden gesperrt. Das Login-Fenster blenden Sie wie folgt aus:
View
{{#isNotBanned "my-login"}}
<form>...</form>
{{/isNotBanned}}
Banning-Regeln
Ein Anwender darf sich mit der gleichen IP 4x in 10 Minuten anmelden
Beliebig viele Anwender der selben IP dürfen sich 100x in 10 Minuten anmelden
Ein Anwender darf sich mit der gleichen IP 8x in 60 Minuten anmelden
Beliebig viele Anwender einer IP dürfen sich 600x in 60 Minuten anmelden
Brute-Force-Schutz mit Captcha
Es ist möglich, Formulare mit einem Captcha anzureichern, falls der Anwender geblockt wurde. In diesem Fall werden Anwender nicht gebanned.
Controller
use brandbox\security\intrusion_detection;
...
/**
* @param string $username
* @param string $password
*/
public function login($username, $password) {
$engineIntrusionDetection = $this
->getAppFactory(intrusion_detection\engine::class)
;
$formIdentificationKey = 'my-login';
// Anwender ist bereits gesperrt
if($engineIntrusionDetection->isBlocked($formIdentificationKey)):
throw new lib\exception\yourException();
endif;
// Anwender hat ein Captcha eingegben.
// Bei Erfolg wird das banning aufgehoben und der Zyklus startet von vorn.
if(!empty($captcha)):
if(true === $engineIntrusionDetection->isValidCaptcha($captcha)):
$engineIntrusionDetection->removeBanIP($formIdentificationKey);
endif;
endif;
// Brute Force Attacke verhindern
if(true !== $engineIntrusionDetection->isValidRequest()):
$engineIntrusionDetection->banIP(
$formIdentificationKey,
$setIsBanned = false,
$lifetime = 60 * 60
);
throw new lib\exception\yourException();
endif;
}