So sichern Sie Webanfragen mit Nonces
Problem
Ein Benutzer hat eine Möglichkeit gefunden, das Anforderungsvalidierungssystem des Bewertungssystems einer Website auszunutzen Duplizieren hochwertiger HTTP-Anfragen. Dies beeinträchtigt die Integrität und Zuverlässigkeit des Systems.
Lösung: Implementierung eines Nonce-Systems
Nonces (einmal verwendete Anzahl) sind Werte, die Request-Replay-Angriffe verhindern, indem sie sicherstellen, dass eine bestimmte Anfrage nicht gesendet wurde vorher gemacht. Hier ist eine gängige und sichere Möglichkeit, ein Nonce-System zu implementieren:
Serverseitige Nonce-Generierung und -Verifizierung
getNonce()-Funktion
- Identifiziert den Client, der die Anfrage stellt (z. B. nach Benutzername, Sitzung).
- Generiert eine zufällige Nonce mithilfe einer sicheren Hash-Funktion (z. B. SHA512).
- Speichert die Nonce in einer Datenbank, die mit verknüpft ist Die ID des Clients.
- Gibt die Nonce an den Client zurück.
verifyNonce() Funktion
- Ruft die zuvor gespeicherte Nonce ab für die Client-ID.
- Entfernt die Nonce aus der Datenbank (um zu verhindern, dass sie wiederverwendet wird).
- Generiert einen Hash mit der vom Client bereitgestellten Nonce (Cnonce), den Anforderungsdaten und ein geheimes Salt.
- Vergleicht den generierten Hash mit dem vom Client bereitgestellten Hash.
- Gibt „true“ zurück, wenn die Hashes übereinstimmen, was auf eine gültige Nonce hinweist.
Client -Side Nonce Usage
sendData() Function
- Ruft die Nonce mithilfe der getNonce()-Funktion vom Server ab.
- Generiert eine clientspezifische Nonce (cnonce) unter Verwendung einer sicheren Hash-Funktion.
- Verkettet die Server-Nonce, Client-Nonce und Anforderungsdaten.
- Erzeugt einen Hash aus dem verketteten Wert.
- Sendet die Anfrage an den Server, einschließlich der Daten, Cnonce und Hash.
Sicherheitsüberlegungen
- Zufällige Nonce-Generierung: Der makeRandomString( )-Funktion sollte höchst unvorhersehbare Zufallszahlen generieren, um die Sicherheit zu erhöhen.
- Sichere Hash-Funktion: Verwenden Sie eine starke Hash-Funktion wie SHA512 oder bcrypt für Nonce-bezogene Hash-Berechnungen.
- Einmalige Verwendung pro Anfrage: Nonces sollten nur einmal verwendet und aus dem Speicher entfernt werden, um Wiederholungsangriffe zu verhindern.