[JAVA] CSRF-Gegenmaßnahmenrichtlinie und Implementierungsbeispiel in einer REST-Anwendung unter Verwendung von "Spring Boot" + "EXT JS"

Da es zu den obigen Kombinationen nur wenige Informationen gab, habe ich sie zusammengefasst.

Gegenmaßnahmenpolitik

Als Maßnahme gegen CSRF (Cross-Site Request Forgery) wird eine allgemeine Token-Ausstellungsmethode verwendet. Es ist einfach, Set-Cookie zu verwenden, um die Token-Informationen vom Server an den Client zu benachrichtigen. Spring Boot erledigt das für Sie. [^ 1] Die Tokenübertragung vom Client zum Server wird unabhängig in JavaScript geschrieben, und Cookie-Informationen werden mit Ausnahme der GET-Anforderung [^ 2] in den http-Header geschrieben.

[^ 1]: Selbst wenn Sie das Token mit Cookie übergeben (zunächst aus Versehen), sendet der Browser es ohne Erlaubnis, als hätten Sie die Sitzungs-ID mit Cookie, sodass es als CSRF-Maßnahme bedeutungslos ist. Ich dachte, aber beim Überprüfen des CSRF-Tokens in Spring Boot wird nicht der Cookie-Wert, sondern "_csrf der Formulardaten" oder "X-XSRF-TOKEN des http-Headers" angezeigt. Es war ein Miso. Es ist notwendig, das Token aus dem Cookie zu ersetzen, um Daten oder einen http-Header zu bilden. Dies ist jedoch mit Cross-Origin-JS nicht möglich (Sie können das Cookie der legitimen Domain nicht sehen), daher ist dies eine Gegenmaßnahme.

[^ 2]: In Anbetracht der Merkmale von CSRF-Angriffen ist eine Überprüfung mit einer GET-Anforderung nicht erforderlich. Spring Boot führt keine serverseitigen Überprüfungen durch.

  1. Spring Boot
    1.1 Setzen Sie das CSRF-Token-Speicherziel auf Cookie. 1.2 Verwenden Sie HttpOnly nicht, um den Zugriff von JS zuzulassen.
  2. Ext JS
    2.1 GET-Anfragen sind ausgeschlossen. 2.1 Beziehen Sie Token-Informationen aus dem Cookie-Wert, wenn Sie eine Ajax-Anfrage mit Ext senden, und fügen Sie sie dem HTTP-Header hinzu.

Implementierungsbeispiel

Spring Boot
CSRF-Kennzahlen sind standardmäßig aktiviert, aber das Token-Speicherziel ist angegeben und httpOnly ist deaktiviert.

SecurityConfig.java



public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            ...//Ausgelassen. Definieren Sie die erforderlichen Definitionen entsprechend.
    }
}

Ext JS
Da es notwendig ist, allen von Ajax übersprungenen Anforderungen Token zu geben, wird es an der Stelle definiert, die als höher bezeichnet wird. Durch die Definition als "vor der Anforderung" wird die Verarbeitung vor dem Ausgeben einer Ajax-Anforderung ausgeführt, sodass sie nicht einzeln implementiert werden muss.

app.js


Ext.Ajax.on('beforerequest', function (conn, request, eOpts) {
    //Gewähren Sie ein CSRF-Token in anderen Fällen als GET-Anforderungen.
    if (request.method === 'GET') {
        return;
    }
    //Cookie XSRF-TOKEN-Elementwert, beliebiger http-Header X.-XSRF-Grant als TOKEN.
    if (document.cookie) {
        var cookies = document.cookie.split(";");
        for (var i = 0; i < cookies.length; i++) {
            var str = cookies[i].split("=");
            if (str[0] == 'XSRF-TOKEN') {
                conn.setDefaultHeaders({ 'X-XSRF-TOKEN': unescape(str[1]) });
                break;
            }
        }
    }
});

Recommended Posts

CSRF-Gegenmaßnahmenrichtlinie und Implementierungsbeispiel in einer REST-Anwendung unter Verwendung von "Spring Boot" + "EXT JS"
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Abrufen von Fehlerinformationen mithilfe von DefaultErrorAttributes und ErrorAttributeOptions in Spring Boot 2.3
Spring Boot-Anwendungsentwicklung in Eclipse
Hochladen und Herunterladen von Dateien mit Ajax mit Spring Boot (ohne JQuery)
Implementieren Sie die REST-API mit Spring Boot
Implementieren Sie die Spring Boot-Anwendung in Gradle
Implementierung eines Kategorieauswahlformulars mit JS bei der Erstellung von Frima-Apps
Automatische Bereitstellung von in Java entwickelten Webanwendungen mit Jenkins [Spring Boot App Edition]
Verwenden von Hystrix und Sentinel im Codebeispiel
[FCM] Implementierung der Nachrichtenübertragung mit FCM + Spring Boot
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
Erstellen Sie eine Spring Boot-Anwendung mit IntelliJ IDEA
Testen von JPA-Entitäten und -Repositorys mit Spring Boot @DataJpaTest
In die Spring Boot-Anwendung integrierte Integration von Tomcat, Apache und WebSocket
Versuchen Sie es mit einem DI-Container mit Laravel und Spring Boot
Versuchen Sie, OpenID Connect mit Keycloak (Spring Boot-Anwendung) zu verwenden.
Testen Sie die Klasse mit Feldinjektion im Spring-Boot-Test, ohne den Spring-Container zu verwenden
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein