[JAVA] Politique de contre-mesure CSRF et exemple de mise en œuvre dans une application REST utilisant "Spring Boot" + "EXT JS"

Comme il y avait peu d'informations sur les combinaisons ci-dessus, je les ai résumées.

Politique de contre-mesures

Comme mesure contre CSRF (falsification de demande intersite), une méthode générale d'émission de jetons est utilisée. Il est facile d'utiliser Set-Cookie pour notifier les informations de jeton du serveur au client. Spring Boot le fera pour vous. [^ 1] La transmission de jetons du client au serveur est écrite indépendamment en JavaScript, et les informations sur les cookies sont écrites dans l'en-tête http à l'exception de la requête GET [^ 2].

[^ 1]: Même si vous transmettez le jeton avec Cookie (par erreur au début), le navigateur l'enverra sans autorisation comme si vous aviez l'ID de session avec Cookie, donc cela n'a aucun sens en tant que mesure CSRF? J'ai pensé, mais lors de la vérification du jeton CSRF dans Spring Boot, il ne regarde pas la valeur du cookie, mais regarde "_csrf des données de formulaire" ou "X-XSRF-TOKEN de l'en-tête http". C'était un miso. Il est nécessaire de remplacer le token du cookie pour former des données ou un en-tête http, mais ce n'est pas possible avec le JS cross-origin (vous ne pouvez pas voir le cookie du domaine légitime), c'est donc une contre-mesure.

[^ 2]: Compte tenu des caractéristiques des attaques CSRF, il n'est pas nécessaire de vérifier avec une requête GET. Spring Boot n'effectue pas de vérifications côté serveur.

  1. Spring Boot
    1.1. Définissez la destination de stockage du jeton CSRF sur Cookie. 1.2. Pas HttpOnly pour autoriser l'accès depuis JS.
  2. Ext JS
    2.1 Les demandes GET sont exclues. 2.1. Obtenez des informations de jeton à partir de la valeur du cookie lors de l'envoi d'une requête Ajax avec Ext et ajoutez-les à l'en-tête Http.

Exemple d'implémentation

Spring Boot
Les contre-mesures CSRF sont activées par défaut, mais la destination de stockage du jeton est spécifiée et httpOnly est désactivé.

SecurityConfig.java



public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            ...//Omis. Définissez les définitions nécessaires le cas échéant.
    }
}

Ext JS
Puisqu'il est nécessaire de donner des jetons à toutes les requêtes ignorées par Ajax, il est défini à l'endroit appelé supérieur. En le définissant comme «avant demande», le traitement est effectué avant d'émettre une requête Ajax afin qu'elle n'ait pas à être implémentée individuellement.

app.js


Ext.Ajax.on('beforerequest', function (conn, request, eOpts) {
    //Accordez un jeton CSRF dans les cas autres que les demandes GET.
    if (request.method === 'GET') {
        return;
    }
    //Cookie XSRF-Valeur d'élément TOKEN, en-tête http arbitraire X-XSRF-Accorder comme 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

Politique de contre-mesure CSRF et exemple de mise en œuvre dans une application REST utilisant "Spring Boot" + "EXT JS"
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Développement d'applications Spring Boot dans Eclipse
Téléchargement et téléchargement de fichiers à l'aide d'Ajax avec Spring Boot (sans JQuery)
Implémenter l'API REST avec Spring Boot
Implémenter l'application Spring Boot dans Gradle
Mise en œuvre du formulaire de sélection de catégorie en utilisant JS dans la création d'applications frima
Déployer automatiquement des applications Web développées en Java à l'aide de Jenkins [Spring Boot App Edition]
Utilisation de Hystrix et Sentinel dans un exemple de code
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Sortie des journaux de demande et de réponse avec Spring Boot
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
Intégration Tomcat, Apache et WebSocket intégrée à l'application Spring Boot
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Présentez swagger-ui à l'API REST implémentée dans Spring Boot