From 71e367b86fd148109bb4524526f4450c6be64d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Mon, 27 Jul 2026 01:55:30 +0400 Subject: [PATCH] fix: block doc artifacts and add error templates --- .gitignore | 5 + 404.php.sample | 85 ++++++++++++++ 500.php.sample | 89 +++++++++++++++ conf/.htaccess.sample | 7 ++ conf/nginx.conf.sample | 10 ++ dons.php.sample | 34 +++--- tests/php/dons-sync-test.php | 208 +++++++++++++++++++++++++++++++++++ 7 files changed, 422 insertions(+), 16 deletions(-) create mode 100644 404.php.sample create mode 100644 500.php.sample create mode 100644 tests/php/dons-sync-test.php diff --git a/.gitignore b/.gitignore index 60ee5f2..1df5f7e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ robots.txt site.webmanifest mentions-legales.php dons.php +404.php +500.php # Fichiers de l'IDE/éditeur .vscode/ @@ -37,6 +39,9 @@ uploads/* # vendor/ # node_modules/ +# Rapport d'audit interne OKI (ne pas committer) +audit/ + # Artefacts de tests locaux .pytest_cache/ __pycache__/ diff --git a/404.php.sample b/404.php.sample new file mode 100644 index 0000000..5604c9c --- /dev/null +++ b/404.php.sample @@ -0,0 +1,85 @@ + + + + + + + + Page introuvable - <?php echo SITE_NAME; ?> + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +

Page introuvable

+

La page que vous recherchez n'existe pas, a été déplacée ou n'est pas disponible pour le moment.

+

+ Retour à l'accueil +

+
+
+
+ + + + + + + diff --git a/500.php.sample b/500.php.sample new file mode 100644 index 0000000..871a124 --- /dev/null +++ b/500.php.sample @@ -0,0 +1,89 @@ + + + + + + + + Erreur interne - <?php echo SITE_NAME; ?> + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ +

Une erreur est survenue

+

Le site rencontre un problème temporaire. L'incident a été consigné + et sera examiné par l'équipe technique. Merci de réessayer dans quelques instants.

+

+ Retour à l'accueil +

+
+
+
+ + + + + + + diff --git a/conf/.htaccess.sample b/conf/.htaccess.sample index a228ecc..9d8ebc0 100644 --- a/conf/.htaccess.sample +++ b/conf/.htaccess.sample @@ -22,6 +22,13 @@ RewriteRule ^(includes|cache|docs|conf)/ - [F,L] Require all denied +# Bloquer les artefacts de documentation à la racine web +# (DEPLOY.adoc/html/pdf, README.adoc…) : ils divulguent le plan +# d'infrastructure et ne doivent jamais être servis s'ils sont copiés +# sur l'hébergement. [^/]+ = fichiers à la racine uniquement, les +# éventuels .html légitimes en sous-répertoire restent servis. +RewriteRule ^[^/]+\.(adoc|html|pdf)$ - [F,L,NC] + # Empêcher l'exploration des répertoires Options -Indexes diff --git a/conf/nginx.conf.sample b/conf/nginx.conf.sample index 53e218f..3931ef8 100644 --- a/conf/nginx.conf.sample +++ b/conf/nginx.conf.sample @@ -40,6 +40,16 @@ server { return 404; } + # Bloquer les artefacts de documentation à la racine web + # (DEPLOY.adoc/html/pdf, README.adoc…) : ils divulguent le plan + # d'infrastructure et ne doivent jamais être servis s'ils sont copiés + # sur l'hébergement. [^/]+ = fichiers à la racine uniquement, les + # éventuels .html légitimes en sous-répertoire restent servis. + location ~* ^/[^/]+\.(adoc|html|pdf)$ { + deny all; + return 404; + } + # Bloquer l'accès aux fichiers cachés location ~ /\. { deny all; diff --git a/dons.php.sample b/dons.php.sample index 688a5fc..7167743 100644 --- a/dons.php.sample +++ b/dons.php.sample @@ -123,7 +123,7 @@ function linkUrlsInText(string $text): string { ?> - diff --git a/tests/php/dons-sync-test.php b/tests/php/dons-sync-test.php new file mode 100644 index 0000000..72672bc --- /dev/null +++ b/tests/php/dons-sync-test.php @@ -0,0 +1,208 @@ +https://example.com/dons', + $linked, + 'linkUrlsInText rend les URLs cliquables avec target et rel' +); + +assertEquals( + '<script>alert(1)</script>', + linkUrlsInText(''), + 'linkUrlsInText échappe le HTML injecté dans le texte' +); + +assertContains( + 'href="https://example.com/?a=1&b=2"', + linkUrlsInText('Lien : https://example.com/?a=1&b=2'), + 'linkUrlsInText échappe les & dans l\'URL du lien' +); + +// --- Gabarits d'erreur 404.php.sample / 500.php.sample (ARC-7) --------------- + +foreach (['404' => '404.php.sample', '500' => '500.php.sample'] as $code => $file) { + $path = $root . '/' . $file; + assertTrue(file_exists($path), "$file existe"); + $template = file_get_contents($path); + + assertContains( + "http_response_code($code)", + $template, + "$file positionne le code HTTP $code" + ); + assertContains( + 'noindex', + $template, + "$file demande la non-indexation (robots noindex)" + ); + assertNotContains( + 'style="', + $template, + "$file n'utilise pas d'attribut style inline (bloqué par la CSP)" + ); + + // Tout