Wie verhindere ich den direkten Zugriff auf meinen JSON-Dienst?

7

Ich habe einen JSON-Webdienst, um Heimmarker zur Anzeige auf meiner Google Map zurückzugeben.

Im Wesentlichen ruft http://example.com den Webdienst auf, um die Position aller anzuzeigenden Kartenmarkierungen wie folgt zu ermitteln:

%Vor%

Und es gibt eine JSON-Zeichenfolge wie:

zurück %Vor%

Also nehme ich auf meiner Seite index.html diese JSON-Zeichenfolge und platziere die Kartenmarkierungen.

Was ich jedoch nicht möchte, sind Leute, die direkt zu meinem JSON-Webservice aufrufen.

Ich möchte nur, dass http://example.com/index.html meinen http://example.com/json/ -Webdienst aufrufen kann ... und nicht irgendein zufälliger Typ, der /json/ direkt aufruft.

Quesiton : Wie verhindere ich den direkten Aufruf / Zugriff auf meinen http://example.com/json/ -Webdienst?

UPDATE:

Um mehr Klarheit zu geben, http://example.com/index.html call http://example.com/json/?zipcode=12345 ... und den JSON-Service
- gibt halbempfindliche Daten zurück,
- gibt ein JSON-Array zurück,
- antwortet auf GET-Anfragen,
- Der Browser, der die Anfrage durchführt, hat JavaScript aktiviert.

Noch einmal, was ich nicht möchte, ist, dass Leute einfach meinen index.html Quellcode anschauen und dann den JSON-Dienst direkt aufrufen.

    
FrankLy 05.04.2010, 03:04
quelle

6 Antworten

9

Es gibt einige gute Möglichkeiten, Clients zu authentifizieren.

  • Nach IP-Adresse. Verwenden Sie in Apache die Direktive Allow / Deny.
  • Nach HTTP auth: basic oder digest. Dies ist schön und standardisiert und verwendet Benutzernamen / Passwörter zur Authentifizierung.
  • Durch Cookie. Du musst dir den Keks einfallen lassen.
  • Durch einen benutzerdefinierten HTTP-Header, den Sie erfinden.

Bearbeiten:

Ich habe zuerst nicht bemerkt, dass Ihr Web-Service mit clientseitigem Code aufgerufen wird. Es ist buchstäblich NICHT MÖGLICH, zu verhindern, dass Leute Ihren Web-Service direkt aufrufen, wenn Sie clientseitiges JavaScript es tun lassen. Jemand könnte einfach den Quellcode lesen.

    
Dietrich Epp 05.04.2010 03:14
quelle
5

Hier einige spezifischere Antworten, aber ich möchte den folgenden allgemeinen Punkt machen:

Alles, was über AJAX ausgeführt wird, wird vom Browser des Benutzers geladen. Du könntest ein Hacker-Leben hart machen, wenn du willst, aber letztendlich, gibt es keine Möglichkeit, mich daran zu hindern, Daten zu bekommen, die du mir bereits frei zugänglich machst . Jeder Dienst, der öffentlich verfügbar ist, ist öffentlich verfügbar, ganz einfach.

    
Matchu 05.04.2010 13:35
quelle
2

Akzeptieren Sie nur POST-Anfragen an die JSON-liefernde URL. Das hindert entschlossene Leute nicht daran, es zu erreichen, aber es wird das gelegentliche Surfen verhindern.

    
Ignacio Vazquez-Abrams 05.04.2010 03:07
quelle
2

Wenn Sie Apache verwenden, können Sie allow / deny an Standorten setzen.

Ссылка

oder hier ist ein Link zu den Apache-Dokumenten in der Deny-Direktive

Ссылка

EDITS (reagiert auf die neuen Informationen).

Die Deny-Direktive funktioniert auch mit Umgebungsvariablen. Sie können den Zugriff basierend auf der Browser-Zeichenkette einschränken (nicht wirklich sicher, rät jedoch vom gelegentlichen Surfen ab), was immer noch XHR-Anrufe zulässt.

Ich würde vorschlagen, dass der beste Weg, dies zu erreichen, ein Token irgendeiner Art ist, das die Anfrage validiert, ist eine "gute" Anfrage. Sie können das mit einem Cookie, einem Sitzungsspeicher irgendeiner Art oder einem Parameter (oder einer Kombination) tun.

Was ich für so etwas vorschlagen würde, ist, eine eindeutige URL für den Dienst zu generieren, die nach kurzer Zeit abläuft. Mit Memcache könnte man so etwas ganz leicht machen. Diese Strategie könnte auch verwendet werden, um die Service-URL zu verschleiern (was keine tatsächliche Sicherheit bieten würde, aber die Messlatte für jemanden, der direkte Anrufe tätigen möchte, erhöhen würde).

Zu guter Letzt könnten Sie auch die Kryptoe mit dem öffentlichen Schlüssel verwenden, aber das wäre sehr schwer. Sie müssten für jede Anfrage ein neues Pub / Priv-Schlüsselpaar generieren und den Pubkey an den js-Client zurückgeben (hier ist ein Link zu einer Implementierung in Javascript) Ссылка

    
Joshua Smith 05.04.2010 03:06
quelle
2

Sie können eine Zufallszahl als Flag hinzufügen, um zu bestimmen, ob die Anfrage von der gerade gesendeten Seite kommt:

1) Wenn index.html generiert wird, fügen Sie der JSON-Anforderungs-URL eine Zufallszahl hinzu:

Alt: http://example.com/json/?zipcode=12345

Neu: http://example.com/json/?zipcode=12345&f=234234234234234234

Fügen Sie diese Nummer dem Sitzungskontext hinzu.

2) Der Client-Browser gibt index.html aus und fordert JSON-Daten nach der neuen URL an.

3) Ihr Server erhält die json-Anfrage und überprüft die Flag-Nummer mit Session Context . Wenn abgestimmt, Antwortdaten. Andernfalls gib eine Fehlermeldung zurück.

4) Löschen Sie den Sitzungskontext am Ende der Antwort oder lösen Sie eine Zeitüberschreitung aus.

    
Igotit 02.08.2011 11:40
quelle
0

Sie müssen wahrscheinlich eine Art Cookie-basierte Authentifizierung haben. Darüber hinaus hat Ignacio einen guten Punkt bei der Verwendung von POST. Dies kann dazu beitragen, JSON-Hijacking zu verhindern, wenn in Ihrer Domain nicht vertrauenswürdige Skripts ausgeführt werden. Ich glaube jedoch nicht, dass die Verwendung von POST unbedingt notwendig ist, es sei denn, der äußerste JSON-Typ ist ein Array. In Ihrem Beispiel ist es ein Objekt.

    
Matthew Flaschen 05.04.2010 03:07
quelle