# Fehlversuche mit BLOCKED begrenzen

> Zähle Versuche pro IP-Adresse mit BLOCKED() und antworte mit 429, sobald das Limit erreicht ist, für Logins und Passwort-Zurücksetzungen.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: de
Content-SHA256: 428e7a223a5e529eb4b380da964209565b91904694296a6c153641b9a1d64597
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`BLOCKED($, limit, expiration)` zählt Aufrufe pro IP-Adresse. Es gibt `true` zurück, sobald die Adresse innerhalb der Ablaufzeit mehr als `limit` Aufrufe gemacht hat (Standard: 5 Aufrufe in 15 Minuten), und davor `undefined`. Rufe es am Anfang eines sensiblen Handlers auf und brich ab, wenn es `true` zurückgibt. Um eine Adresse nach einem erfolgreichen Login freizusprechen, rufe `BLOCKED($, -1)` auf.

Die Zähler leben im Speicher des Prozesses; stelle hinter einem Reverse-Proxy sicher, dass die echte Client-Adresse Total.js erreicht, sonst teilen sich alle einen Zähler.

```js controllers/login.js
exports.install = function() {
	ROUTE('POST /login/', login);
};

function login($) {

	if (BLOCKED($, 3, '1 minute')) {
		$.invalid(429);
		return;
	}

	if ($.body.password === 'correct') {
		BLOCKED($, -1);
		$.json({ ok: true });
	} else
		$.invalid(401);
}
```
