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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
<?php
// controller/ckeditor.php
//
// c'est la partie PHP du ckeditor
// l'autre partie est le fichier view/template-ckeditor.php
// qui est inséré par la vue de la page correspondante
// il y a aussi un fichier CSS parce que le HTML créé par l'éditeur ne suffit pas à lui-même
// avant de placer l'éditeur
function preparationCKeditor($numArticle, $texte)
{
// ici $numArticle sert uniquement à savoir si on crée ou modifie un article
// texte initial inséré avec setData() dans l'éditeur,
// on recherche ici les causes expliquant qu'il n'apparaisse pas à l'ouverture de l'éditeur,
// les données précédentes sont écrasées à la validation du nouveau texte
if ($numArticle > 0)
{
if(empty($texte))
{
header('Location: index.php?erreur=empty_input');
}
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
$texte = trim($texte);
// supprimer les sauts de ligne
$sautsDeLigne = array("\n", "\r", "\r\n");
$texte = str_replace($sautsDeLigne, '', $texte);
// échapper tous les ', ", \ et caractère NULL
$texte = addslashes($texte);
}
else
{
$texte = ''; // nouveau contenu
}
return($texte);
}
// réception du HTML créé par l'éditeur
// le nom du fichier est celui dans $_SESSION['nomFichier']
function submitCKeditor($nomFichier)
{
$page = $_GET['page'];
$contenu = $_POST['contenu'];
// déjà fait mais on ne sait jamais
if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1)
{
header('Location: index.php?page=' . $page . '&erreur=connexion');
}
else
{
// récupérer les liens multimedia
//require("media.php");
//$contenu = mediaSubmit($contenu);
// sécurité faille XSS
$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
);
$specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
}
if($page == 'discographie')
{
$titre = $_POST['titre'];
$annee = $_POST['annee'];
$pochette = $_POST['pochette']; // une image
// des formulaires simples
$titre = htmLawed($titre, $configHtmLawed, $specHtmLawed);
$titre = trim($titre);
$annee = htmLawed($annee, $configHtmLawed, $specHtmLawed);
$annee = trim($annee);
// pochette
// Album->imageUpload();
// test formats jpg, jpeg, png, gif, tiff
// enregistrement du fichier
// du ckeditor
$contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
$contenu = trim($contenu);
}
else // pages comme "melaine"
{
// ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !!
if($contenu == '')
{
header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
}
else
{
// failles XSS
$contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
$contenu = trim($contenu);
}
}
// lien sans http://
// un clic sur un lien dans l'éditeur affiche une infobulle montrant l'adresse cible du lien si celle-ci a déjà été précisée
// il est possible de cliquer sur ce lien, ce qui ouvre un onglet avec le site demandé
// toutefois si cette adresse est de type "domaine.fr" (sans http:// devant), le navigateur ne va pas rechercher un site mais un fichier comme si mon adresse était de type file:///fichier
// tomber ainsi sur une page d'erreur est déroutant:
// "ai-je perdu le texte que j'étais en train de taper?""
// solution 1 (mauvaise): activer la redirection en cas d'erreur 404 dans le .htaccess
// solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>';
// pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert...
//var_dump($titre, $annee, $pochette, $contenu);
//die();
// modèle
$Article = new ArticlesManager;
$Article->setPage($page);
// enregistrement
if($_GET['article'] == 0)
{
$Article->create($contenu);
}
else
{
$Article->setFileName($nomFichier);
$Article->update($contenu);
}
if($page == 'discographie')
{
$Album = new AlbumsManager;
var_dump($_POST);
echo('<br />');
//var_dump($_GET['article']);
// enregistrement
if($_GET['article'] == 0)
{
// ERREUR, il faut le même nombre de paramètre pour une méthode du même nom
$Album->create($titre, $annee, $pochette);
}
else
{
$Album->update($titre, $annee, $pochette);
}
die();
}
}
|