D-OPEN

Comment securiser une application web open source avec l'OWASP Top 10 en 6 etapes

Clara Johansson

Clara Johansson

Ingenieure en securite applicative · 14 avril 2026 · 12 min de lecture

TL;DR

  • 6 etapes structurees pour securiser votre application web open source en suivant l'OWASP Top 10 : audit initial, protection contre les injections, controle d'acces, configuration securisee, chiffrement des donnees et monitoring continu.
  • Outils 100 % open source a chaque etape : OWASP ZAP, SonarQube, Trivy, Nuclei, Gitleaks, Falco — aucune licence proprietaire requise.
  • Exemples de code concrets en Node.js/Next.js et Python pour chaque categorie de vulnerabilite OWASP.
  • Integration CI/CD : comment automatiser les controles de securite dans votre pipeline GitHub Actions pour detecter les vulnerabilites avant chaque deploiement.

La securite des applications web est un enjeu critique en 2026, particulierement pour les projets open source. Selon le dernier rapport de Veracode, 76 % des applications contiennent au moins une vulnerabilite listee dans l'OWASP Top 10. Pour les projets open source, le risque est amplifie : le code etant public, les attaquants peuvent analyser les faiblesses avant meme qu'elles ne soient corrigees. Ce guide vous accompagne en 6 etapes concretes pour securiser votre application web open source en suivant les recommandations de l'OWASP, avec des outils 100 % open source et des exemples de code actionables.

L'OWASP Top 10 en 2026 : rappel des 10 categories de risques

Avant de plonger dans les etapes de securisation, rappelons les 10 categories de risques de l'OWASP Top 10 (derniere version officielle : 2021, avec des mises a jour communautaires en 2025). Chaque categorie represente une famille de vulnerabilites que votre application doit adresser.

RangCategorie OWASPRisque principal
A01Broken Access ControlAcces non autorise a des donnees ou fonctions
A02Cryptographic FailuresDonnees sensibles non chiffrees ou mal protegees
A03InjectionSQL, NoSQL, OS, LDAP, XSS
A04Insecure DesignArchitecture sans prise en compte de la securite
A05Security MisconfigurationConfigurations par defaut, ports ouverts, debug actif
A06Vulnerable ComponentsDependances avec des CVE connues
A07Auth & Identification FailuresSessions faibles, mots de passe non proteges
A08Software & Data IntegrityCI/CD non securise, mises a jour non verifiees
A09Security Logging & MonitoringAbsence de detection des incidents
A10Server-Side Request ForgeryRequetes vers des services internes

Notre guide en 6 etapes couvre l'ensemble de ces categories de maniere structuree. Chaque etape adresse une ou plusieurs categories OWASP et vous fournit les outils et les techniques pour y remedier.

Les 6 etapes de securisation OWASP - Vue d'ensembleEtape 1Audit initial & inventaireOWASP ZAP, Trivy, GitleaksEtape 2Injections & validationA03 : SQLi, XSS, SSRFEtape 3Controle d'acces & authA01, A07 : RBAC, JWT, MFAEtape 4Configuration securiseeA05 : headers, CSP, CORSEtape 5Chiffrement & donneesA02 : TLS, hashing, secretsEtape 6Monitoring & reponseA09 : logs, alertes, WAFResultat : application conforme OWASP Top 10Categories couvertes : A01 a A10 | Outils : 100% open sourceScan automatise CI/CDGitHub Actions + OWASP ZAPAudit trimestrielPentest + revue de codeMonitoring 24/7Falco + Grafana + alertes

Etape 1 : Audit initial et inventaire des vulnerabilites (A04, A06)

Avant de corriger quoi que ce soit, vous devez savoir ou vous en etes. L'audit initial est la fondation de toute demarche de securisation. Il couvre deux aspects : l'analyse de votre code source et l'inventaire de vos dependances.

1.1 Scanner votre application avec OWASP ZAP

OWASP ZAP (Zed Attack Proxy) est le scanner de vulnerabilites web open source de reference. Il effectue des tests dynamiques (DAST) en simulant des attaques sur votre application en cours d'execution. Installez-le et lancez un scan de base :

# Installation via Docker
docker pull ghcr.io/zaproxy/zaproxy:stable

# Scan rapide (baseline) - identifie les problemes les plus courants
docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \
  -t https://votre-app.example.com

# Scan complet (full scan) - plus long mais plus approfondi
docker run -t ghcr.io/zaproxy/zaproxy:stable zap-full-scan.py \
  -t https://votre-app.example.com \
  -r rapport-securite.html

