öffentliche REST API gegen abfischen sichern?

Chromatin

Moderator
Mitarbeiter
Folgendes Setup: Ich habe eine Seite welche Daten auf Karten (Google Maps) darstellt. Problem, alle Daten werden beim initialen Laden in den Code geladen und erzeugen zuviele DOM Nodes, sodass die Seite wöchentlich langsamer wird.

Das habe ich nun bereits umgebaut und es sieht so aus, dass auf den Click eines Map-Markers, die Daten fürs Infowindow via REST bezogen werden.

Es ist zwar so, dass die Daten ohnehin öffentlich verfügbar sind, trotzdem möchte ich es vermeiden oder erschweren, dass der Endpoint systematisch abgefischt wird, weil ich da eben strukturierte Daten bereitstelle.

Das beste, was mir bisher einfällt, ist, die API-abfragen pro IP und Minute zu quoten.

Hat hier jemand ne Idee?
 

bitmuncher

Moderator
Lege ein Auth-Token verschlüsselt im Store des Browsers ab und autorisiere die Requests entsprechend damit. Das wird zwar gegen Debugger nicht unbedingt standhalten, sollte aber ausreichen um zumindest ein zu einfaches Abgrasen der Daten zu unterbinden. Die Tokens kannst du Session-abhängig entsprechend nach einer Weile verwerfen. Im Endeffekt hast du dann folgendes Prozedere:

1. initialer Request an deine API, der das Token überträgt
2. der folgende Request muss das Token des vorherigen Requests haben
3. jeder neue Request setzt für die Session ein neues Token, das bei der nächsten Anfrage erwartet wird
 

Chromatin

Moderator
Mitarbeiter
Das funktioniert so nicht wirklich, denn die API selbst reagiert mit Datenausgabe auf ein normales GET. Ob der von einem "normalen" Seitenbetrachter oder einem Fischer kommt macht an der Stelle ja keinen Unterschied.
 
Aber wie möchtest du das denn dann absichern, wenn du nicht prüfen oder festelgen kannst was für eine art besucher du hast?

Ist bei dir ein Fischer daran auszumachen, wenn dieser einen großen Abgriff an Daten, innerhalb eines bestimmten Zeitfensters vollzieht - z.B. größer = 100 Datensätzen innerhalb von 10 Sekunden...

Ich würde, wie von bitmuncher erwähnt, das über einen Systemseitig erzugten Token lösen, welcher Clientseitig (JS) in einer variable abgelget wird. Bei jedem Request muuss dieser Token an deinem Get angehängt "/rest/get/suid/u8tut7u8th889087098xfh" werden und du prüfst diesen dann Serverseitig lediglich gegen deine Tabellen. Unter Berücksichtigung von Zeit und Raum, also 1000 Abfragen innerhalb von 10 Sekunden von der gleichen unique Id kannst du dann entscheiden und Abfrage zulassen oder abbrechen ...

Ansonsten hast du hier keine Chance die Abfragen an einer öffentlichen und frei zugängliche Rest Schnittstelle zu überprüfen und zu regeln. Einzig und alleine mit einem Schlüssel...
 

Chromatin

Moderator
Mitarbeiter
Aber wie möchtest du das denn dann absichern, wenn du nicht prüfen oder festelgen kannst was für eine art besucher du hast?
Genau das war ja die Frage :)

Ich werde mich auf ein Request-Limit via Agent oder IP reduzieren. Bei einem Break gibts eine Sperre der IP für N Minuten.
 
Oben