From 6e2a54874290b1ea50f9962057c82d36cf7f5487 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Sun, 12 Nov 2006 19:40:11 +0000 Subject: [PATCH] Double Oups: les 2 autres, c'est pas pour tout de suite. --- ecrire/balise/formulaire_forum.php | 49 ++++++++++++++---------------- ecrire/inc/forum_insert.php | 21 +++++++++---- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php index b07343115d..63c340eb40 100644 --- a/ecrire/balise/formulaire_forum.php +++ b/ecrire/balise/formulaire_forum.php @@ -103,6 +103,21 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) $email_auteur = $GLOBALS['auteur_session']['email']; } } + // Tableau des valeurs servant au calcul d'une signature de securite. + // Elles seront placees en Input Hidden pour que inc/forum_insert + // recalcule la meme chose et verifie l'identite des resultats. + // Donc ne pas changer la valeur de ce tableau entre le calcul de + // la signature et la fabrication des Hidden + // Faire attention aussi a 0 != '' + + // id_rubrique est parfois passee pour les articles, on n'en veut pas + $ids = array(); + if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic)) + $id_rubrique = 0; + foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) { + $ids[$o] = ($x = intval($$o)) ? $x : ''; + } + // ne pas mettre '', sinon le squelette n'affichera rien. $previsu = ' '; @@ -146,9 +161,11 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) if ($afficher_texte != 'non') $previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site_forum, $ajouter_mot); - $alea = forum_fichier_tmp(); + include_spip('inc/actions'); + $hash = calculer_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea); + // Poser un cookie pour ne pas retaper les infos invariables include_spip('inc/cookie'); spip_setcookie('spip_forum_user', @@ -156,32 +173,10 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour) 'email' => $email_auteur))); } - - // Valeurs servant au calcul d'une signature de securite. - // Elles seront placees en Input Hidden pour que inc/forum_insert - // recalcule la meme chose et verifie l'identite des resultats. - // Ne pas changer ces valeurs entre le calcul de la signature - // et leur insertion en hidden. - // Faire attention aussi a 0 != '' - - // id_rubrique est parfois passee pour les articles, on n'en veut pas - - if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic)) - $id_rubrique = 0; - - $arg = intval($id_article) .'/'. . - intval($id_breve) . '/' . - intval($id_forum) . '/' . - intval($id_rubrique) . '/' . - intval($id_syndic) . '/' . - $alea; - - include_spip('inc/actions'); - $hash = calculer_action_auteur("ajout_forum-$arg"); - - $script = str_replace('&', '&', $script); - $script_hidden = parametre_url($script, 'arg', $arg, '&'); - $script_hidden = parametre_url($script_hidden, 'action', 'ajout_forum, '&'); + // pour la chaine de hidden + $script_hidden = $script = str_replace('&', '&', $script); + foreach ($ids as $id => $v) + $script_hidden = parametre_url($script_hidden, $id, $v, '&'); return array('formulaires/formulaire_forum', 0, array( diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php index 54b0bb4e3b..f8b6d35597 100644 --- a/ecrire/inc/forum_insert.php +++ b/ecrire/inc/forum_insert.php @@ -113,12 +113,24 @@ function mots_du_forum($ajouter_mot, $id_message) spip_abstract_insert('spip_mots_forum', '(id_mot, id_forum)', "($id_mot, $id_message)"); } - +// Recalcule la signature faite dans formulaires/inc-formulaire-forum +// en fonction des input POST (ne pas se fier aux parametres d'URL) // Retourne le fichier verrouillant si correct // http://doc.spip.org/@forum_insert_secure -function forum_insert_secure($arg, $hash) +function forum_insert_secure($alea, $hash) { + $ids = array(); + + foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) { + $ids[$o] = ($x = intval($_POST[$o])) ? $x : ''; + } + + if (!verifier_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea, + $hash)) { + spip_log('erreur hash forum'); + die (_T('forum_titre_erreur')); # echec du POST + } $file = _DIR_TMP ."forum_" . preg_replace('/[^0-9]/', '', $alea) .".lck"; return file_exists($file) ? $file : ''; @@ -192,10 +204,7 @@ function inc_forum_insert_dist() { // Verifier hash securite pour les forums avec previsu if ($afficher_texte <> 'non') { - $var_f = charger_fonction('controler_action_auteur', 'inc'); - $var_f(); - - $file = forum_insert_secure(_request('arg'), _request('hash')); + $file = forum_insert_secure(_request('alea'), _request('hash')); if (!$file) { # ne pas tracer cette erreur, peut etre due a un double POST # tracer_erreur_forum('session absente'); -- GitLab