Le rapport genere par ZAP classifie les vulnerabilites par severite (High, Medium, Low, Informational) et les mappe aux categories OWASP. Concentrez-vous d'abord sur les alertes High et Medium — elles representent les risques les plus critiques.

1.2 Auditer vos dependances avec Trivy et OWASP Dependency-Check

La categorie A06 (Vulnerable and Outdated Components) est l'une des plus frequemment exploitees. Vos dependances npm, pip ou Maven peuvent contenir des CVE connues. Deux outils open source se completent parfaitement :

# Trivy : scan des dependances et des conteneurs Docker
# Installation
brew install trivy  # macOS
# ou
apt-get install trivy  # Debian/Ubuntu

# Scanner un projet Node.js
trivy fs --scanners vuln ./

# Scanner une image Docker
trivy image votre-app:latest

# OWASP Dependency-Check : analyse approfondie des composants
# Genere un rapport HTML detaille avec les CVE
dependency-check --project "MonApp" --scan ./package.json \
  --format HTML --out ./rapport-dependances/

1.3 Detecter les secrets exposes avec Gitleaks

Un projet open source dont le code est public est particulierement vulnerable aux fuites de secrets (cles API, tokens, mots de passe en dur). Gitleaks scanne votre historique Git complet :

# Scanner l'historique Git complet
gitleaks detect --source . --report-path gitleaks-report.json

# Scanner uniquement les commits non pousses
gitleaks protect --source . --staged

Conseil pratique : integrez Gitleaks comme pre-commit hook pour empecher tout commit contenant un secret. Ajoutez egalement un fichier .gitleaks.toml pour personnaliser les regles de detection selon votre projet.

Etape 2 : Proteger contre les injections et valider les entrees (A03, A10)

Les injections (SQL, NoSQL, XSS, SSRF) restent l'une des menaces les plus dangereuses malgre des decennies de sensibilisation. La regle d'or : ne jamais faire confiance aux donnees provenant de l'utilisateur.

2.1 Prevention des injections SQL

La solution la plus efficace est l'utilisation systematique de requetes parametrees (prepared statements). Voici la difference entre un code vulnerable et un code securise :

// VULNERABLE - ne JAMAIS faire ceci
const query = "SELECT * FROM users WHERE id = " + req.params.id;
db.query(query);

// SECURISE - requete parametree avec pg (PostgreSQL)
const query = "SELECT * FROM users WHERE id = $1";
db.query(query, [req.params.id]);

// SECURISE - avec Prisma ORM (recommande)
const user = await prisma.user.findUnique({
  where: { id: parseInt(req.params.id) },
});

2.2 Prevention des XSS (Cross-Site Scripting)

Les frameworks modernes comme React et Next.js echappent les sorties par defaut, mais des failles persistent lorsqu'on utilise dangerouslySetInnerHTML ou qu'on injecte des donnees dans des attributs HTML. Mettez en place une Content Security Policy (CSP) stricte :

// next.config.js - CSP headers pour Next.js
const securityHeaders = [
  {
    key: "Content-Security-Policy",
    value: [
      "default-src 'self'",
      "script-src 'self' 'nonce-{NONCE}'",
      "style-src 'self' 'unsafe-inline'",
      "img-src 'self' data: https:",
      "font-src 'self'",
      "connect-src 'self' https://api.votre-domaine.com",
      "frame-ancestors 'none'",
      "base-uri 'self'",
      "form-action 'self'",
    ].join("; "),
  },
  { key: "X-Content-Type-Options", value: "nosniff" },
  { key: "X-Frame-Options", value: "DENY" },
  { key: "X-XSS-Protection", value: "0" },
  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
];

2.3 Prevention des SSRF (Server-Side Request Forgery - A10)

Les attaques SSRF exploitent votre serveur pour effectuer des requetes vers des services internes. Validez et restreignez toutes les URL fournies par les utilisateurs :

// Validation d'URL pour prevenir les SSRF
import { URL } from "url";

function isUrlSafe(userUrl: string): boolean {
  try {
    const parsed = new URL(userUrl);
    const blockedHosts = ["localhost", "127.0.0.1", "0.0.0.0",
      "169.254.169.254",
      "metadata.google.internal"];
    if (blockedHosts.includes(parsed.hostname)) return false;
    if (!["http:", "https:"].includes(parsed.protocol)) return false;
    const ip = parsed.hostname;
    if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(ip)) return false;
    return true;
  } catch {
    return false;
  }
}

Etape 3 : Implementer un controle d'acces robuste (A01, A07)

Broken Access Control est la vulnerabilite numero 1 de l'OWASP Top 10 depuis 2021. Elle couvre tous les cas ou un utilisateur accede a des ressources ou des fonctions auxquelles il ne devrait pas avoir acces : IDOR (Insecure Direct Object References), elevation de privileges, contournement d'authentification.

