Das hat mich herausgefordert. Ich habe eine versteckte Eingabe:
%Vor% Ich beziehe die versteckte Eingabe mit gültigen Städtenamen über Javascript, bevor ich das Formular absende. Angenommen, jemand möchte Banana
anstelle eines Städtenamens eingeben. Der Täter kann den Eingabewert einfach über DOM-Inspektoren wie Firebug ändern.
Wie kann ich sicherstellen, dass die versteckten Eingänge nicht manipuliert werden? Ich validiere bereits die Eingabe gegen Angriffe, aber solange ich alphabetische Zeichen akzeptiere, kann alles eingereicht werden, daher banana
...
Bearbeiten: Ich beziehe mich auf versteckte Eingaben im Allgemeinen, nicht nur auf Stadtnamen. Jeder von einem Skript aufgefüllte Wert und ein Wert, der unverändert übergeben werden muss.
Einige Ideen:
Nur serverseitig Der einfachste Weg dazu besteht in der Verwendung von Sitzungsvariablen (wie $_SESSION
), so dass alle Daten serverseitig verwaltet werden, aber die Verwaltung und das Halten separater Registerkarten, die ein Benutzer möglicherweise separat geöffnet hat, kann etwas knifflig werden. Diese Option verhindert, dass der Benutzer die Informationen sehen oder bearbeiten kann.
Lassen Sie den Client ein verschlüsseltes Blob tragen. Nehmen Sie all Ihre "temporären, aber geschützten" Daten, kombinieren Sie sie irgendwie (z. B. JSON) und verschlüsseln Sie dann das Ganze mit einem geheimen Schlüssel, der nur dem Server bekannt ist. Base64 das Ergebnis und lege das in den Wert des versteckten Feldes. (Beachten Sie, dass Sie für eine Hochsicherheitsanwendung auch einen HMAC in diesen Prozess einbinden möchten, der bestätigt, dass an dem Chiffretext nicht herumgebastelt wurde.) Diese Option verhindert auch, dass der Benutzer die Informationen sehen oder bearbeiten kann, aber erleichtert die Handhabung von Fällen, in denen ein Benutzer viele Registerkarten geöffnet hat.
Verwenden Sie immer noch nicht so geheime verborgene Eingabefelder, fügen Sie jedoch einen Manipulationsschutzmechanismus hinzu. Wenn also die Seite generiert wird, nimm alle vorhandenen "geschützten" Variablen, kombiniere sie irgendwie mit einem serverseitigen geheimen Wert und hasse sie [HMAC]. Speichern Sie den Hash in einem eigenen versteckten Feld. Nach der Übergabe des Benutzers wiederholen Sie den Vorgang und prüfen, ob der Hashwert übereinstimmt. Wenn dies nicht der Fall ist, haben Sie einen Fehler mit der Sicherheitsverletzungsseite.
* Wie bei allen Kryptographien kann es auch schwierig sein, dies "richtig" zu tun, und hängt sehr davon ab, wie Sie verschlüsseln / verifizieren. Es gibt viele Fallstricke in Bezug auf Chiffren und Chiffre-Modi usw.
Denken Sie daran, dass die Benutzer nicht daran gehindert werden, Änderungen vorzunehmen. Das bedeutet nicht, dass ein Benutzer nicht alles kopieren und später oder unter einem anderen Konto wiederverwenden kann, es sei denn, Sie ergreifen einen "Zeitstempel" usw.
Sie können nicht. Sie können sich niemals auf vom Benutzer übermittelte Daten verlassen. Selbst wenn Sie verhindern könnten, dass der Benutzer die DOM-Elemente ändert (was nicht möglich ist), können Sie kaum verhindern, dass sie eine HTTP-Anfrage mit cURL, wget oder einer anderen Bibliothek mit den von ihnen gewählten Feldern absetzen. Vertrauen Sie keinen Daten, die vom Benutzer gesendet werden.
Wenn Sie sicherstellen möchten, dass sich der Wert nicht ändert, müssen Sie ihn auf dem Server speichern. PHP verfügt über eine hervorragende Funktion, mit der Sie dies tun können - Sitzungen . Speichern Sie die Daten in einer Sitzung, und der Benutzer kann sie nicht ändern, da sie auf Ihrem Server gespeichert und niemals vom oder zum Benutzer selbst übertragen wird.
Wenn Sie darauf bedacht sind, das Postback des Servers zu vermeiden, um Eingaben zu validieren, könnten Sie base64 encodieren Ihre versteckte Eingabe und zumindest machen es schwieriger für Menschen, sich daran zu manipulieren.
Tags und Links javascript html php security forms