Skip to content

Protection contre les attaques communes

Injection SQL

  • Par défaut les requêtes créer par Hibernate sont sécuritaires contre l'injection SQL.
  • Les requêtes personnalisées qu'on crée dans un repository utilisant Spring Data JPA ne permettent généralement pas la concaténation directe et sont résistantes à l'injection SQL.
  • Attention aux projets n'utilisant pas un ORM, on écrit alors généralement nos propres requêtes. Veillez à utiliser des requêtes préparées pour ajouter des paramètres provenent de l'utilisateur et non la concaténation de chaîne.

Attaques CSRF

  • Spring Security active par défaut la protection CSRF
  • Pour spécifier qu'on veut utiliser la configuration par défaut, on peut ajouter à notre filtre de sécurité

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            http
                // ...
                .csrf(Customizer.withDefaults());
            return http.build();
        }
    }
    

  • Pour désactiver la protextion CSRF sur certaines routes

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
    
        @Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
            http
                // ...
                .csrf((csrf) -> csrf
                    .ignoringRequestMatchers("/api/*")
                );
            return http.build();
        }
    }
    

  • Pour ajouter manuellement un jeton CSRF à un formulaire

    <input type="hidden"
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    </form>
    

Protection XSS et CSP

Pour aider à nou protéger des attaques CSRF et pour garantir que les éléments chargés sur les pages proviennent de sources sécusitaires, on pourra configurer différentes en-têtes HTTP.

Dans le filtre de sécurité, on pourra ajouter

.headers(headers -> headers
                .xssProtection(xss -> xss
                    .headerValue(XXssProtectionHeaderWriter.HeaderValue.ENABLED_MODE_BLOCK)
                )
            );

Pour augmenter la protection contre les attaques XSS.

Attention, cela ne remplace pas les pratiques à ajouter sur les pages pour se protéger des attaques XSS. C'est une protection supplémentaire.

On peut également indiquer les sources de confiance en configurant une politique de sécurité du contenu (Content Security Policy -- CSP).

On ajoutera ensuite à la section headers du filtre de sécurité les instructions de configuration de la politique.

.headers(headers -> headers
                .contentSecurityPolicy(csp -> csp
                    .policyDirectives("script-src 'self' https://trustedscripts.example.com; object-src https://trustedplugins.example.com; report-uri /csp-report-endpoint/")
                )
            );

On pourra donc indiquer les sources de confiance à notre application:

  • script-src
    • Les adresses des scripts de confiance
    • Adresse des CDN
    • self est un script provenant de l'application elle-même.
    • self ne permet pas les scripts au travers du code HTML. Le script doit être chargé d'un fichier.

Références

Protection CSRF

Protection XSS

Protection CSP

Informations supplémentaires sur le CSP