From 0ad85125a52a01dbce5d8cb4a02730872e403906 Mon Sep 17 00:00:00 2001 From: polo Date: Mon, 5 Jan 2026 22:40:48 +0100 Subject: =?UTF-8?q?s=C3=A9curisation=20du=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/index.php | 88 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 37 deletions(-) (limited to 'public') diff --git a/public/index.php b/public/index.php index f46b384..c81728a 100644 --- a/public/index.php +++ b/public/index.php @@ -271,8 +271,12 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ function openEditor(article_id){ // Récupérer et sauvegarder le contenu d'origine de l'article - const articleContent = document.getElementById(article_id).innerHTML; - document.getElementById(article_id).setAttribute('data-original-content', articleContent); + const element = document.getElementById(article_id); + if (!element) { + return; + } + const articleContent = element.innerHTML; + element.setAttribute('data-original-content', articleContent); tinymce.init({ selector: `#${article_id}`, @@ -306,12 +310,11 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ }); let skipPastePreProcess = false; editor.on('Paste', function (e){ // déclenchement AVANT PastePreProcess et quelque que soit le contenu collé - const clipboardData = (e.clipboardData || e.originalEvent.clipboardData); - if(!clipboardData){ + if (!e.clipboardData) { // e.clipboardData: DataTransfer return; } - const items = clipboardData.items; // base64 - const files = clipboardData.files; // explorateur de fichiers + const items = e.clipboardData.items; // base64 + const files = e.clipboardData.files; // explorateur de fichiers let found_file = false; // données dans files @@ -319,7 +322,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ for(let i = 0; i < files.length; i++){ let file = files[i]; - if(extensions_white_list.includes(file.name.split('.').pop().toLowerCase())){ + if(extensions_white_list.includes(file.name.split('.').pop()?.toLowerCase() || '')){ found_file = true; uploadDocument(file, editor); } @@ -337,7 +340,12 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ if(item.type.indexOf('image') !== -1){ // test type MIME contenant image found_file = true; const file = item.getAsFile(); // presse-papier => fichier lisible - uploadImageBase64(file, editor); + if(file){ + uploadImageBase64(file, editor); + } + else{ + console.error('fichier invalide'); + } } } } @@ -406,7 +414,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ let has_documents = false; for(let i = 0; i < files.length; i++){ - if(extensions_white_list.includes(files[i].name.split('.').pop().toLowerCase())){ + if(extensions_white_list.includes(files[i].name.split('.').pop()?.toLowerCase() || '')){ has_documents = true; break; } @@ -419,7 +427,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ for(let i = 0; i < files.length; i++){ let file = files[i]; - if(extensions_white_list.includes(file.name.split('.').pop().toLowerCase())){ + if(extensions_white_list.includes(file.name.split('.').pop()?.toLowerCase() || '')){ uploadDocument(file, editor); } else if(file.type.indexOf('image') !== -1){ @@ -435,25 +443,25 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ // upload de documents avec le bouton "insérer un lien" files_upload_handler: files_upload_handler, // = fonction fléchée documents_file_types: [ // files_upload_handler a besoin qu'on lui donne tous les types mime - { mimeType: 'application/pdf', extensions: [ 'pdf' ] }, + { mimeType: 'application/pdf', extensions: [ 'pdf' ] }, { mimeType: 'application/rtf', extensions: [ 'rtf' ] }, - { mimeType: 'application/msword', extensions: [ 'doc' ] }, - { mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extensions: [ 'docx' ] }, - { mimeType: 'application/vnd.ms-excel', extensions: [ 'xls' ] }, - { mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extensions: [ 'xlsx' ] }, - { mimeType: 'application/vnd.ms-powerpoint', extensions: [ 'ppt' ] }, - { mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extensions: [ 'pptx' ] }, - { mimeType: 'application/vnd.oasis.opendocument.text', extensions: [ 'odt' ] }, - { mimeType: 'application/vnd.oasis.opendocument.spreadsheet', extensions: [ 'ods' ] }, - { mimeType: 'application/vnd.oasis.opendocument.presentation', extensions: [ 'odp' ] } - ], + { mimeType: 'application/msword', extensions: [ 'doc' ] }, + { mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extensions: [ 'docx' ] }, + { mimeType: 'application/vnd.ms-excel', extensions: [ 'xls' ] }, + { mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extensions: [ 'xlsx' ] }, + { mimeType: 'application/vnd.ms-powerpoint', extensions: [ 'ppt' ] }, + { mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extensions: [ 'pptx' ] }, + { mimeType: 'application/vnd.oasis.opendocument.text', extensions: [ 'odt' ] }, + { mimeType: 'application/vnd.oasis.opendocument.spreadsheet', extensions: [ 'ods' ] }, + { mimeType: 'application/vnd.oasis.opendocument.presentation', extensions: [ 'odp' ] } + ], image_caption: true }); // Remplacer le contenu de l'article par l'éditeur - document.getElementById(article_id).innerHTML = articleContent; + element.innerHTML = articleContent; } - + const images_upload_handler = (blobInfo, progress) => new Promise((resolve, reject) => { const formData = new FormData(); formData.append("file", blobInfo.blob()); @@ -465,7 +473,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ .then(response => response.json()) .then(data => { if(data.location){ - resolve({url: data.location}); + resolve(data.location); } else{ reject("Erreur: Chemin d'image invalide"); @@ -475,7 +483,6 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ reject("Erreur lors de l'upload"); }); }); - const files_upload_handler = (blobInfo, progress) => new Promise((resolve, reject) => { // utilisation = bouton "link" (OU drag & drop, et oui) const formData = new FormData(); formData.append("file", blobInfo.blob()); @@ -520,7 +527,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ if (data.success) { // Supprimer l'article du DOM const articleElement = document.getElementById(article_id); - articleElement.parentElement.remove(); + articleElement?.parentElement?.remove(); } else { alert('Erreur lors de la suppression de l\'article.'); @@ -531,17 +538,20 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ }); } } - function closeEditor(article_id){ // Récupérer le contenu d'origine de l'article - const originalContent = document.getElementById(article_id).getAttribute('data-original-content'); + const element = document.getElementById(article_id); + if(!element){ + return; + } + const originalContent = element.getAttribute('data-original-content'); // Fermer l'éditeur tinymce.remove(`#${article_id}`); delete editors[article_id]; // Restaurer le contenu d'origine de l'article - document.getElementById(article_id).innerHTML = originalContent; + element.innerHTML = originalContent ?? ''; // Afficher le bouton "Modifier" et masquer les boutons "Annuler" et "Soumettre" document.querySelector(`#edit-${article_id}`).classList.remove('hidden'); @@ -549,11 +559,11 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ document.querySelector(`#cancel-${article_id}`).classList.add('hidden'); document.querySelector(`#submit-${article_id}`).classList.add('hidden'); } - function submitArticle(article_id) { // Récupérer l'éditeur correspondant à l'article const editor = editors[article_id]; - if(!editor){ + const element = document.getElementById(article_id); + if(!editor || !element){ console.error('Éditeur non trouvé pour l\'article:', article_id); return; } @@ -571,14 +581,14 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ }) .then(response => response.json()) .then(data => { - // Fermer l'éditeur et mettre à jour le contenu de l'article + // Fermer l'éditeur et mettre à jour le contenu de l'article closeEditor(article_id); - document.getElementById(article_id).innerHTML = newContent; + element.innerHTML = newContent; //console.log(newContent); if(data.success){ // Fermer l'éditeur et mettre à jour le contenu de l'article tinymce.remove(`#${article_id}`); - document.getElementById(article_id).innerHTML = newContent; + element.innerHTML = newContent; } else{ alert('Erreur lors de la sauvegarde de l\'article.'); @@ -593,12 +603,16 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ const reader = new FileReader(); reader.onload = function (event){ // fonction exécutée lorsque reader.readAsDataURL(file) est terminée - const base64 = event.target.result; // données de l'image + const base64_target = event.target; + if(!base64_target || !base64_target.result){ + console.error("erreur de lecture du fichier"); + return; + } fetch('index.php?action=upload_image_base64', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ image_base64: base64 }) + body: JSON.stringify({ image_base64: base64_target.result }) }) .then(response => response.json()) .then(data => { @@ -625,7 +639,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'upload_file'){ if(data.location){ // créer le lien const file_name = file.name; - const extension = file_name.split('.').pop().toLowerCase(); + const extension = file_name.split('.').pop()?.toLowerCase() || ''; const target = extension === 'pdf' ? 'target="_blank"' : ''; // PDF = page editor.insertContent(`[${extension}] ${file_name}`); } -- cgit v1.2.3