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