Comme il y avait peu d'informations sur les combinaisons ci-dessus, je les ai résumées.
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.
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