diff --git a/ecrire/action/acceder_document.php b/ecrire/action/acceder_document.php
index 04490c30fde952c94b94b36c44b188edba62a4e8..6350f5208d0287bd1a9b180f25e96d26c323ca27 100644
--- a/ecrire/action/acceder_document.php
+++ b/ecrire/action/acceder_document.php
@@ -25,8 +25,8 @@ function action_acceder_document_dist() {
 	include_spip('inc/documents');
 
 	// $file exige pour eviter le scan id_document par id_document
-	$file = rawurldecode(_request('file'));
-	$file = get_spip_doc($file);
+	$f = rawurldecode(_request('file'));
+	$file = get_spip_doc($f);
 	$arg = rawurldecode(_request('arg'));
 
 	$status = $dcc = false;
@@ -57,8 +57,10 @@ function action_acceder_document_dist() {
 
 			//
 			// Verifier les droits de lecture du document
+			// en controlant la cle passee en argument
 			//
-			if (!autoriser('voir', 'document', $doc['id_document']))
+			include_spip('inc/securiser_action');
+			if (_request('cle') != calculer_cle_action($doc['id_document'].','.$f))
 				$status = 403;
 		}
 	}
diff --git a/ecrire/inc/acces.php b/ecrire/inc/acces.php
index 54f3d348f6106b471d6bd769d175a5314cf307eb..1b93b1db6725d40d04705d2e8065446744669bea 100644
--- a/ecrire/inc/acces.php
+++ b/ecrire/inc/acces.php
@@ -42,7 +42,7 @@ function creer_pass_aleatoire($longueur = 8, $sel = "") {
 }
 
 //
-// Creer un identifiant aleatoire (a fusionnner avec le precedent ?)
+// Creer un identifiant aleatoire
 //
 
 // http://doc.spip.org/@creer_uniqid
@@ -123,7 +123,6 @@ function initialiser_sel() {
 	else return "";
 }
 
-
 // Cette fonction ne sert qu'a la connexion en mode http_auth.non LDAP
 // Son role est de creer le fichier htpasswd
 // Voir le plugin "acces restreint"
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index e91131e006b83cd3799bbf04a93a1edfe7bb786c..50e0d21964a87c92d8108b3229652626053d93db 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -63,9 +63,16 @@ function generer_url_document_dist($id_document, $args='', $ancre='') {
 	// par exemple acces_restreint
 	if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
 	AND $row['distant'] != 'oui') {
-	  $args .= ($args ? "&" : '') . "arg=$id_document&file=" . rawurlencode($row['fichier']) . ($ancre ? "&ancre=$ancre" : '');
+		include_spip('inc/securiser_action');
+		$args .= ($args ? "&" : '')
+			. 'arg='.$id_document
+			. ($ancre ? "&ancre=$ancre" : '')
+			. '&cle=' . calculer_cle_action($id_document.','.$row['fichier'])
+			. '&file=' . rawurlencode($row['fichier'])
+			;
 		return generer_url_action('acceder_document', $args);
-	} else	return get_spip_doc($row['fichier']);
+	} else
+		return get_spip_doc($row['fichier']);
 }
 
 //
diff --git a/ecrire/inc/securiser_action.php b/ecrire/inc/securiser_action.php
index 50d42d4895394cf46e3d32f5fcfc697dae8bdc92..37e449b44e44c17de467138251f4de77274bb952 100644
--- a/ecrire/inc/securiser_action.php
+++ b/ecrire/inc/securiser_action.php
@@ -110,5 +110,32 @@ function verifier_action_auteur($action, $valeur) {
 	return false;
 }
 
+//
+// Des fonctions independantes du visiteur, qui permettent de controler
+// par exemple que l'URL d'un document a la bonne cle de lecture
+//
+
+// Le secret du site doit rester aussi secret que possible, et est eternel
+// On ne doit pas l'exporter
+function secret_du_site() {
+	if (!isset($GLOBALS['meta']['secret_du_site'])
+	OR !strlen($GLOBALS['meta']['secret_du_site'])
+	) {
+		include_spip('inc/acces');
+		ecrire_meta('secret_du_site', creer_uniqid(), 'non');
+	}
+	return $GLOBALS['meta']['secret_du_site'];
+}
+
+// http://doc.spip.org/@calculer_cle_action
+function calculer_cle_action($action) {
+	return md5($action . secret_du_site());
+}
+
+// http://doc.spip.org/@verifier_cle_action
+function verifier_cle_action($action, $cle) {
+	return ($cle == calculer_cle_action($action));
+}
+
 
 ?>