Frage NGINX - Drosselungsanforderungen, um Missbrauch zu verhindern


Der Grund dafür ist, dass die Nutzer sich mit JavaScript an unserer API orientieren und einige Entwickler misstrauen und Besucher dazu bringen, den Server mit AJAX-Anfragen zu knacken. Wenn das passiert, möchte ich vielleicht die API-Anfragen vielleicht drosseln 50 Anfragen pro Minuteoder etwas in diesem Sinne.

Hinweis: (insbesondere DB-intensive Ressourcen, also vielleicht auf einer Pfad-Ebene, anstatt serverweit (z. B. Drosselung "/ json_api /", aber nicht "/ statisch /").


28
2017-09-09 19:05


Ursprung




Antworten:


Dies kann mit Hilfe der LimitReqModul mit Nginx. Wenn dies jedoch für einen Reverse-Proxy gilt, möchten Sie vielleicht das Neue ausprobieren Ratenbegrenzung von HAProxy unterstützt.

Ich fand die nginx-Ratenbegrenzung als a ein bisschen verwirrend um genau die gewünschte Rate zu erhalten.

Aber im Grunde hast du so etwas wie:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

in dem http Abschnitt und dann etwas wie das Folgende in der location Abschnitt innerhalb der server Sektion:

limit_req zone=default burst=10 nodelay;

Um es nicht für einen bestimmten Abschnitt wie /static Du würdest das einfach trennen location und nicht die limit_req Direktive (oder umgekehrt).


35
2017-09-09 19:12



Vielen Dank. Kannst du erklären, was diese Dinge tun (Zone, Burst, Knoten)? Und wolltest du es sagen? zone=limit_req_zone, stattdessen? - orokusaki
Ehrlich gesagt kann ich sie nicht so gut erklären, weshalb ich das Gefühl habe, dass es nur verwirrend ist. Michaels Erklärung in dem Link, den ich zur Verfügung gestellt habe, klingt, als wäre es machbar. Ich glaube nicht, dass ich irgendwelche Tippfehler habe, soweit Ihre zweite Frage geht ... Die Moduldokumentation, mit der ich verlinkt bin, hat ein Beispiel, das helfen könnte. - Kyle Brandt♦
Zone, Burst und Knotenlayer sind dokumentiert die Nginx-Wiki-Seite über das Ratenbegrenzungsmodul, verbunden mit bereits aus der Antwort oben. - Mark Stosberg
Kyle, weißt du, ob es eine Möglichkeit gibt, das Ratenlimit pro Standort mit einem anderen Trigger zu kombinieren (z. B. Authorization-Header). In meinem Fall möchte ich vielleicht die Rate eines bestimmten Benutzers drosseln. - Nils
@ Nils AFAICS könnten Sie das verwenden $http_authorization Variable, um eine neue Zone zu definieren, in der der Schlüssel ein solcher Header ist, und nicht die IP-Adresse, d.h. limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/sund dann benutze die per_user Zone in den Standortabschnitten, in denen Sie die Ratenbegrenzung pro Benutzer durchführen möchten. Ungetestet, lese ich nur die Dokumentation und die Liste der nginx-Variablen ... lass es mich wissen, wenn du es ausprobierst! - idrarig