3.1 Role-Based Access Control (RBAC)

Implementez un systeme de roles et de permissions granulaire. Ne vous fiez jamais au client pour le controle d'acces — tout doit etre verifie cote serveur :

// Middleware de controle d'acces - Next.js API Route
import { getServerSession } from "next-auth";

type Role = "admin" | "editor" | "viewer";

const permissions: Record<string, Role[]> = {
  "GET /api/users": ["admin", "editor", "viewer"],
  "POST /api/users": ["admin"],
  "DELETE /api/users/:id": ["admin"],
  "PUT /api/articles/:id": ["admin", "editor"],
};

export function requireRole(...roles: Role[]) {
  return async (req: Request) => {
    const session = await getServerSession();
    if (!session?.user) {
      return Response.json(
        { error: "Non authentifie" }, { status: 401 }
      );
    }
    if (!roles.includes(session.user.role as Role)) {
      return Response.json(
        { error: "Acces refuse" }, { status: 403 }
      );
    }
  };
}

3.2 Authentification securisee (A07)

Les defaillances d'authentification restent un vecteur d'attaque majeur. Voici les pratiques essentielles :

  • Hachage des mots de passe : utilisez bcrypt ou Argon2id (jamais MD5 ou SHA-256 seul). Le cout de bcrypt doit etre au minimum de 12 rounds.
  • Authentification multi-facteurs (MFA) : implementez TOTP (Google Authenticator, Authy) pour les comptes sensibles. La bibliotheque otplib (open source) simplifie l'implementation.
  • Sessions securisees : utilisez des cookies HttpOnly, Secure, SameSite=Strict. Duree de session limitee a 24 heures maximum avec rotation automatique des tokens.
  • Protection contre le brute force : implementez un rate limiter (express-rate-limit ou similaire) limitant les tentatives de connexion a 5 par minute par IP.

Besoin d'un audit de securite pour votre application ?

Nos experts en securite applicative realisent des audits complets bases sur l'OWASP Top 10, avec des recommandations actionnables et un accompagnement dans la correction des vulnerabilites.

Demander un audit de securite

Etape 4 : Securiser la configuration de l'infrastructure (A05)

La categorie A05 (Security Misconfiguration) couvre toutes les erreurs de configuration qui exposent votre application : headers HTTP manquants, mode debug actif en production, ports inutiles ouverts, comptes par defaut non supprimes, messages d'erreur trop verbeux.

4.1 Headers de securite HTTP

Chaque reponse HTTP de votre application doit inclure un ensemble de headers de securite. Voici la configuration recommandee pour un serveur Next.js ou Express :

// Headers de securite essentiels
const securityHeaders = {
  // Empeche le chargement dans un iframe (clickjacking)
  "X-Frame-Options": "DENY",
  // Empeche le MIME sniffing
  "X-Content-Type-Options": "nosniff",
  // Force HTTPS pendant 1 an
  "Strict-Transport-Security":
    "max-age=31536000; includeSubDomains; preload",
  // Politique de referrer
  "Referrer-Policy": "strict-origin-when-cross-origin",
  // Permissions Policy
  "Permissions-Policy":
    "camera=(), microphone=(), geolocation=(), payment=()",
};

4.2 Configuration Docker securisee

Si votre application est conteneurisee (ce qui est recommande), appliquez ces bonnes pratiques :

# Dockerfile securise - bonnes pratiques
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
# Ne jamais executer en tant que root
RUN addgroup --system appgroup && adduser --system appuser
WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/.next ./.next
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

USER appuser
EXPOSE 3000
ENV NODE_ENV=production

# Pas de shell, signal direct au processus
CMD ["node", "server.js"]

4.3 Scanner la configuration avec Nuclei

Nuclei est un scanner open source base sur des templates YAML. Il detecte les mauvaises configurations, les pages de debug exposees, les fichiers sensibles accessibles et des centaines d'autres problemes :

# Installation
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest

# Scan avec les templates de misconfiguration
nuclei -u https://votre-app.example.com \
  -t misconfiguration/ \
  -t exposures/ \
  -t default-logins/ \
  -severity high,critical \
  -o nuclei-rapport.txt

Etape 5 : Chiffrer les donnees sensibles (A02)

La categorie A02 (Cryptographic Failures) couvre tous les problemes lies au chiffrement insuffisant ou mal implemente : donnees en transit non chiffrees, mots de passe stockes en clair, cles de chiffrement faibles, algorithmes obsoletes.

