Beste Weg zum Schutz der Integrität der ajax-request
Baue ich eine Drupal-website mit einer Menge von user-spezifischen Informationen, die gepostet werden mit Hilfe von jQuery/ajax. Die information selbst ist nicht sehr empfindlich, es ist nur wichtig zu überprüfen, dass die Formular-Daten nicht manipuliert wurden tools wie Firebug, sowie sicherzustellen, dass die information wirklich ist, beantragt von den angegebenen Benutzer. In anderen Worten, ich versuche herauszufinden, der beste Weg zum Schutz der Integrität und Authentizität der Daten bei der Buchung mit ajax.
Idealerweise würde ich gerne nutzen, um einige bekannte message authentication system, wie der HMAC-Algorithmus. Aber da dieses enthält einen symmetrischen Schlüssel, ich sehe nicht, wie kann ich verschlüsseln, die POST-Daten, ohne dass der geheime Schlüssel in meine javascript-Datei (was natürlich für jeden sichtbar).
Bitte korrigieren Sie mich, wenn ich habe die falsche Vorstellung darüber, wie das funktionieren sollte.
Zum Beispiel, die info, die ich brauche zu senden
field1=x&field2=y&uid=10
...dann berechne den hash-Wert der Daten zusammen mit einem geheimen Schlüssel. Ist dies möglich, ohne dass die hash-Funktion in meinem javascript-code?
CHECKSUM: hash(postdata, "secret_key")
... und schließlich anfügen Prüfsumme original postdata.
field1=x&field2=y&uid=1&c=CHECKSUM
Alternative
Eine alternative, die ich aber war mit der session-ID des angemeldeten Benutzers. Dies jedoch würde nicht überprüfen Sie die Integrität der Nachricht...
Beim erzeugen von Formular mit PHP, die ich erzeugen kann, die einen versteckten Eingang mit folgenden
CHECKSUM: hash(session id for the current user, "secretkey")
Was ich dann posten würde, die mit ajax ist
field1=x&field2=y&uid=10&c=CHECKSUM
Mit diesem wäre es ziemlich sicher zu authentifizieren, die entsprechenden Benutzer (wieder pseudo-code)
ssid = SELECT ssid FROM sessions WHERE uid = $_POST[uid]
if(ssid && hash(ssid, "secretkey") == $_POST[c]) {
//User OK
} else {
//Invalid user
}
- "es ist nur wichtig zu überprüfen, dass die Formular-Daten nicht manipuliert wurden tools wie Firebug". Wenn jemand manipulieren kann, die mit der
POST
Daten, Sie können Neuberechnen einer Prüfsumme, die mit Leichtigkeit, da Sie, um sich in Ihrem Javascript-code-Basis irgendwo. Ich glaube nicht, dass die Zeit, die Sie verbringen würde auf dieser wäre es Wert. - OK, also wie würdest du das problem lösen?
- Was ist falsch mit Menschen mit Firebug?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht tun, was Sie zu tun versuchen. Im Grunde, Sie versuchen, stellen Sie sicher, dass eine Komponente (Ihre form) auf einem nicht vertrauenswürdigen und unkontrollierte client wird nicht manipuliert werden, von einer anderen Komponente, die auf demselben client. Sie keine Kontrolle über den client. Sie können sich mit allen möglichen Methoden, um es härter für jemanden zu tun, diese auf Ihre Kunden, aber am Ende müssen Sie enthüllen, wie Sie tun diejenigen, die Integritätsprüfungen an den client. Was auch immer Sie tun, in Ihrem Formular-scripts gelesen und verstanden werden können, die von der person auf, die client (muss auf dem client ausgeführt, also wem ist die Interaktion mit dem client kann reverse Engineering alles, was Sie tun, sich zu erholen, die verwendeten Techniken und die Schlüssel/etc, die Sie haben, damit Sie auf dem Schema).
Grundregel der Sicherheit von web-Anwendungen ist, dass Sie nicht kontrollieren kann, was geschieht auf dem client, so dass Sie nicht Vertrauen können client-seitige überprüfung/security-Programme wie dieses.
In der end, es ist unwahrscheinlich, dass der Schutz durch eine solche Regelung würde sich lohnen, die Zeit und Investitionen, um es zu implementieren. Jemand, der entschlossen ist, es zu brechen werden können.
Wie schon von anderen erwähnt, die Sie nicht kontrollieren können die client-Seite. Und das bedeutet, dass Sie nicht kontrollieren können und deshalb nicht Vertrauen können, was der client sendet und alles könnte verändert werden.
Aber nun denken Sie sich dies: je weniger Parameter Sie setzen auf die Kunden, die weniger konnten Sie manipulieren. So versuchen, so viel Parameter in der Steuerung (i. e. auf der server-Seite) wie möglich. Das ist es, was sessions sind.
So könnte man speichern der Parameter, die nicht geändert werden sollen, die Sitzung stattdessen sendet Sie an den client, wo Sie aus Ihrer Kontrolle. Alles, was Sie brauchen, ist die Zuordnung der form-Instanz mit dem server-side form-Parameter. Sie können dies tun, mit der eine zufällig generierte Kennung ist, die Sie als Schlüssel in der session-Daten-array:
Dann bei der Verarbeitung der Formular-Anfrage nehmen Sie einfach die Formular-Daten id, um die Daten in form
$_SESSION['formdata']
um die Daten für die weitere Verarbeitung.Es gibt absolut keine Möglichkeit zu verhindern, dass jemand was "fake" - Anfragen. Sie müssen nur zu glauben, auf diese Weise:
Wenn Sie irgendeine Art von Verschlüsselung auf der Benutzer-Seite ist, dann ist es einfach für jedermann zu erhalten, wie Sie aus Ihrer Verschlüsselung, und dann das gleiche tun, manuell. Zum Beispiel, wenn Sie reden hashes:
Ihre
secretkey
ist nicht geheim, weil es innerhalb einer javascript-Datei.Die einzige Sache, die Sie tun können, ist zu werfen ein Schraubenschlüssel in der "hacker"'s Werke. Zum Beispiel, können Sie diese secretkey aus einem AJAX-request. Dieser geheime Schlüssel wäre einzigartig und gelöscht auf jeder erfolgreichen Anfrage. In einer mehr Allgemeinen Weise, die Sie haben zu bewegen, die Logik der Anwendung möglichst nahe an der server-Seite.
Müssen Sie halten
uid
gespeicherten server-Seite. Dies ist in der Regel erreicht durch Speicherung in einer Sitzung variable.Weil der server speichert die session-Daten ist es unmöglich, einen client zu basteln, die mit Ihrer session Daten. Am besten ein böswilliger Benutzer könnte die Hoffnung sein würde, zu entführen, jemand anderes die aktive session key, der nicht einen praktischen Angriff auf einem korrekt abgesicherten system.
Siehe auch das ausführliche schreiben über warum nutzen wir sessions.
Kann diese Seite helfen: http://www.jcryption.org
Überprüfen Sie meine Antwort auf folgende erwähnen Problem
Sichern und/oder verschlüsseln (versteckt) POST-Variablen in einen jQuery-ajax-request