it-swarm.com.de

Sichern Sie eine öffentlich zugängliche REST api

Wir erstellen eine öffentliche Einzelseiten-App in JavaScript, die mit einem Back-End kommuniziert REST Service. Wir möchten, dass auf diesen REST-Service nur über die Einzelseiten-App zugegriffen werden kann.

Da es sich um eine öffentliche Website handelt, können/möchten wir nicht, dass der Benutzer Authentifizierungsdetails eingibt. Ein normaler Authentifizierungsmechanismus funktioniert auch nicht, da in JS gespeicherte Geheimnisse für jedermann lesbar sind.

Ich denke, es ist unmöglich, den Dienst REST) zu sichern, da er grundsätzlich öffentlich sein muss, aber ich habe mich gefragt, ob jemand eine Idee hat, wie Sie jemanden daran hindern könnten, ein Skript zu erstellen und unsere Anwendung mit zu reproduzieren unsere REST api.

24
Kenneth

Der erste Gedanke, der mir in den Sinn kommt, ist, entweder Sitzungen zu verwenden oder etwas auf Ihrer Seite einzurichten, um die IPs eingehender Verbindungen zu protokollieren und nur der API REST API) zu erlauben, auf IPs zu antworten, die kürzlich auf Ihr Hauptmenü zugegriffen haben Dies verhindert nicht alle Fälle, bedeutet jedoch, dass mindestens regelmäßig auf die Hauptwebsite zugegriffen werden muss, um die API REST API) verwenden zu können.

Wenn Benutzer sich nicht authentifizieren müssen, hindert nichts einen Screen Ripper daran, Daten effektiv von Ihrer Site abzurufen. Geschäftsregeln sollten von der API REST API) erzwungen werden, und daher sollte die API REST=) effektiv Ihre Website sein und die Seite, die sie verwendet, sollte lediglich die Formatierung für die Website bereitstellen Anzeige.

6
AJ Henderson

Wenn dies für native Apps ist, können Sie Folgendes versuchen:

  1. Speichern Sie einen Zugriffsschlüssel in Ihrem App-Bundle. Kein anderer als der App-Besitzer (Sie selbst) kann dies haben.
  2. Ändern Sie Ihre API so, dass nur Anforderungen mit dem im Header festgelegten Zugriffsschlüssel erfolgreich sind.
  3. Verwenden Sie HTTPS, damit niemand den verschlüsselten Zugriffsschlüssel lesen kann.

Wenn Sie kein HTTPS verwenden, können Sie den Zugriffsschlüssel dennoch manuell mit etwas im Header hashen (nur Ihre Server- und App-Logik weiß, wie), sodass der Mann in der Mitte nicht vorgeben kann, Ihre App zu sein.

Wenn dies für reine Web-Apps ist,

Ich würde zunächst vorschlagen, die reine Web-App in eine native App (a.k.a. Hybrid-App) zu verpacken, damit Sie den oben beschriebenen Schutz erreichen können, indem Sie einen geheimen Schlüssel in der App bündeln. Die Entwicklung einer nativen App mit einer einzigen Webansicht sollte nicht zu viel kosten.

Wenn dies jedoch nicht möglich ist, bleibt Ihre App eine reine Web-App. Hier ist eine mögliche Option:

  1. Wenn der Server die Web-App bereitstellt, geben Sie einen Zugriffsschlüssel an.
  2. Wenn die Web-App einen API-Aufruf ausführt, muss sie eine Hash-Version des Zugriffsschlüssels bereitstellen.
  3. Wie Ihre Web-App-Hashes ausgeführt werden, hängt von der Logik ab, die in minimierten + verschleierten Codes implementiert ist.
  4. Ihre Backend-API überprüft dann den Hash, indem sie dieselbe versteckte Logik auf den gespeicherten Zugriffsschlüssel anwendet, um den Hash zu berechnen und festzustellen, ob er übereinstimmt.
  5. Sie können die versteckte Logik und den Zugriffsschlüssel so oft wie nötig ändern, um die Wahrscheinlichkeit zu verringern, dass jemand den richtigen Hash erhält.

Dies ist natürlich nicht kugelsicher, aber wie Sie wissen, gibt es keine perfekte Sicherheit, und dies erfüllt wahrscheinlich den Zweck (und passt hoffentlich zur Rechnung). Ich würde sagen, Hybrid ist kostengünstiger.

9
Daniel

Dies könnte helfen. Es gibt viele Möglichkeiten, wie Sie Ihren Ruheservice sichern können. Eine davon ist CORS und die Verwendung von PUT/Delete, da diese Header nicht domänenübergreifend festgelegt werden können. http://www.nsa.gov/ia/_files/support/guidelines_implementation_rest.pdf

0
arcaneak