Browse Source

Balise #FORMULAIRE : nettoyer du code mort qui ne sert plus, ameliorer la securite en ajoutant une signature des arguments du formulaire dès que l'auteur identifié.

A la reception on refuse un formulaire non signé si on a une session ou un formulaire signé si on a pas de session. Si on a une session, la signature doit etre identique.
En absence de session on ne signe pas les arguments du formulaire car tout le monde a le droit de l'afficher, et ca permet de garder un cache identique commun a tous les hits anonymes (perf issue)
pull/4922/head
Cerdic 1 year ago
parent
commit
1b8e4f404c
  1. 13
      ecrire/balise/formulaire_.php
  2. 23
      ecrire/public/aiguiller.php
  3. 2
      ecrire/public/balises.php

13
ecrire/balise/formulaire_.php

@ -252,6 +252,11 @@ function balise_FORMULAIRE__contexte($form, $args) {
$action = parametre_url($action, 'formulaire_action_args', '');
}
/**
* @deprecated
* servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
*/
/*
if (isset($valeurs['_action'])) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@ -259,6 +264,7 @@ function balise_FORMULAIRE__contexte($form, $args) {
"<input type='hidden' name='arg' value='" . $secu['arg'] . "' />"
. "<input type='hidden' name='hash' value='" . $secu['hash'] . "' />";
}
*/
// empiler la lang en tant que premier argument implicite du CVT
// pour permettre de la restaurer au moment du Verifier et du Traiter
@ -269,6 +275,13 @@ function balise_FORMULAIRE__contexte($form, $args) {
$valeurs['action'] = $action;
$valeurs['form'] = $form;
$valeurs['formulaire_sign'] = '';
if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
$valeurs['formulaire_sign'] = $secu['hash'];
}
if (!isset($valeurs['id'])) {
$valeurs['id'] = 'new';
}

23
ecrire/public/aiguiller.php

@ -195,9 +195,30 @@ function traiter_formulaires_dynamiques($get = false) {
return false;
} // le hit peut continuer normalement
// verifier que le post est licite (du meme auteur ou d'une session anonyme)
$sign = _request('formulaire_action_sign');
if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
if (empty($sign)) {
spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
return false;
}
$securiser_action = charger_fonction('securiser_action', 'inc');
$secu = $securiser_action($form, $args, '', -1);
if ($sign !== $secu['hash']) {
spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
return false;
}
}
else {
if (!is_null($sign)) {
spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
return false;
}
}
include_spip('inc/filtres');
if (($args = decoder_contexte_ajax($args, $form)) === false) {
spip_log("signature ajax form incorrecte : $form");
spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
return false; // continuons le hit comme si de rien etait
} else {

2
ecrire/public/balises.php

@ -2532,6 +2532,8 @@ function balise_ACTION_FORMULAIRE($p) {
value=\'' . $_form . '\' />' .
'<input name=\'formulaire_action_args\' type=\'hidden\'
value=\'' . @\$Pile[0]['formulaire_args']. '\' />' .
'<input name=\'formulaire_action_sign\' type=\'hidden\'
value=\'' . @\$Pile[0]['formulaire_sign']. '\' />' .
(!empty(\$Pile[0]['_hidden']) ? @\$Pile[0]['_hidden'] : '') .
'</span>'";

Loading…
Cancel
Save