Valider fea5b5b4 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Balise #FORMULAIRE : nettoyer du code mort qui ne sert plus, ameliorer la...

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)
parent a4fdb3b8
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+13 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -250,6 +250,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);
@@ -257,6 +262,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
@@ -267,6 +273,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';
	}
+22 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -183,9 +183,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 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2562,6 +2562,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'] : '') .
	'</div>'";