Ich arbeite an einer Web-App, bei der bestimmte Aktionen einem Benutzer "Karma" einbringen. Das Karma-Inkrement ist eine einfache AJAX-Anfrage, die eine Zahl im DB erhöht. Was ist nun zu verhindern, dass ein Benutzer doppelte AJAX-Anfragen manuell erstellt und seine eigene Punktzahl immer wieder erhöht?
Bearbeiten: Die Aktivität, die das Benutzer-Karma verdient, geschieht alles clientseitig mit Javascript. Es gibt also keine Möglichkeit für den Server zu wissen, ob es eine 'echte' Anfrage von der App oder eine 'falsche' Anfrage ist, die vom Benutzer erstellt wurde, der $ .post auf der Konsole eintippt.
Edit2: Eine ähnliche SO-Frage gefunden dieses Problem. Klingt wie die Antwort ist, Sicherheit durch Verschleierung ist die beste Wette. Garantierte Sicherheit ist nicht möglich. Vorschläge für Verschlüsselungstools, die den Inhalt der AJAX-Aufrufe schwerer lesbar machen würden, wären daher wünschenswert.
Anstatt zu versuchen, die Leute vom Schummeln abzuhalten, sollten Sie sich darauf konzentrieren, die negativen Auswirkungen zu minimieren, die Betrüger auf Nicht-Betrüger haben:
Wenn Karma als "Highscore" verwendet wird und Sie sich Sorgen darüber machen, dass der Benutzer Karma schneller verdient, als sie sollten, sollten Sie einen Zeitstempel des letzten Karma-Gewinns und eine Anfrage zurückweisen, wenn es zu früh ist / oder setze ein tägliches Limit für das verdiente Karma, damit sie den Prozess nicht automatisieren können, wenn sie nicht an der Tastatur sind.
Wenn die Aktion, die einem Benutzer ein Karma einbringt, auch Auswirkungen auf andere Benutzer hat, sollte es ein Ajax-Aufruf sein, der beide Effekte auslöst.
Es gibt ein paar Lösungen für dieses Problem. Einer von ihnen ist es, Ihren Link oder Button oder was auch immer Sie klicken, um eine AJAX-Anfrage zu senden, zu "deaktivieren".
Wenn Sie JQuery verwenden, haben Sie einige Rückrufe dafür: beforeSend
und success
.
Sie können versuchen, Ihren Trigger in beforeSend
callback zu "deaktivieren" und sie in success
(oder complete
) Callback "aktivieren".
Aber ich denke, es ist eine Art Hack:)
Ihr Server sollte die Client-Aktivität verfolgen, um daraus abzuleiten, ob die Ausführung des Ajax-Aufrufs "logisch" oder "falsch" ist. Dies kann mit Sitzungen (nicht empfohlen) gemacht werden, da auch (abhängig von einigen Faktoren) oder direkt auf der db
gefälscht werden kannIm Allgemeinen fühle ich mich nicht wohl dabei, Sicherheitsratschläge zu geben, aber da dies einfach ist, um Karma in einer App zu erhöhen, werde ich es versuchen.
Wie wäre es mit einem HMAC Digest? Sie müssen einen Schlüssel für Clients generieren, wenn sie sich bei der App anmelden, und der Client muss beim Erhöhen von Karma drei Datenbits senden:
Der Server sucht dann den Schlüssel für den Benutzernamen in (1) oben und vergleicht den HMAC-Digest des geladenen Schlüssels und die Verkettung der Benutzernamen mit dem bereitgestellten HMAC-Digest in (3) oben.
Sie können Fälle, in denen die Benutzernamen in (1) und (2) gleichwertig sind, sofort ablehnen - dies verhindert, dass Benutzer ihr eigenes Karma erhöhen.
Sie können auch Fälle ablehnen, in denen die Digests nicht übereinstimmen. Dadurch werden Fälle erfasst, in denen ein Benutzer versucht, eine Karma-Inkrementanfrage zu fälschen.
Wenn der Schlüssel, den Sie bei der Anmeldung freigegeben haben, abgefangen wird, könnte er von einem anderen Benutzer verwendet werden, um falsche Karma-Inkremente zu generieren.
Sie sollten in der Lage sein, HMAC-Implementierungen sowohl für Ruby als auch für JavaScript zu finden, um dies zu implementieren.
Tags und Links security ruby-on-rails ajax