summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2022-02-18 05:38:40 +0100
committerpolo <ordipolo@gmx.fr>2022-02-18 05:38:40 +0100
commit9a1fb624fd1089087bd363551ba64f5862d9919f (patch)
tree87f33f1b1bede404efa2cfd8f4285d32e149d986
parentf2c1f219dcd6e25b812d4dbed46f4c0c30541d83 (diff)
downloadmelaine-9a1fb624fd1089087bd363551ba64f5862d9919f.zip
miniatures GD
-rw-r--r--config.php8
-rw-r--r--controller/admin.php8
-rw-r--r--controller/ckeditor.php22
-rw-r--r--controller/installation.php9
-rw-r--r--controller/visitor.php10
-rw-r--r--index.php24
-rw-r--r--model/Album.php21
-rw-r--r--model/Image.php62
-rw-r--r--view/discographie.php6
-rw-r--r--à faire après livraison.txt (renamed from à faire après livraison)13
-rw-r--r--à faire avant livraison.txt4
11 files changed, 129 insertions, 58 deletions
diff --git a/config.php b/config.php
new file mode 100644
index 0000000..80607e1
--- /dev/null
+++ b/config.php
@@ -0,0 +1,8 @@
1<?php
2// bibliothèque utilisée pour créer les miniatures
3// écrire 'gd' ou 'imagick'
4$imageLibrary = 'gd';
5
6// mode de stockage des données
7// écrire 'files' ou 'database'
8$storage = 'files';
diff --git a/controller/admin.php b/controller/admin.php
index 7f22711..370426b 100644
--- a/controller/admin.php
+++ b/controller/admin.php
@@ -81,11 +81,13 @@ function discoEdit($fileCode, $suppression)
81 // modèle 81 // modèle
82 $Albums = new Album($page_actuelle); 82 $Albums = new Album($page_actuelle);
83 $Albums->makeFileList(); 83 $Albums->makeFileList();
84 //var_dump($Albums); 84
85 // contenu: JSON, HTML, noms et chemins des fichiers 85 // contenu: JSON, HTML, noms et chemins des fichiers
86 $Albums->readAll(); 86 $Albums->readAll();
87 $Albums->fileList = array_reverse($Albums->fileList); 87 if(!empty($Albums->fileList))
88 //var_dump($Albums); 88 {
89 $Albums->fileList = array_reverse($Albums->fileList);
90 }
89 //var_dump($Albums->fileList); 91 //var_dump($Albums->fileList);
90 92
91 // nouvel album 93 // nouvel album
diff --git a/controller/ckeditor.php b/controller/ckeditor.php
index 7102f33..5313c3b 100644
--- a/controller/ckeditor.php
+++ b/controller/ckeditor.php
@@ -89,13 +89,24 @@ function submitCKeditor()
89 89
90 $nouveauTitre = Security::secureString($_POST['titre']); 90 $nouveauTitre = Security::secureString($_POST['titre']);
91 $nouvelleAnnee = Security::secureString($_POST['annee']); 91 $nouvelleAnnee = Security::secureString($_POST['annee']);
92 $nouvellePochette = $_FILES['upload']['name']; 92 if(!empty($_FILES['upload']['name']))
93 {
94 $nouvellePochette = $_FILES['upload']['name'];
95 $nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
96 }
97 else
98 {
99 $nouvellePochette = '';
100 $nouvellePochetteMini = '';
101 }
102
103 //var_dump($nouvellePochetteMini); die();
93 104
94 // enregistrement nouvel album 105 // enregistrement nouvel album
95 if(!isset($_SESSION['target']) || $_SESSION['target'] == '') 106 if(!isset($_SESSION['target']) || $_SESSION['target'] == '')
96 { 107 {
97 // page disco 108 // page disco
98 $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette); 109 $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini);
99 110
100 // page de l'album 111 // page de l'album
101 if(!empty($_POST['contenu'])) 112 if(!empty($_POST['contenu']))
@@ -114,12 +125,13 @@ function submitCKeditor()
114 125
115 // garder l'image si aucune n'est sélectionnée 126 // garder l'image si aucune n'est sélectionnée
116 // (on ne peut pas préremplir un <input type="file">) 127 // (on ne peut pas préremplir un <input type="file">)
117 if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '') 128 /*if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '')
118 { 129 {
119 $nouvellePochette = $Album->oneAlbum['pochette']; 130 $nouvellePochette = $Album->oneAlbum['pochette'];
120 } 131 $nouvellePochetteMini = $Album->oneAlbum['pochetteMini'];
132 }*/
121 133
122 $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette); 134 $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini);
123 135
124 // page de l'album 136 // page de l'album
125 if(isset($_POST['contenu'])) 137 if(isset($_POST['contenu']))
diff --git a/controller/installation.php b/controller/installation.php
index 91521e2..9d612dd 100644
--- a/controller/installation.php
+++ b/controller/installation.php
@@ -24,7 +24,7 @@ function installation()
24 // créer le .htaccess 24 // créer le .htaccess
25 if(!file_exists(".htaccess")) 25 if(!file_exists(".htaccess"))
26 { 26 {
27 echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.</p>'); 27 echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable, veuillez contacter l\'administrateur.</p>');
28 //$contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; 28 //$contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes";
29 // $fichier = fopen('.htaccess', 'w'); 29 // $fichier = fopen('.htaccess', 'w');
30 // fputs($fichier, $contenu); 30 // fputs($fichier, $contenu);
@@ -75,12 +75,17 @@ function installation()
75 // chmod('data/' . $page . '/multimedia', 0777); 75 // chmod('data/' . $page . '/multimedia', 0777);
76 // } 76 // }
77 } 77 }
78 // dossier supplémentaire dans discographie 78 // dossiers supplémentaires dans discographie
79 if(!file_exists('data/discographie/json')) 79 if(!file_exists('data/discographie/json'))
80 { 80 {
81 mkdir('data/discographie/json'); 81 mkdir('data/discographie/json');
82 chmod('data/discographie/json', $droitsDossiers); 82 chmod('data/discographie/json', $droitsDossiers);
83 } 83 }
84 if(!file_exists('data/discographie/images-mini'))
85 {
86 mkdir('data/discographie/images-mini');
87 chmod('data/discographie/images-mini', $droitsDossiers);
88 }
84 // fichier password.txt 89 // fichier password.txt
85 if(!file_exists('data/password.txt')) 90 if(!file_exists('data/password.txt'))
86 { 91 {
diff --git a/controller/visitor.php b/controller/visitor.php
index fccc287..2656798 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -70,7 +70,6 @@ function discoVisitor()
70 //var_dump($Albums->fileList); die(); 70 //var_dump($Albums->fileList); die();
71 71
72 72
73
74 // tri des albums avec l'année dans le .json 73 // tri des albums avec l'année dans le .json
75 74
76 // noms des fichiers JSON 75 // noms des fichiers JSON
@@ -78,20 +77,13 @@ function discoVisitor()
78 77
79 //$annees = []; 78 //$annees = [];
80 for($i = 0; $i < $Albums->fileListCount; $i++) 79 for($i = 0; $i < $Albums->fileListCount; $i++)
81 { 80 {}
82 // une case supplémentaire contient le "fileCode"
83 //$albumsJSON[$i][3] = pathinfo($albumNamesJSON[$i])['filename'];
84 //$albumsJSON[$i][3] = pathinfo($Albums->fileList[$i]['fileCode'])['filename'];
85
86 //$annees[$i] = $albumsJSON[$i][1];
87 }
88 //var_dump($annee); die(); 81 //var_dump($annee); die();
89 82
90 // tri d'un tableau multidimensionnel 83 // tri d'un tableau multidimensionnel
91 //array_multisort($annees, $albumsJSON); 84 //array_multisort($annees, $albumsJSON);
92 85
93 86
94
95 // lien vers le HTML ou ancre? 87 // lien vers le HTML ou ancre?
96 /*$lienAlbum = []; 88 /*$lienAlbum = [];
97 $avecLien = []; 89 $avecLien = [];
diff --git a/index.php b/index.php
index 70ca884..5733e8e 100644
--- a/index.php
+++ b/index.php
@@ -4,14 +4,6 @@
4// routeur MVC ou controlleur principal 4// routeur MVC ou controlleur principal
5// il traite les GET et passe la main aux contrôleurs 5// il traite les GET et passe la main aux contrôleurs
6 6
7
8// sessions, penser aux attaques CSRF (cross-site request forgery):
9// ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable
10// - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript
11// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant
12// - il y a la méthode des jetons, "nonces" et horodatage
13// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête
14// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
15session_start(); 7session_start();
16 8
17if(!empty($_SESSION['erreur'])) 9if(!empty($_SESSION['erreur']))
@@ -26,6 +18,12 @@ require('controller/installation.php');
26require('controller/password.php'); 18require('controller/password.php');
27installation(); 19installation();
28 20
21// config par défaut
22$imageLibrary = 'gd'; // 'gd' ou 'imagick'
23$storage = 'files'; // 'files' ou 'database'
24// config perso
25include('config.php');
26
29 27
30// traitement des requêtes AJAX 28// traitement des requêtes AJAX
31if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') 29if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image')
@@ -66,16 +64,6 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
66 } 64 }
67 65
68 submitCKeditor(); 66 submitCKeditor();
69 // modification
70 /*if(isset($_SESSION['target']))
71 {
72 submitCKeditor($_SESSION['target']);
73 }
74 // nouvel article
75 else
76 {
77 submitCKeditor(''); // $target = ''
78 }*/
79} 67}
80else 68else
81{ 69{
diff --git a/model/Album.php b/model/Album.php
index 386a50f..e716a99 100644
--- a/model/Album.php
+++ b/model/Album.php
@@ -21,7 +21,7 @@ class Album extends Article
21 // fonctions CRUD 21 // fonctions CRUD
22 22
23 // create 23 // create
24 public function createVignette($titre, $annee, $pochette) 24 public function createVignette($titre, $annee, $pochette, $pochetteMini)
25 { 25 {
26 //$this->format = 'json'; 26 //$this->format = 'json';
27 27
@@ -33,6 +33,7 @@ class Album extends Article
33 require('model/Image.php'); 33 require('model/Image.php');
34 $Image = new Image(false); 34 $Image = new Image(false);
35 $Image->upload(); 35 $Image->upload();
36 $Image->makeThumbnail();
36 37
37 $erreur = $Image->erreur; 38 $erreur = $Image->erreur;
38 if(!empty($erreur)) 39 if(!empty($erreur))
@@ -40,7 +41,7 @@ class Album extends Article
40 } 41 }
41 42
42 // encodage avec un tableau simple 43 // encodage avec un tableau simple
43 $albumJSON = json_encode([$titre, $annee, $pochette]); 44 $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]);
44 //var_dump($albumJSON); die(); 45 //var_dump($albumJSON); die();
45 46
46 // encodage avec un tableau associatif 47 // encodage avec un tableau associatif
@@ -66,15 +67,13 @@ class Album extends Article
66 for($i = 0; $i < $this->fileListCount; $i++) 67 for($i = 0; $i < $this->fileListCount; $i++)
67 { 68 {
68 // ajout du JSON 69 // ajout du JSON
69 /*$content = file_get_contents($this->fileList[$i]['fileName']);
70 $content = json_decode($content, true);*/
71 $content = json_decode($this->fileList[$i]['content'], true); 70 $content = json_decode($this->fileList[$i]['content'], true);
72 //var_dump($content); die();
73 71
74 // lecture de $content étant un tableau simple 72 // lecture de $content étant un tableau simple
75 $this->fileList[$i]['titre'] = $content[0]; 73 $this->fileList[$i]['titre'] = $content[0];
76 $this->fileList[$i]['annee'] = $content[1]; 74 $this->fileList[$i]['annee'] = $content[1];
77 $this->fileList[$i]['pochette'] = $content[2]; 75 $this->fileList[$i]['pochette'] = $content[2];
76 $this->fileList[$i]['pochetteMini'] = $content[3];
78 77
79 // ajout du HTML si il existe 78 // ajout du HTML si il existe
80 if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format)) 79 if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format))
@@ -107,6 +106,7 @@ class Album extends Article
107 $this->oneAlbum['titre'] = $content[0]; 106 $this->oneAlbum['titre'] = $content[0];
108 $this->oneAlbum['annee'] = $content[1]; 107 $this->oneAlbum['annee'] = $content[1];
109 $this->oneAlbum['pochette'] = $content[2]; 108 $this->oneAlbum['pochette'] = $content[2];
109 $this->oneAlbum['pochetteMini'] = $content[3];
110 110
111 // html 111 // html
112 $this->format = 'html'; 112 $this->format = 'html';
@@ -138,14 +138,18 @@ class Album extends Article
138 } 138 }
139 139
140 // update 140 // update
141 public function updateVignetteJSON($titre, $annee, $pochette) 141 public function updateVignetteJSON($titre, $annee, $pochette, $pochetteMini)
142 { 142 {
143 // garder l'ancienne image 143 // garder l'image si aucune n'est sélectionnée
144 // (on ne peut pas préremplir un <input type="file">)
144 $albumJSON = self::getVignetteJSON(); 145 $albumJSON = self::getVignetteJSON();
146 /*var_dump($pochette); var_dump($pochetteMini);
147 var_dump($albumJSON); die();*/
145 148
146 if($pochette == '') 149 if($pochette == '')
147 { 150 {
148 $pochette = $albumJSON[2]; 151 $pochette = $albumJSON[2];
152 $pochetteMini = $albumJSON[3];
149 } 153 }
150 else 154 else
151 { 155 {
@@ -153,6 +157,7 @@ class Album extends Article
153 require('model/Image.php'); 157 require('model/Image.php');
154 $Image = new Image(false); 158 $Image = new Image(false);
155 $Image->upload(); 159 $Image->upload();
160 $Image->makeThumbnail();
156 $erreur = $Image->erreur; 161 $erreur = $Image->erreur;
157 if(!empty($erreur)) 162 if(!empty($erreur))
158 { 163 {
@@ -161,7 +166,7 @@ class Album extends Article
161 } 166 }
162 } 167 }
163 168
164 $albumJSON = json_encode([$titre, $annee, $pochette]); 169 $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]);
165 170
166 // écriture 171 // écriture
167 $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json'; 172 $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json';
diff --git a/model/Image.php b/model/Image.php
index 8ebcd16..c305984 100644
--- a/model/Image.php
+++ b/model/Image.php
@@ -5,7 +5,10 @@ class Image
5{ 5{
6 private const MAX_WEIGHT = 2000000; // à adapter au php.ini 6 private const MAX_WEIGHT = 2000000; // à adapter au php.ini
7 private $page; 7 private $page;
8 private $ajax = false; // vaut true avec le ckeditor 8 private $ajax; // vaut true avec le ckeditor
9 public $path;
10 public $pathMini;
11 public $pathInfos;
9 public $erreur; 12 public $erreur;
10 13
11 public function __construct($ajax) 14 public function __construct($ajax)
@@ -13,14 +16,14 @@ class Image
13 // get envoyé avec le javascript 16 // get envoyé avec le javascript
14 $this->page = $_GET['page']; 17 $this->page = $_GET['page'];
15 $this->ajax = $ajax; 18 $this->ajax = $ajax;
19 $this->path = 'data/' . $this->page . '/images/';
20 $this->pathMini = 'data/' . $this->page . '/images-mini/';
16 } 21 }
17 22
18 // GET 23 // GET
19 24
20 // SET 25 // SET
21 26
22 // miniatures des photos
23
24 public function upload() 27 public function upload()
25 { 28 {
26 // traitement et enregistrement de l'image 29 // traitement et enregistrement de l'image
@@ -28,14 +31,14 @@ class Image
28 { 31 {
29 if ($_FILES['upload']['size'] <= self::MAX_WEIGHT) 32 if ($_FILES['upload']['size'] <= self::MAX_WEIGHT)
30 { 33 {
31 $infos = pathinfo($_FILES['upload']['name']); 34 $this->pathInfos = pathinfo($_FILES['upload']['name']);
32 $extension = $infos['extension']; 35 $extension = $this->pathInfos['extension'];
33 $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff'); 36 $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff');
34 // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur) 37 // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur)
35 if (in_array($extension, $extautorisées)) 38 if (in_array($extension, $extautorisées))
36 { 39 {
37 move_uploaded_file($_FILES['upload']['tmp_name'], 'data/' . $this->page . '/images/' . $_FILES['upload']['name']); 40 move_uploaded_file($_FILES['upload']['tmp_name'], $this->path . $_FILES['upload']['name']);
38 chmod('data/' . $this->page . '/images/' . $_FILES['upload']['name'], 0666); 41 chmod($this->path . $_FILES['upload']['name'], 0666);
39 } 42 }
40 else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';} 43 else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';}
41 } 44 }
@@ -57,4 +60,49 @@ class Image
57 echo $chemin; 60 echo $chemin;
58 } 61 }
59 } 62 }
63
64 // miniatures des photos
65 public function makeThumbnail()
66 {
67 if($imageLibrary == 'gd')
68 {
69 // des infos sur GD
70 //print_r(gd_info());
71
72 // cette fonction fonctionne pour tous les formats
73 $source = imagecreatefromstring(file_get_contents($this->path . $_FILES['upload']['name']));
74 var_dump($source);
75
76 $nomMiniImage = $this->pathMini . $this->pathInfos['filename'] . '-mini.jpg';
77 var_dump($nomMiniImage);
78
79 //var_dump($nomMiniImage);
80 //var_dump(imagesx($image));
81
82 $forme = imagesy($source) / imagesx($source);
83 var_dump($forme);
84
85 if(imagesx($source) > 201)
86 {
87 // créer un rectangle noir
88 $destination = imagecreatetruecolor(201, 201 * $forme);
89 var_dump($destination);
90
91 // sélectionne un rectangle dans l'image source
92 // et le place dans un rectangle dans la nouvelle
93 imagecopyresampled($destination, $source, 0, 0, 0, 0, 201, 201 * $forme, imagesx($source), imagesy($source));
94
95 // envoie l'image dans un fichier
96 imagejpeg($destination, $nomMiniImage);
97 }
98 else
99 {
100 imagejpeg($source, $nomMiniImage);
101 }
102 }
103 elseif($imageLibrary == 'imagick')
104 {}
105 else
106 {}
107 }
60} \ No newline at end of file 108} \ No newline at end of file
diff --git a/view/discographie.php b/view/discographie.php
index 6d56854..f330a8d 100644
--- a/view/discographie.php
+++ b/view/discographie.php
@@ -51,7 +51,6 @@ ob_start();
51<?php 51<?php
52//for($i = $Albums->fileListCount - 1; $i >= 0; $i--) 52//for($i = $Albums->fileListCount - 1; $i >= 0; $i--)
53for($i = 0; $i < $Albums->fileListCount; $i++) 53for($i = 0; $i < $Albums->fileListCount; $i++)
54//foreach($albumsJSON as $oneAlbum)
55{ 54{
56 // menu dessous la mouette 55 // menu dessous la mouette
57 // comporte un lien si fichier html existe, sinon une ancre 56 // comporte un lien si fichier html existe, sinon une ancre
@@ -73,8 +72,9 @@ if($_SESSION['admin'] == 1)
73 $style = 'class="articleAvecEditeur"'; 72 $style = 'class="articleAvecEditeur"';
74?> 73?>
75 <article <?= $style ?>> 74 <article <?= $style ?>>
76 <h3>Ajouter un album</h3> 75 <h3>Ajouter un album</h3>
77<?= $editeurHTML ?> 76<?= $editeurHTML ?>
77 </article>
78<?php 78<?php
79 } 79 }
80 else 80 else
@@ -87,11 +87,11 @@ if($_SESSION['admin'] == 1)
87 Nouvel album 87 Nouvel album
88 </a> 88 </a>
89 </p> 89 </p>
90 </article>
90<?php 91<?php
91 } 92 }
92} 93}
93?> 94?>
94 </article>
95 <div id="articles"> 95 <div id="articles">
96<?php 96<?php
97 97
diff --git a/à faire après livraison b/à faire après livraison.txt
index aeaab1d..db20759 100644
--- a/à faire après livraison
+++ b/à faire après livraison.txt
@@ -1,6 +1,9 @@
1Le reste du site 1Le reste du site
2 2
3Miniatures avec imagemagick en alternative de GD 3Miniatures avec imagemagick
4
5possibilité de regarder une image en grand dans une fenêtre javascript
6OU au moins dans une "page" dotée d'un bouton pur sortir (avec GD? avec imagemagick?)
4 7
5 8
6Protection contre les falsifications de requête inter-site - CSRF 9Protection contre les falsifications de requête inter-site - CSRF
@@ -23,6 +26,14 @@ Si vous n’utilisez pas un framework qui gère la protection CSRF pour vous, je
23 26
24une bibli qui fait ça: https://github.com/paragonie/anti-csrf 27une bibli qui fait ça: https://github.com/paragonie/anti-csrf
25 28
29"sessions, penser aux attaques CSRF (cross-site request forgery):
30ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable
31- solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript
32- on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant
33- il y a la méthode des jetons, "nonces" et horodatage
34- vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête"
35infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
36
26 37
27Upload de musique/vidéo 38Upload de musique/vidéo
28Ajout de liens youtube, spotify, etc 39Ajout de liens youtube, spotify, etc
diff --git a/à faire avant livraison.txt b/à faire avant livraison.txt
index b785efb..b852baf 100644
--- a/à faire avant livraison.txt
+++ b/à faire avant livraison.txt
@@ -1,9 +1,9 @@
1Miniatures avec php-gd
2
3tri des albums selon l'année 1tri des albums selon l'année
4(avec des plages de timestamps?) 2(avec des plages de timestamps?)
5 3
6Identification avec deux codes (login + mot de passe) 4Identification avec deux codes (login + mot de passe)
7 5
6fichier backup.php -> mettre le html à part
7
8Sauvegarde des données !! 8Sauvegarde des données !!
9 9