5.1 Chiffrement en transit : TLS 1.3

Toutes les communications doivent utiliser HTTPS avec TLS 1.3 (ou au minimum TLS 1.2). Utilisez Let's Encrypt (gratuit et open source) avec Certbot pour obtenir et renouveler automatiquement vos certificats :

# Installation et obtention d'un certificat Let's Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d votre-domaine.com -d www.votre-domaine.com

# Renouvellement automatique (deja configure par Certbot)
sudo certbot renew --dry-run

# Configuration Nginx - desactiver TLS 1.0 et 1.1
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

5.2 Chiffrement au repos

Les donnees sensibles (donnees personnelles, informations financieres, donnees medicales) doivent etre chiffrees dans la base de donnees. Utilisez le chiffrement AES-256-GCM pour les champs sensibles :

// Chiffrement AES-256-GCM pour les donnees sensibles
import { createCipheriv, createDecipheriv, randomBytes } from "crypto";

const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY!; // 32 bytes
const ALGORITHM = "aes-256-gcm";

export function encrypt(text: string): string {
  const iv = randomBytes(16);
  const cipher = createCipheriv(
    ALGORITHM, Buffer.from(ENCRYPTION_KEY, "hex"), iv
  );
  let encrypted = cipher.update(text, "utf8", "hex");
  encrypted += cipher.final("hex");
  const tag = cipher.getAuthTag().toString("hex");
  return iv.toString("hex") + ":" + tag + ":" + encrypted;
}

export function decrypt(encryptedData: string): string {
  const [ivHex, tagHex, encrypted] = encryptedData.split(":");
  const decipher = createDecipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY, "hex"),
    Buffer.from(ivHex, "hex")
  );
  decipher.setAuthTag(Buffer.from(tagHex, "hex"));
  let decrypted = decipher.update(encrypted, "hex", "utf8");
  decrypted += decipher.final("utf8");
  return decrypted;
}

5.3 Hachage des mots de passe avec Argon2id

Argon2id est l'algorithme de hachage recommande par l'OWASP en 2026. Il est resistant aux attaques par GPU et par canaux auxiliaires :

// Hachage de mot de passe avec Argon2id
import argon2 from "argon2";

// Hacher un mot de passe
const hash = await argon2.hash(password, {
  type: argon2.argon2id,
  memoryCost: 65536, // 64 MB
  timeCost: 3,       // 3 iterations
  parallelism: 4,    // 4 threads
});

// Verifier un mot de passe
const isValid = await argon2.verify(storedHash, password);

Etape 6 : Mettre en place le monitoring et la reponse aux incidents (A09)

La categorie A09 (Security Logging & Monitoring Failures) est souvent negligee, pourtant elle est cruciale : sans monitoring, vous ne detecterez pas les attaques en cours. Selon le rapport IBM Cost of a Data Breach 2025, les organisations sans monitoring de securite mettent en moyenne 287 jours a detecter une breche, contre 108 jours pour celles qui en ont un.

6.1 Logging structure pour la securite

Chaque evenement de securite doit etre journalise de maniere structuree. Utilisez un format JSON avec les champs essentiels :

// Logger de securite structure
import pino from "pino";

const securityLogger = pino({
  level: "info",
  formatters: {
    level: (label) => ({ level: label }),
  },
  base: {
    service: "mon-app",
    environment: process.env.NODE_ENV,
  },
});

// Evenements a journaliser obligatoirement
securityLogger.info({
  event: "auth.login.success",
  userId: user.id,
  ip: req.ip,
  userAgent: req.headers["user-agent"],
  timestamp: new Date().toISOString(),
});

securityLogger.warn({
  event: "auth.login.failed",
  attemptedEmail: email,
  ip: req.ip,
  reason: "invalid_password",
  consecutiveFailures: failCount,
});

6.2 Detection d'intrusion avec Falco

Falco est un outil open source de detection d'intrusion pour les conteneurs et Kubernetes, cree par Sysdig et maintenu par la CNCF. Il detecte les comportements anormaux en temps reel : execution de shell dans un conteneur, acces a des fichiers sensibles, connexions reseau inhabituelles.

# Installation de Falco via Helm (Kubernetes)
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
  --set tty=true \
  --set falcosidekick.enabled=true \
  --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/..."

# Exemple de regle Falco personnalisee
- rule: Read sensitive file in container
  desc: Detect reading of sensitive files
  condition: >
    open_read and container and
    (fd.name startswith /etc/shadow or
     fd.name startswith /run/secrets)
  output: >
    Sensitive file read in container
    (user=%user.name file=%fd.name container=%container.name)
  priority: WARNING

