diff --git a/ecrire/balise/formulaire_.php b/ecrire/balise/formulaire_.php
index 278d991f09cf5cf65a45d4d04db7470052056508..f708e834b4a219a637730fa4a4e0e2ce09c2848e 100644
--- a/ecrire/balise/formulaire_.php
+++ b/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';
 	}
diff --git a/ecrire/public/aiguiller.php b/ecrire/public/aiguiller.php
index 98a90341b4273380ee11eeb5add2f2e525a0b38b..9ccceda1a47ca07e656ab235e28a609504d60bea 100644
--- a/ecrire/public/aiguiller.php
+++ b/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 {
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 4f3d2c68202ddab4fe6ede5d7b451f6c4b534b9f..443b469b77154ea34f29745f0961b2a923661add 100644
--- a/ecrire/public/balises.php
+++ b/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>'";