Form : bouton tout supprimer + faille CSRF

This commit is contained in:
fredtempez 2019-01-26 10:59:29 +01:00
parent 0dcb72b151
commit ade8df4d6a
5 changed files with 109 additions and 32 deletions

View File

@ -3,17 +3,22 @@
## Préversion 9.0.0 ## Préversion 9.0.0
- Modification : - Modification :
- Stockage distinct du thème et des autres données (core, config, page, module et users ) avec import des données d'une version 8 - Stockage distinct du thème et des autres données (core, config, page, module et users ) avec import des données d'une version 8
- Exporter un thème (avec les images) sous forme d'une archive ZIP à télécharger ou stocker dans Fichiers. - gestion des thèmes :
- Importer un thème à partir des fichiers - Exporter un thème (avec les images) sous forme d'une archive ZIP à télécharger ou stocker dans Fichiers.
- Gabarits de pages : deux blocs (colonnes) à droite ou à gauche contenant des informations fixes, le paramétrage est dans le thème, mais les contenus sont stockés dans les pages. - Importer un thème à partir des fichiers
- Option de position fixe du menu type Facebook
- Gabarits de pages : deux barres latérales, une à droite ou à gauche contenant des informations fixes.
- Changement du libellé Modérateur devient Editeur - Changement du libellé Modérateur devient Editeur
- VisualBlocks dans TinyMCE - Editeur :
- CodeMirror dans TinyMCE - VisualBlocks dans TinyMCE
- Case à cocher dans les formulaires - CodeMirror dans TinyMCE
- Option de position fixe du menu type Facebook
- Mini barre pour les membres simples - Mini barre pour les membres simples
- Activation de la procédure d'update en ligne
- Update : affichage de la version proposée dans la popup de mise à jour - Update : affichage de la version proposée dans la popup de mise à jour
- Module Formulaire :
- Case à cocher dans les formulaires
- Bouton d'export au format CSV
- Bouton effacer toutes les données
- Correction faille CSRF
Correctif : Correctif :
- contrôle CSRF de la configuration du compte connecté - contrôle CSRF de la configuration du compte connecté
- Problème dans data/.htaccess - Problème dans data/.htaccess

View File

@ -20,6 +20,7 @@ class form extends common {
'config' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR,
'data' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR,
'delete' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR,
'deleteall' => self::GROUP_MODERATOR,
'index' => self::GROUP_VISITOR, 'index' => self::GROUP_VISITOR,
'export2csv' => self::GROUP_MODERATOR, 'export2csv' => self::GROUP_MODERATOR,
'output2csv' => self::GROUP_MODERATOR 'output2csv' => self::GROUP_MODERATOR
@ -126,7 +127,7 @@ class form extends common {
$content, $content,
template::button('formDataDelete' . $dataIds[$i], [ template::button('formDataDelete' . $dataIds[$i], [
'class' => 'formDataDelete buttonRed', 'class' => 'formDataDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i], 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $dataIds[$i] . '/' . $_SESSION['csrf'],
'value' => template::ico('cancel') 'value' => template::ico('cancel')
]) ])
]; ];
@ -145,33 +146,77 @@ class form extends common {
* @copyright Copyright (C) 2018-2019, Frédéric Tempez * @copyright Copyright (C) 2018-2019, Frédéric Tempez
*/ */
public function export2csv() { public function export2csv() {
$data = $this->getData(['module', $this->getUrl(0), 'data']); // Jeton incorrect
if ($data !== []) { if ($this->getUrl(3) !== $_SESSION['csrf']) {
$csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv';
if (!file_exists('site/file/source/data')) {
mkdir('site/file/source/data');
}
$fp = fopen('site/file/source/data/'.$csvfilename, 'w');
fputcsv($fp, array_keys($data[1]), ';','"');
foreach ($data as $fields) {
fputcsv($fp, $fields, ';','"');
}
fclose($fp);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => ' Export CSV effectué dans :<br />'.$csvfilename, 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data', 'notification' => 'Action non autorisée'
'state' => true
]); ]);
} else { } else {
$this->addOutput([ $data = $this->getData(['module', $this->getUrl(0), 'data']);
'notification' => 'Aucune donnée à exporter', if ($data !== []) {
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data' $csvfilename = 'data-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.csv';
]); if (!file_exists('site/file/source/data')) {
mkdir('site/file/source/data');
}
$fp = fopen('site/file/source/data/'.$csvfilename, 'w');
fputcsv($fp, array_keys($data[1]), ';','"');
foreach ($data as $fields) {
fputcsv($fp, $fields, ';','"');
}
fclose($fp);
// Valeurs en sortie
$this->addOutput([
'notification' => ' Export CSV effectué dans :<br />'.$csvfilename,
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data',
'state' => true
]);
} else {
$this->addOutput([
'notification' => 'Aucune donnée à exporter',
'redirect' => helper::baseUrl() . $this->getUrl(0) .'/data'
]);
}
} }
} }
/**
* Suppression
*/
public function deleteall() {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => 'Action non autorisée'
]);
} else {
$data = ($this->getData(['module', $this->getUrl(0), 'data']));
if (count($data) > 0 ) {
// Suppression multiple
for ($i = 1; $i <= count($data) ; $i++) {
$this->deleteData(['module', $this->getUrl(0), 'data', $i]);
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => 'Toutes les données ont été supprimées',
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => 'Aucune donnée à supprimer'
]);
}
}
}
/** /**
* Suppression * Suppression
*/ */
@ -183,6 +228,14 @@ class form extends common {
'access' => false 'access' => false
]); ]);
} }
// Jeton incorrect
elseif ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/data',
'notification' => 'Action non autorisée'
]);
}
// Suppression // Suppression
else { else {
$this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]); $this->deleteData(['module', $this->getUrl(0), 'data', $this->getUrl(2)]);
@ -195,6 +248,9 @@ class form extends common {
} }
} }
/** /**
* Accueil * Accueil
*/ */

View File

@ -18,4 +18,14 @@ $(".formDataDelete").on("click", function() {
return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() { return core.confirm("Êtes-vous sûr de vouloir supprimer cette donnée ?", function() {
$(location).attr("href", _this.attr("href")); $(location).attr("href", _this.attr("href"));
}); });
});
/**
* Confirmation de suppression de toutes les donénes
*/
$(".formDataDeleteAll").on("click", function() {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir supprimer toutes les données ?", function() {
$(location).attr("href", _this.attr("href"));
});
}); });

View File

@ -7,10 +7,18 @@
'value' => 'Retour' 'value' => 'Retour'
]); ?> ]); ?>
</div> </div>
<div class="col2 offset8"> <div class="col2 offset6">
<?php echo template::button('formDataDeleteAll', [
'class' => 'formDataDeleteAll buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'],
'ico' => 'cancel',
'value' => 'Tout effacer'
]); ?>
</div>
<div class="col2">
<?php echo template::button('formDataBack', [ <?php echo template::button('formDataBack', [
'class' => 'buttonBlue', 'class' => 'buttonBlue',
'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv', 'href' => helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'],
'ico' => 'download', 'ico' => 'download',
'value' => 'Export CSV' 'value' => 'Export CSV'
]); ?> ]); ?>

View File

@ -1,2 +0,0 @@
# fichier vide pour maintenir le répertoire sous Github