summaryrefslogtreecommitdiff
path: root/src/Security.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2025-08-03 04:06:53 +0200
committerpolo <ordipolo@gmx.fr>2025-08-03 04:06:53 +0200
commit90673ef19133e037cf401773f4262ba3d7d050bf (patch)
tree0b1a23427399a521747fab7a91a22fb2af4c5a19 /src/Security.php
parent547d7feed68e89957f062b8ed9b988f28c5830ce (diff)
downloadcms-90673ef19133e037cf401773f4262ba3d7d050bf.zip
réorganisation 4: déplacement de fichiers, plus que des contrôleurs dans /src/controller
Diffstat (limited to 'src/Security.php')
-rw-r--r--src/Security.php117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/Security.php b/src/Security.php
new file mode 100644
index 0000000..b2042fd
--- /dev/null
+++ b/src/Security.php
@@ -0,0 +1,117 @@
1<?php
2// src/Security.php
3//
4// htmlawed nettoie les entrées de l'utilisateur, en particulier le html de l'éditeur
5
6declare(strict_types=1);
7
8class Security
9{
10 private static $configHtmLawed = array(
11 'safe'=>1, // protection contre les élements et attributs dangereux
12
13 // liste blanche d'éléments HTML
14 'elements'=> 'h1, h2, h3, h4, h5, h6, p, br, s, em, span, strong, a, ul, ol, li, sup, sub, code, blockquote, div, pre, table, caption, colgroup, col, tbody, tr, th, td, figure, img, figcaption, iframe, small',
15
16 // liste noire d'attributs HTML
17 'deny_attribute'=> 'id, class' // on garde 'style'
18 );
19 // faire qu'un certain élément puisse n'avoir que certains attributs, regarder la doc
20 private static $specHtmLawed = '';
21
22 // ATTENTION, n'applique pas htmlspecialchars() !!
23 public static function secureString(string $chaine): string
24 {
25 return trim(htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed));
26 }
27
28 public static function secureFileName(string $chaine): string
29 {
30 // sécuriser un nom avec chemin avec basename?
31 //$chaine = basename($chaine);
32
33 /*
34 - caractères interdits sous windows / \ : * ? " < > |
35 - mac autorise les /
36 - mac interdit :
37 - linux autorise tout sauf les /
38 - imagemagick ne supporte pas les :
39
40 - 'espace' fonctionne
41 - / remplacé par firefox en :
42 - \ retire ce qui est devant le \
43 - * fonctionne
44 - ? permet le téléchargement mais pas l'affichage
45 - " ne fonctionne pas, remplacé par %22, filtrer %22
46 - < > fonctionnent
47 - | fonctionne
48 - = fonctionne, mais je filtre parce qu'on en trouve dans une URL
49 - ' ` fonctionnent
50 - % fonctionne
51 - (){}[] fonctionnent
52 - ^ fonctionne
53 - # ne fonctionne pas
54 - ~ fonctionne
55 - & fonctionne
56 - ^ pas encore testé
57 */
58
59 // => on remplace tout par des _
60 // filtrer / et \ semble inutile
61
62 /*$cibles = [' ', '/', '\\', ':', '*', '?', '<', '>', '|', '=', "'", '`', '"', '%22', '#'];
63 $chaine = str_replace($cibles, '_', $chaine); // nécéssite l'extension mbstring
64 $chaine = mb_strtolower($chaine);
65 return($chaine);*/
66
67 $chaine = preg_replace('/[^a-zA-Z0-9_-]/', '_', $chaine); // ne garder que les lettres, chiffres, tirets et underscores
68 $chaine = preg_replace('/_+/', '_', $chaine); // doublons d'underscores
69 return trim($chaine, '_');
70
71 // les problèmes avec \ persistent !!
72 // => javascript
73 // malheureusement document.getElementById('upload').files[0].name = chaine; ne marche pas! interdit!
74 // javascript ne doit pas pouvoir accéder au système de fichiers
75 // solutions:
76 // - au lieu de fournir une chaine (le chemin du fichier), donner un objet à files[0].name
77 // - créer une copie du fichier et l'envoyer à la place
78 // - envoyer le fichier en AJAX
79 // - envoyer le nom du fichier à part puis renommer en PHP
80 }
81}
82
83// erreurs à la création des mots de passe
84function removeSpacesTabsCRLF(string $chaine): string
85{
86 $cibles = [' ', "\t", "\n", "\r"]; // doubles quotes !!
87 return(str_replace($cibles, '', $chaine));
88}
89
90// lien sans http://
91function fixLinks($data)
92{
93 // 1/
94 // si une adresse est de type "domaine.fr" sans le http:// devant, le comportement des navigateurs est de rechercher un fichier comme si mon adresse commençait par file://
95 // tomber ainsi sur une page d'erreur est parfaitement déroutant
96
97 // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire
98 $pattern = '#(<a[^>]+href=")((?!https?://)[^>]+>)#';
99 //$data = preg_replace($pattern, '$1http://$2', $data);
100
101 // 2/
102 // cas où la regex fait mal son boulot:
103 // l'erreur 404 est gérée par le .htaccess
104 // et le visiteur est redirigé à la page "menu"
105 // (ça ne règle pas le problème mais c'est mieux)
106
107 // 3/
108 // quand l'éditeur est ouvert (avant de valider l'article),
109 // le lien qu'on vient de créer apparaît dans l'infobulle,
110 // cliquer dessus ouvre un onglet sur une erreur 404
111 // solution partielle avec le .htaccess
112 //
113 // solution? fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>';
114 // comment déclencher le JS? en faisant qu'une erreur 404 causée pour cette raison soit particulière?
115
116 return($data);
117}