Grails - Gibt es eine empfohlene Möglichkeit, mit CSRF-Angriffen in AJAX-Formularen umzugehen?

Ich verwende das Synchronizer-Token-Muster für Standardformulare (useToken = true), kann jedoch keine empfohlene Methode finden, um mit diesem Problem über AJAX umzugehen.

BEARBEITE

Da ich dies gepostet habe, habe ich meine eigene Lösung mit Grails bestehendem Muster von oben gerollt.

In der jQuery-Ajax poste ich das gesamte Formular (einschließlich der ausgeblendeten Felder SYNCHRONIZER_TOKEN und SYNCHRONIZER_URI von Grails), sodass der withForm-Abschluss im Controller die erwartete Leistung erbringen kann.

Das Problem besteht darin, dass bei einer erfolgreichen Antwort kein neuer Tokensatz vorhanden ist (da die Seite nicht neu geladen wird und die Taglib des g: form nicht aufgerufen wird). Daher rufe ich dies manuell im Controller auf und rufe dieselbe Bibliothek auf wie das g: bilden Sie taglib, und geben Sie es in der Ajax-Antwort zurück, und setzen Sie dann den Wert für das ausgeblendete Feld zurück. Siehe unten

var formData = jQuery("form[name=userform]").serializeArray();

$.ajax({
    type: 'POST',
    url: 'delete',
    data: formData,
    success: function (data) {
        // do stuff
    },
    complete: function (data) {
        // Reset the token on complete
        $("#SYNCHRONIZER_TOKEN").val(data.newToken);
    }
})

in der Steuerung:

def delete(String selectedCommonName) {

    def messages = [:]
    withForm {
        User user = User.findByName(name)

        if (user) {
            userService.delete(user)
            messages.info = message(code: 'user.deleted.text')

        } else {
            messages.error = message(code: 'user.notdeleted.text')
        }
    }.invalidToken {
            messages.error = message(code: 'no.duplicate.submissions')
    }
    // Set a new token for CSRF protection
    messages.newToken = SynchronizerTokensHolder.store(session).generateToken(params.SYNCHRONIZER_URI)
    render messages as JSON
}

Kann jemand identifizieren, wenn ich unwissentlich eine Sicherheitslücke in der oben genannten Lösung eingeführt habe. Es sieht für mich angemessen aus, aber ich mag es nicht, etwas mit Sicherheit zu tun zu haben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage