Wie man am besten CSRF-Attacken in einer GAE App verhindern?
-
10-07-2019 - |
Frage
Also, was ist der beste Weg, um einen XSRF Angriff für eine GAE Anwendung zu verhindern? Stellen Sie sich vor wie folgt vor:
- Jeder kann ein Benutzer öffentliches Objekt sehen, und die db.Model-ID in der Anforderung verwendet wird, die, um herauszufinden, um zu zeigen, widersprechen. Böswillige Benutzer haben nun die ID.
- bösartiger Benutzer erstellt ihr eigenes Objekt und prüft das Lösch Formular aus. Sie wissen nun, wie ein Objekt mit einer bestimmten ID zu löschen.
- bösartiger Benutzer erhält unschuldiger Benutzer eine Löschanfrage für den Benutzer des Objekts senden.
Welche Schritte kann ich hinzufügen 3 # zu verhindern? Beachten Sie, dass, wenn ich ID sagen, ich bin die tatsächliche ID Teil des Schlüssels. Eine Idee, die ich hatte, war den vollständigen Schlüsselwert in Löschanfragen zu verwenden, würde aber, dass ein böswilligen Benutzer verhindern, daß dies herauszufinden? Soweit ich weiß, ist der Schlüssel eine Kombination der Modellklasse-Typ, der App-ID und die Objektinstanz-ID, so konnten sie wahrscheinlich den Schlüssel aus dem id ableiten, wenn sie wollten.
Jede andere Ideen da draußen?
Lösung
Wenn Sie die Seite zu erzeugen, die der Benutzer ein Objekt löschen kann, erzeugt eine zufälligen Token und sie in einem versteckten Formularfeld. Auch setzte einen HTTP-Cookie nur mit diesem Wert. Wenn Sie eine Löschanfrag erhalten, überprüfen Sie, dass der Zufall Token aus der Form und der Wert aus dem Cookie-Spiel.
Ihre zufälligen Token sollte nicht nur eine Zufallszahl sein. Sie sollten die Kombination aus einer Zufallszahl und die Identität des Benutzers verschlüsseln, um es für Angreifer schwieriger zu machen, ihr eigenes Tokens zu schmieden. Sie sollten auch im Cookie gespeichert in Form und der gespeicherten Wert unterschiedliche Verschlüsselungsschlüssel für den Wert zu verwenden, so dass, wenn einer der Token Leck hat, ist es immer noch schwierig für einen Angreifer ist es, die anderen Token zu schmieden.
Dieser Ansatz stellt sicher, dass die Löschanfrage von dem Formular stammt, durch das Vorhandensein der Sicherheits-Token in Form; und erfordert nicht auf den Datenspeicher geschrieben werden.
Dieser Ansatz ist immer noch anfällig für Cross-Site-Scripting-Attacken, in denen ein Angreifer den verborgenen Wert aus dem Formular abrufen konnte oder senden Sie das Formular, so gründlich testen Sie Ihre Website für Cross-Site-Scripting-Schwachstellen. Dieser Ansatz ist auch anfällig für "Clickjacking" Angriffe.
Andere Tipps
Ganz einfach: Schauen Sie sich die Referer. Es ist (absichtlich) unmöglich, dies mit Javascript zu setzen, HTML-Formulare, etc. Wenn es leer ist oder von Ihrer eigenen Seite (einige Proxies und Browsern referers Streifen) - oder genauer gesagt von der erwarteten Quelle - lassen Sie es. Andernfalls leugnen und es loggt sein.
Edit: Jeff hat einen Followup Artikel mit ein paar Möglichkeiten CSRF-Angriffe zu verhindern.
In Serverantwort Anzeige die Form einen magischen Hash erstellen (basierend auf Client-IP + Datum / Uhrzeit + zufälliges Salz, was auch immer). Legen Sie es in einem Cookie und speichern irgendwo auf dem Server. Während einreichen Aktion Handhabung das Cookie-Hash gegen den Datenbank-Eintrag überprüfen.
Wenn es gibt nicht so Hash oder es ist anders, lehnt die Vorlage.
Nach der erfolgreichen einreichen können Sie den Hash-Eintrag entfernen, ändern Sie es Staat eingereicht -. Was auch immer zu Ihnen passt
Diese Methode sollten Sie in vielen Fällen schützen, aber sicher noch nicht zu 100% kugelsicher.
Führen Sie eine Suche nach Artikeln über CSRF, vielleicht werden Sie einige gute Antworten zu diesem Stack-Überlauf, was . ;)
Macht keine Referrer-Kontrollen oder Client-IP-Validierungen - es ist zu fehleranfällig (die Referrer-Informationen können durch die User-Agenten gelöscht werden, ein Proxy oder durch die Präferenzen des Nutzers) und Client-IP kann zwischen der Erstellung von Formularen und Einreichung ändern -. bestraft den Benutzer nicht für dynamische IP-Adresszuweisung