diff --git a/README.md b/README.md
deleted file mode 100644
index e69de29..0000000
diff --git a/cms_simplifie/.env b/cms_simplifie/.env
new file mode 100644
index 0000000..f174621
--- /dev/null
+++ b/cms_simplifie/.env
@@ -0,0 +1,4 @@
+DB_HOST=db
+DB_NAME=cms_simplifie
+DB_USER=cms
+DB_PASS=cmspass
diff --git a/cms_simplifie/.htaccess b/cms_simplifie/.htaccess
new file mode 100644
index 0000000..957aeb4
--- /dev/null
+++ b/cms_simplifie/.htaccess
@@ -0,0 +1,63 @@
+# ===================================================================
+# Sécurité de base
+# ===================================================================
+ServerSignature Off
+Options -Indexes
+FileETag None
+AddDefaultCharset UTF-8
+
+
+
+
+# Bloque fichiers cachés (.env, .git, etc.) et configs/dev
+
+ Require all denied
+
+
+# Forcer une page 404 propre
+ErrorDocument 404 /page404.php
+
+# Empêche l'accès direct aux dossiers non publics
+RewriteEngine On
+RewriteRule ^inc/ - [F,L,NC]
+RewriteRule ^sql/ - [F,L,NC]
+
+
+# Méthodes HTTP autorisées (GET/POST/HEAD)
+
+ Require all denied
+
+
+
+
+ # Empêche le framing (clickjacking)
+ Header always set X-Frame-Options "SAMEORIGIN"
+
+ # Empêche le MIME sniffing
+ Header always set X-Content-Type-Options "nosniff"
+
+ # Politique du Referer
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+
+ # Permissions API (désactive tout par défaut)
+ Header always set Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), usb=(), interest-cohort=()"
+
+ # Politique de ressources cross-origin
+ Header always set Cross-Origin-Resource-Policy "same-origin"
+ Header always set Cross-Origin-Opener-Policy "same-origin"
+
+
+
+ # Content Security Policy (CSP)
+ # - autorise CSS en ligne
+ # - pas d'exec JS hormis le fichier local .js (je n'ai pas utilisé de code javascript donc le site ne devrait jamais utiliser de code js )
+ Header always set Content-Security-Policy "default-src 'self'; base-uri 'self'; frame-ancestors 'self'; object-src 'none'; img-src 'self' data:; font-src 'self' data:; style-src 'self' 'unsafe-inline'; script-src 'self'; connect-src 'self'"
+
+
+
+
+
+# Redirection sécurisé: racine -> /public
+RewriteCond %{REQUEST_URI} ^/$
+RewriteRule ^$ public/ [R=302,L]
+
diff --git a/cms_simplifie/Dockerfile b/cms_simplifie/Dockerfile
new file mode 100644
index 0000000..8be96a5
--- /dev/null
+++ b/cms_simplifie/Dockerfile
@@ -0,0 +1,7 @@
+FROM php:8.2-apache
+RUN docker-php-ext-install pdo pdo_mysql
+RUN a2enmod rewrite
+RUN apt-get update && apt-get install -y tzdata
+WORKDIR /var/www/html
+COPY . /var/www/html
+RUN chown -R www-data:www-data /var/www/html
diff --git a/cms_simplifie/README_DOCKER.md b/cms_simplifie/README_DOCKER.md
new file mode 100644
index 0000000..c824b07
--- /dev/null
+++ b/cms_simplifie/README_DOCKER.md
@@ -0,0 +1,19 @@
+# CMS Simplifié
+
+## Pour lancer
+
+docker compose up -d --build
+
+- Site : http://localhost:8080/public/index.php
+
+## Compte admin
+Identifiant :admin
+Mdp :VH515f6frrv11e651
+- meme le mot de passe de l'admin est haché
+
+## Notes
+- PHP + Apache + mysql avec requete preparer
+- Sécurité basique : CSRF sur POST, password_hash/verify, PDO préparé
+- Mise en place des sécurités pour eviter les attaques par XSS grace a la fonction e (échapper)
+- Uniquement le dossier public est exposé : mise en place des sécurité par le fichier .htaccess
+- Pas d'execution javascript en ligne ou insérer malicieusement. seul le code dans le fichier.js peut etre executer mais j'en ai pas donc le site ne devrait recevoir de code js
\ No newline at end of file
diff --git a/cms_simplifie/admin/articles_create.php b/cms_simplifie/admin/articles_create.php
new file mode 100644
index 0000000..854b200
--- /dev/null
+++ b/cms_simplifie/admin/articles_create.php
@@ -0,0 +1,76 @@
+prepare("INSERT INTO articles (user_id, titre, contenu, date_creation) VALUES (:uid, :titre, :contenu, NOW())");
+ $stmt->execute([
+ 'uid'=>current_user_id(), // ID de l'auteur connecté
+ 'titre'=>$titre,
+ 'contenu'=>$contenu
+ ]);
+
+ // Redirection vers le tableau de bord après publication
+ header('Location: /admin/dashboard.php');
+ exit;
+ }
+}
+
+// Inclusion du header
+require_once __DIR__ . '/../inc/header.php';
+?>
+
+
Écrire un article
+
+
+
+
+
+
= e($e) ?>
+
+
+
+
+
+
+
+
diff --git a/cms_simplifie/admin/articles_delete.php b/cms_simplifie/admin/articles_delete.php
new file mode 100644
index 0000000..1d7e009
--- /dev/null
+++ b/cms_simplifie/admin/articles_delete.php
@@ -0,0 +1,60 @@
+prepare("SELECT id, user_id, titre FROM articles WHERE id = :id");
+$stmt->execute(['id'=>$id]);
+$article = $stmt->fetch();
+if (!$article) { header('Location: /admin/dashboard.php'); exit; }
+
+// Contrôle d'autorisation : admin ou auteur du post
+if (!is_admin() && (int)$article['user_id'] !== current_user_id()) {
+ http_response_code(403); // interdit
+ echo "
Accès refusé.
";
+ exit;
+}
+
+// Traitement du formulaire de confirmation (méthode POST + CSRF)
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ verify_csrf(); // vérifie le jeton CSRF
+
+ // Si l'utilisateur confirme, on supprime l'article
+ if (isset($_POST['confirm']) && $_POST['confirm'] === 'yes') {
+ $del = $pdo->prepare("DELETE FROM articles WHERE id = :id");
+ $del->execute(['id'=>$id]);
+ }
+
+ // Retour au tableau de bord dans tous les cas
+ header('Location: /admin/dashboard.php');
+ exit;
+}
+
+// Affichage
+require_once __DIR__ . '/../inc/header.php';
+?>
+
+
+
+ query("
+ SELECT a.id, a.titre, a.date_creation, u.login AS auteur
+ FROM articles a
+ LEFT JOIN utilisateur u ON u.id = a.user_id
+ ORDER BY a.date_creation DESC
+ ");
+ } else {
+ $stmt = $pdo->prepare("
+ SELECT a.id, a.titre, a.date_creation, u.login AS auteur
+ FROM articles a
+ LEFT JOIN utilisateur u ON u.id = a.user_id
+ WHERE a.user_id = :uid
+ ORDER BY a.date_creation DESC
+ ");
+ $stmt->execute(['uid'=>current_user_id()]);
+ }
+
+ // Affiche chaque article dans une ligne du tableau (échappé pour éviter les attaques par xss)
+ foreach ($stmt as $row): ?>
+