12

ich auf einer REST-Service gerade arbeite, die ein paar Anforderungen hat:Autorisieren REST Anfragen

  1. Es hat sicher.
  2. Benutzer sollten nicht in der Lage sein, Anfragen zu fälschen.

Meine aktuelle vorgeschlagene Lösung ist eine benutzerdefinierte Autorisierungsheader zu haben, die wie folgt aussehen (dies ist die gleiche Art und Weise, dass die Amazon Web Services Arbeit):

Authorization: MYAPI username:signature 

Meine Frage ist, wie die Signatur zu bilden . Wenn sich der Benutzer bei dem Dienst anmeldet, erhält er einen geheimen Schlüssel, mit dem er Anforderungen signieren kann. Dadurch werden andere Benutzer daran gehindert, in ihrem Namen Anfragen zu stellen, sie werden jedoch nicht daran gehindert, Anfragen zu fälschen.

Die Anwendung, die diesen Dienst verwenden wird, ist eine iPhone-Anwendung, also dachte ich, wir könnten einen öffentlichen Schlüssel in die Anwendung eingebettet haben, mit dem wir eine zusätzliche Unterschrift machen können, aber das bedeutet, dass wir haben müssen zwei Signaturen, eine für den Benutzerschlüssel und eine für den App-Schlüssel?

Jeder Rat würde sehr geschätzt werden, würde ich gerne das Recht gleich beim ersten Mal.

+0

Definieren Sie "Schmiedeanforderungen". Welche Entität erstellt nicht gefälschte Anforderungen? Ist es die Client-seitige Software? – Alexander

Antwort

1

Ich denke, der einfachste Weg, dieses Recht zu tun wäre, HTTPS-Client-Authentifizierung zu verwenden. Apples Website hat eine thread zu diesem Thema.

Bearbeiten: Um die Autorisierung zu behandeln, würde ich eine separate Ressource (URI) auf dem Server für jeden Benutzer erstellen und nur diesen (authentifizierten) Benutzer erlauben, diese Ressource zu manipulieren.

Edit (2014): Apple hat in den letzten sechs Jahren ihre Forensoftware geändert; der Thread ist jetzt um https://discussions.apple.com/thread/1643618

+0

Wie verhindert dies, dass Benutzer Anfragen fälschen? – jonnii

+0

Die HTTPS-Clientauthentifizierung erfordert, dass der Client über ein gültiges öffentliches Schlüsselzertifikat verfügt. Es sei denn, Sie meinen mit "Anfragen schmieden", dass ein authentifizierter Benutzer irgendwie unerlaubte Anfragen macht, was ein Autorisierungsproblem und kein Authentifizierungsproblem darstellt. –

+0

Das ist das Problem, das ich angehen möchte, ich habe das Thema aktualisiert, um dies zu reflektieren. Wie würden Sie vorschlagen, gültige Anfragen zu autorisieren? – jonnii

2

Was ist los mit HTTP Digest Authentication?

+0

Erstens werde ich SSL für die Anfragen verwenden müssen (was in Ordnung ist), aber es hindert einen Benutzer nicht, sich von einem Nicht-iPhone-Gerät in die API einzuloggen und gefälschte Anfragen zu senden. – jonnii

+0

Wie können sie eine Anfrage über Digest-Authentifizierung fälschen? Wie haben sie den aktuellen Nonce-Wert erhalten und eine akzeptable Digest-Response erstellt? –

+0

Sie können eine Anfrage fälschen, da sie eine Drittanbieter-Client-Anwendung erstellen können, die sich bei der API anmeldet. An diesem Punkt können sie ihre eigenen Anfragen senden. Ich muss die Quelle der API-Anfrage überprüfen. – jonnii

8

Die Antwort ist einfach: Es kann nicht getan werden. Sobald Sie eine Lösung an den Endbenutzer versenden, kann er oder sie immer den Server angreifen, mit dem er kommuniziert. Die häufigste Version dieses Problems ist das Schummeln mit Highscore-Listen in Flash-Spielen. Sie können es härter machen durch Einbetten einer Art von Verschlüsselung in den Client und Verschleiern des Codes ... Aber alle kompilierten und verschleierten Code kann immer dekompiliert und unverschleiert werden. Es ist nur eine Frage, wie viel Zeit und Geld Sie bereit sind auszugeben und ebenso für den potenziellen Angreifer.

Ihr Anliegen ist also nicht, wie Sie versuchen, zu verhindern, dass der Benutzer fehlerhafte Daten an Ihr System sendet. Es ist, wie Sie den Benutzer von schädigen Ihr System zu verhindern. Sie müssen Ihre Schnittstellen so gestalten, dass alle Schäden, die durch fehlerhafte Daten verursacht werden, nur den Benutzer betreffen, der sie sendet.

+0

In diesem Fall werden wir auf dem iPhone bereitstellen, also besteht die Gefahr, dass jemand den Code dekompiliert. Du ziehst in deinem Beitrag sehr gültige Punkte dazu, die Fähigkeit zu beschränken, nur die Nutzerdaten zu beschädigen, in diesem Fall könnten sie in einem Spiel betrügen, also müssen wir in der Lage sein, Betrüger zu identifizieren und effektiv mit ihnen umzugehen. Keine leichte Aufgabe. – jonnii

+0

Die einzige Möglichkeit, ein Spiel zu sichern, besteht darin, es vollständig auf dem Server auszuführen und nur die Aktionen des Benutzers über die Leitung zu senden. Was ich normalerweise tue, ist: 1. Machen Sie Betrug schwierig 2. Speichern Sie so viele Informationen wie möglich. Betrug ist normalerweise relativ einfach zu erkennen, so dass Sie anschließend alle Einträge für diesen Benutzer löschen können. –

+0

Wenn du ein SPIEL entwickelst, und das ist ein SCHMERZ-Problem, dann steht dir eine ganze Reihe anderer Werkzeuge zur Verfügung - je nachdem, ob es ein Geschicklichkeitsspiel oder ein Glücksspiel ist. Im Allgemeinen kann die Spielerleistung statistisch gemessen werden und seltsame Muster können entdeckt werden - so viele Betrugserkennungssysteme arbeiten in der Unterhaltungsindustrie. Eine andere Sache, die einem sofort in den Sinn kommt, ist das algorithmische Design, das dem Spiel bestimmte messbare Eigenschaften hinzufügt - zum Beispiel Fehlerakkumulation in Fließkommazahlen. – mst

Verwandte Themen