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