summaryrefslogtreecommitdiff
path: root/controller/Security.php
blob: 39205c1f5988d3a702f119a4c485c53d752cc679 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
// controller/Security.php

// sécurité faille XSS avec htmLawed
require('lib/htmlawed/htmLawed.php');

class Security
{
	private static $configHtmLawed = array(
	    'safe'=>1, // protection contre les élements et attributs dangereux
	    'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
	    'deny_attribute'=>'id', // gêner le JS hostile
	    // on garde 'class' et 'style' utilisés par le ckediteur
	);
	private static $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs

	public static function secureString(string $chaine): string
	{
		$chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed);
	    $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
	    return $chaine;
	}
}

// erreurs à la création des mots de passe
function removeSpacesTabsCRLF(string $chaine): string
{
	$cibles = [' ', "\t", "\n", "\r"]; // doubles quotes !!
	return(str_replace($cibles, '', $chaine));
}

// lien sans http://
function fixLinks($data)
{
    // 1/
    // 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://
    // tomber ainsi sur une page d'erreur est parfaitement déroutant

    // regex pour détecter les balises <a> et ajouter http:// au début des liens si nécessaire
    $pattern = '#(<a[^>]+href=")((?!https?://)[^>]+>)#';
	//$data = preg_replace($pattern, '$1http://$2', $data);

    // 2/
    // cas où la regex fait mal son boulot:
    // l'erreur 404 est gérée par le .htaccess
    // et le visiteur est redirigé à la page "menu"
    // (ça ne règle pas le problème mais c'est mieux)

    // 3/
    // quand l'éditeur est ouvert (avant de valider l'article),
    // le lien qu'on vient de créer apparaît dans l'infobulle,
    // cliquer dessus ouvre un onglet sur une erreur 404
    // solution partielle avec le .htaccess
    //
    // solution? fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>';
    // comment déclencher le JS? en faisant qu'une erreur 404 causée pour cette raison soit particulière?

    return($data);
}