CSRF-Schutz

Erfahren Sie, wie Sie AEM CSRF-Token generieren und zu zulässigen POST-, PUT- und Löschanfragen für authentifizierte Benutzende zu AEM hinzufügen können.

AEM erfordert die Übermittlung eines gültigen CSRF-Tokens für authentifizierte POST-, __PUT- oder DELETE-HTTP-Anfragen an den AEM-Author- und Publish-Service.

Das CSRF-Token ist nicht erforderlich für GET-Anfragen oder anonyme Anfragen.

Wenn kein CSRF-Token mit einer POST-, PUT- oder DELETE-Anfrage gesendet wird, gibt AEM den „Fehler 403: Unzulässig“ zurück und AEM protokolliert den folgenden Fehler:

[INFO][POST /path/to/aem/endpoint HTTP/1.1][com.adobe.granite.csrf.impl.CSRFFilter] isValidRequest: empty CSRF token - rejecting
[INFO][POST /path/to/aem/endpoint HTTP/1.1][com.adobe.granite.csrf.impl.CSRFFilter] doFilter: the provided CSRF token is invalid

Siehe die Dokumentation für weitere Informationen zum AEM CSRF-Schutz.

CSRF-Client-Bibliothek

AEM bietet eine Client-Bibliothek, die zum Generieren und Hinzufügen von XHR- und Formular-POST-Anfragen für CSRF-Token über das Patchen von Kernprotokollfunktionen verwendet werden kann. Die Funktion wird von der granite.csrf.standalone-Client-Bibliothekskategorie bereitgestellt.

Um diesen Ansatz zu verwenden, fügen Sie granite.csrf.standalone als Abhängigkeit zur Client-Bibliothek hinzu, die auf Ihrer Seite geladen wird. Wenn Sie beispielsweise die wknd.site-Kategorie der Client-Bibliothek verwenden, fügen Sie granite.csrf.standalone als Abhängigkeit zur Client-Bibliothek hinzu, die auf Ihrer Seite geladen wird.

Benutzerdefinierte Formularübermittlung mit CSRF-Schutz

Wenn die Verwendung der granite.csrf.standaloneClient-Bibliothek nicht für Ihren Anwendungsfall verfügbar ist, können Sie einer Formularübermittlung manuell ein CSRF-Token hinzufügen. Das folgende Beispiel zeigt, wie ein CSRF-Token zu einer Formularübermittlung hinzugefügt werden kann.

Dieses Code-Snippet veranschaulicht, wie das CSRF-Token beim Senden des Formulars von AEM abgerufen und zu einer Formulareingabe mit dem Namen :cq_csrf_token hinzugefügt werden kann. Da das CSRF-Token eine kurze Lebensdauer hat, ist es am besten, das CSRF-Token unmittelbar vor dem Senden des Formulars abzurufen und festzulegen, um seine Gültigkeit zu gewährleisten.

// Attach submit handler event to form onSubmit
document.querySelector('form').addEventListener('submit', async (event) => {
    event.preventDefault();

    const form = event.target;
    const response = await fetch('/libs/granite/csrf/token.json');
    const json = await response.json();

    // Create a form input named ``:cq_csrf_token`` with the CSRF token.
    let csrfTokenInput = form.querySelector('input[name=":cq_csrf_token"]');
    if (!csrfTokenInput?.value) {
        // If the form does not have a CSRF token input, add one.
        form.insertAdjacentHTML('beforeend', `<input type="hidden" name=":cq_csrf_token" value="${json.token}">`);
    } else {
        // If the form already has a CSRF token input, update the value.
        csrfTokenInput.value = json.token;
    }
    // Submit the form with the hidden input containing the CSRF token
    form.submit();
});

Abrufen mit CSRF-Schutz

Wenn die Verwendung der granite.csrf.standaloneClient-Bibliothek nicht für Ihren Anwendungsfall verfügbar ist, können Sie einem XHR manuell ein CSRF-Token hinzufügen oder Anfragen abrufen. Das folgende Beispiel zeigt, wie ein CSRF-Token zu einem XHR hinzugefügt werden kann, das mit dem Abruf erstellt wurde.

Dieses Code-Snippet zeigt, wie ein CSRF-Token aus AEM abgerufen und zum CSRF-Token-HTTP-Anfragenheader einer Abrufanforderung hinzugefügt wird. Da das CSRF-Token eine kurze Lebensdauer hat, ist es am besten, das CSRF-Token unmittelbar vor der Abrufanfrage abzurufen und festzulegen, um seine Gültigkeit zu gewährleisten.

/**
 * Get CSRF token from AEM.
 * CSRF token expire after a few minutes, so it is best to get the token before each request.
 *
 * @returns {Promise<string>} that resolves to the CSRF token.
 */
async function getCsrfToken() {
    const response = await fetch('/libs/granite/csrf/token.json');
    const json = await response.json();
    return json.token;
}

// Fetch from AEM with CSRF token in a header named 'CSRF-Token'.
await fetch('/path/to/aem/endpoint', {
    method: 'POST',
    headers: {
        'CSRF-Token': await getCsrfToken()
    },
});

Dispatcher-Konfiguration

Bei Verwendung von CSRF-Token im AEM Publish-Service muss die Dispatcher-Konfiguration aktualisiert werden, um GET-Anfragen an den CSRF-Token-Endpunkt zu ermöglichen. Die folgende Konfiguration ermöglicht GET-Anfragen an den CSRF-Token-Endpunkt im AEM Publish-Service. Wenn diese Konfiguration nicht hinzugefügt wird, gibt der CSRF-Token-Endpunkt die Antwort „404 Nicht gefunden“ zurück.

  • dispatcher/src/conf.dispatcher.d/filters/filters.any
...
/0120 { /type "allow" /method "GET" /url "/libs/granite/csrf/token.json" }
...
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69