Compétences à valider pour la conception et le développement d’applications sécurisées
Validation toujours côté client et serveur :
// Validation d'un champ de formulaire function validateInput(input) { const regex = /^[a-zA-Z0-9\s]+$/; // on autorise les lettres, chiffres et espaces avec un regex return regex.test(input); }
@Valid
@PostMapping("/submit") public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result) { if (result.hasErrors()) { return "error"; } return "success"; }
v-html
<!-- vulnérable : Injection directe de code HTML/JS sans échappement, le code est récupéré tel quel donc du script js sera interprété ! --> <div>{{ userInput }}</div> <!-- Sécurisé : Échappement automatique avec Thymeleaf (Java) --> <div th:text="${userInput}"></div>
Utiliser des requêtes paramétrées (PreparedStatement en java) :
// vulnérable : Concatenation de requêtes SQL à ne jamais faire String query = "SELECT * FROM users WHERE username = '" + userInput + "'"; // Sécurisé : Prepared Statement c'est mieux PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE username = ?"); stmt.setString(1, userInput);
Désactiver les méthodes HTTP dangereuses (ex : PUT, DELETE) si non utilisées en modifiant le fichier .htaccess de votre site web.
PUT
DELETE
.htaccess
# ------------------------------------------------------------ # Méthodes HTTP autorisées ici, seulement les Get, Post et Head # le reste est interdit. par contre, ici c'est pour toutes les # pages du site. nous sommes dans le fichier .htaccess # ------------------------------------------------------------ <LimitExcept GET POST HEAD> Require all denied </LimitExcept>
Un WAF peut aider, mais il ne résout pas toute la sécurité ! Il agit comme un filtre devant pour l’application : il inspecte les requêtes HTTP et bloque des attaques connues, par exemple injection SQL, XSS, scans agressifs, tentatives d’exploitation, robots suspects. L’OWASP décrit un WAF comme une protection placée devant une application web, appliquant des règles sur les conversations HTTP, notamment contre XSS et SQL injection.
WAF
Vous pouvez parourir la documentation des recommandations qui ne sont pas toujours appliquées par certains sites comme celui de l’ANTS !
npm audit
OWASP Dependency-Check
Solutions :
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted.cdn.com;
Lien vers un complément d’explication sur la manière de résoudre les alertes CSP
// exemple en Java (Servlet) Cookie cookie = new Cookie("sessionId", "12345"); cookie.setHttpOnly(true); cookie.setSecure(true); // HTTPS uniquement response.addCookie(cookie);
Tokens CSRF :
<!-- Exemple avec Spring Security (Thymeleaf) --> <form action="/submit" method="post"> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> <!-- Champs du formulaire --> </form>
SameSite Cookies :
Set-Cookie: sessionId=12345; SameSite=Strict;
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr
# Exemple pour Apache SSLCertificateFile /path/to/certificate.crt SSLCertificateKeyFile /path/to/server.key
Forcer HTTPS dans votre fichier .htaccess :
# Redirection HTTP → HTTPS RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Ces patterns sont générales étudiés lors de l’apprentissage de la programmation et sont pour la pluplart utilisés par les frameworks. pour plus d’information, cherchez sur ce site les design pattern utilisés en Java
CipherFactory.getCipher("AES")
AuthStrategy.authenticate(user, password)
// Interface pour l'objet réel public interface UserService { void saveUser(User user); } // Objet réel public class UserServiceImpl implements UserService { @Override public void saveUser(User user) { System.out.println("Sauvegarde de l'utilisateur : " + user.getName()); } } // Proxy pour ajouter une couche de sécurité public class UserServiceProxy implements UserService { private UserService realService; private SecurityChecker securityChecker; public UserServiceProxy(UserService realService, SecurityChecker securityChecker) { this.realService = realService; this.securityChecker = securityChecker; } @Override public void saveUser(User user) { if (securityChecker.hasPermission(user, "WRITE")) { realService.saveUser(user); } else { throw new SecurityException("Accès refusé !"); } } }
Je ne suis pas certain que c’est ce DICP que vous devez connaître pour les compétences CDA, mais je le mets quand même, c’est plutôt pout les BTS SIO/SLAM. je pense que vous êtes plutôt concerné par la version (Disponibilité - Intégrité - Confidentialité - preuve). J’en parle dans le document principal sur la Cybersécurité. Ce DICP c’est plutôt un rôle différent au sein de l’entreprise.
Document qui recense :
| **Poste** | **IP** | **OS** | **Utilisateur** | **Rôle** | **Dernière MAJ** | |-----------------|--------------|-----------------|-----------------|-------------------|------------------| | PC-DEV-01 | 192.168.1.10 | Ubuntu 22.04 | Alicia | Développeuse | 2026-05-01 | | SRV-PROD-01 | 192.168.1.20 | Debian 11 | root | Administrateur | 2026-05-15 |
Confidentialité (Confidentiality)
Intégrité (Integrity)
Disponibilité (Availability)
-- Créer un utilisateur avec des droits limités CREATE USER app_user WITH PASSWORD 'secure_password'; GRANT SELECT, INSERT ON TABLE users TO app_user;
-- activer l'audit dans PostgreSQL ALTER SYSTEM SET log_statement = 'all';
// avec Spring Security @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
-- Exemple : Désactiver les comptes inactifs depuis 6 mois UPDATE users SET active = false WHERE last_login < NOW() - INTERVAL '6 months';
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/login").permitAll() .anyRequest().authenticated() .and() .oauth2Login(); } }
# Fichier .github/dependabot.yml version: 2 updates: - package-ecosystem: "maven" directory: "/" schedule: interval: "daily" open-pull-requests-limit: 10
-- Requête vulnérable String query = "SELECT * FROM users WHERE username = '" + userInput + "' AND password = '" + passwordInput + "'"; -- Si userInput = admin' --, la requête devient : -- SELECT * FROM users WHERE username = 'admin' --' AND password = '...' -- → Connexion sans mot de passe !
// avec JPA (Spring Data) @Repository public interface UserRepository extends JpaRepository<User, Long> { User findByUsernameAndPassword(String username, String password); }
// Valider un nom d'utilisateur (lettres et chiffres uniquement) if (!userInput.matches("^[a-zA-Z0-9]+$")) { throw new IllegalArgumentException("Nom d'utilisateur invalide !"); }
# Compiler le programme avec AFL afl-gcc programme.c -o programme_afl # Lancer le fuzzing afl-fuzz -i inputs/ -o outputs/ ./programme_afl
Ce complément couvre les compétences essentielles en sécurité informatique pour le titre CDA. Pour aller plus loin :
Ressources Utiles
Il se peut que certains liens deviennent obsolètes, mais pas les principes de sécurité…
Un lien vers le paramètrage pour réduire les alertes CSP d’Owasp ZAP lors de l’analyse d’un site web ou du votre.