Je viens d’être confronté au problème (encore un site en 1.7.2 en 2008, sisi ^^’) et vient de le résoudre.
Solution (spip 1.7.2)
1. Ouvrir avec son éditeur de code le fichier ecrire/inc_document.php3
.
2. Remplacez le code $image_link
par clone $image_link
apparaissant aux lignes 631, 661, 759, 851, 900, 998, 1025, 1122 et 1219.
3. Enregistrer le fichier.
Origine du problème
PHP5, contrairement à PHP4, réalise par défaut une copie des objets par référence — c’est-à-dire qu’une modification apportée à la copie va également être répercutée sur l’objet original (en simplifiant, voir plus d’explications).
Dans notre cas, l’objet $image_link
présent dans le fichier ecrire/inc_document.php3
doit être, tout au long de diverses fonctions, copié en tant que nouvelle variable afin de générer l’URL finale. En PHP5, l’objet n’étant pas explicitement copié (via l’instruction clone), $image_link
est continuellement modifiée, pour au final conduire à la création d’un mauvais lien.
Explication détaillée pour les curieux
1. Spip génère un lien intitulé « Supprimer ce document ». Il contient un hash calculé sur la base de l’action associée, doc_supp
. Du fait du passage par référence de l’objet $image_link
, un argument ajout_doc
est également ajouté.
2. L’utilisateur clique sur le lien qui pointe sur image_spip.php3
.
3. Dans ce dernier, la présence de l’argument ajout_doc
entraîne la vérification du hash en fonction de l’action ajout_doc
. Et c’est là que ça coince : le hash n’est valable que pour une action doc_supp
. En conséquence de quoi, le traitement du fichier image_spip.php3
est abruptement stoppé. Une page blanche est présentée à l’utilisateur.
Cette contribution ne servira peut-être pas à grand monde, mais qui sait… ;-)