6.3 Integration CI/CD : automatiser les controles

La derniere piece du puzzle est l'integration de tous ces controles dans votre pipeline CI/CD. Voici un workflow GitHub Actions complet :

# .github/workflows/security.yml
name: Security Pipeline
on: [push, pull_request]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Gitleaks
        uses: gitleaks/gitleaks-action@v2

      - name: Trivy vulnerability scan
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: fs
          scan-ref: .
          severity: HIGH,CRITICAL
          exit-code: 1

      - name: SonarQube Scan
        uses: sonarqube/sonarqube-scan-action@master

      - name: OWASP ZAP Scan
        uses: zaproxy/action-baseline@v0.14.0
        with:
          target: https://staging.votre-app.com
Pipeline de securite CI/CD - Workflow automatisegit pushDeclencheurGitleaksSecrets scanTrivyDependances CVESonarQubeCode SASTZAPDASTTous les checks passent ?Si oui : deploiement autorise | Si non : PR bloqueeEchec : notification + rapport detailleSlack / email + dashboard de vulnerabilitesSucces : deploy staging puis prodMonitoring Falco active en productionFrequence : a chaque push + scan complet hebdomadaire + pentest trimestriel

Recapitulatif : checklist de securisation OWASP

Voici un recapitulatif des 6 etapes avec les actions cles et les outils associes. Utilisez cette checklist comme reference pour vos audits de securite :

EtapeCategories OWASPOutils open sourceFrequence
1. Audit initialA04, A06OWASP ZAP, Trivy, GitleaksA chaque sprint
2. InjectionsA03, A10SonarQube, ESLint securityChaque commit
3. Controle d'accesA01, A07OWASP ZAP, tests unitairesChaque feature
4. ConfigurationA05Nuclei, Docker BenchHebdomadaire
5. ChiffrementA02testssl.sh, CertbotMensuel
6. MonitoringA09Falco, Grafana, Pino24/7 continu

La securisation d'une application web open source est un processus continu, pas un evenement ponctuel. En suivant ces 6 etapes et en integrant les controles dans votre pipeline CI/CD, vous couvrez l'ensemble des categories du OWASP Top 10 avec des outils 100 % open source. La cle est l'automatisation : chaque controle qui peut etre automatise doit l'etre, pour que la securite ne depende pas de la vigilance humaine — mais soit garantie par le processus.

FAQ

Qu'est-ce que l'OWASP Top 10 et pourquoi est-il important pour la securite des applications web ?

L'OWASP Top 10 est un classement des 10 vulnerabilites les plus critiques des applications web, publie par l'Open Web Application Security Project. Mis a jour regulierement (derniere version 2021), il sert de reference mondiale pour les developpeurs, les auditeurs de securite et les organisations souhaitant securiser leurs applications. Il couvre les injections, les defaillances cryptographiques, les controles d'acces defaillants, les mauvaises configurations de securite et d'autres risques majeurs.

Quels outils open source utiliser pour auditer la securite d'une application web ?

Plusieurs outils open source permettent d'auditer la securite d'une application web selon l'OWASP Top 10 : OWASP ZAP (scanner de vulnerabilites web), SonarQube (analyse statique du code), Trivy (scan de conteneurs et dependances), OWASP Dependency-Check (detection de composants vulnerables), Nuclei (scanner de vulnerabilites base sur des templates), et Gitleaks (detection de secrets dans le code source).

Comment prevenir les injections SQL et XSS dans une application web open source ?

Pour prevenir les injections SQL, utilisez des requetes parametrees (prepared statements) ou un ORM comme Prisma, SQLAlchemy ou Sequelize. Pour prevenir les XSS, appliquez un encodage systematique des sorties HTML, utilisez des Content Security Policies (CSP) restrictives, et validez toutes les entrees utilisateur cote serveur. Les frameworks modernes comme React et Next.js integrent des protections XSS par defaut.

A quelle frequence faut-il auditer la securite d'une application web ?

Un audit de securite complet devrait etre realise au minimum une fois par trimestre, et un scan automatise devrait etre integre dans chaque pipeline CI/CD. Les dependances doivent etre verifiees quotidiennement avec des outils comme Dependabot ou Renovate. Un audit approfondi (pentest) est recommande une fois par an ou apres chaque changement majeur d'architecture. Le monitoring de securite doit fonctionner en continu 24/7.

Securisez vos applications avec D-Open

Besoin d'accompagnement pour mettre en place une strategie de securite conforme a l'OWASP Top 10 ? Nos ingenieurs en securite applicative vous guident de l'audit initial au monitoring continu.

Discutons de votre securite applicative

Articles similaires