Qu’y a-t-il de nouveau depuis SPIP 4.0 ?
Voir les articles 4.1.0-alpha et 4.1.0-beta.
Particulièrement, cette version de SPIP est compatible de PHP 7.4 à 8.1. Le support de PHP 7.3 est abandonné.
Et ce n’est pas tout !
Qu’y a-t-il de nouveau depuis la beta ?
Un changement important : une refonte des authentifications (logins et actions) et du stockage des mots de passes en base de données. Cela a permis de fermer plusieurs tickets d’un coup tout en améliorant sensiblement certains enjeux liés à la sécurité de ces authentifications.
Autant le dire tout de suite :
- HTTPS (qui chiffre les données transmises entre le navigateur et le serveur) est fortement conseillé sur les sites. Effectivement le mot de passe est maintenant toujours envoyé en clair par le navigateur lors du login (SPIP auparavant, dans son comportement par défaut, chiffrait le mot de passe directement en Javascript) ;
- Le hachage du mot de passe en base a été revu pour être encore plus sécurisé, mais c’est un aller simple : une fois la mise à jour SPIP 4.1.0-rc appliquée, la base de données ne sera plus compatible avec une version SPIP 4.0 antérieure (pensez donc à faire des sauvegardes avant au cas où).
On vous explique tout cela en détail plus loin dans l’article.
Autres évolutions
- Mise à jour des traductions ;
- Les variantes de critères de date (
age_xx
,mois_xx
, ...) ne nécessitent pas qu’un champdate
soit déclaré sur la table en question ; - Vérifier à l’installation la version max de PHP utilisable ;
- Une icône (d’objet) générique est utilisée avec certaines fonctions (comme
icone_base()
) si l’objet en question n’a pas d’icône prévue ; - Ajout d’un fichier
.editorconfig
; - Divers nettoyages de code.
Corrections
-
supprimer_tags()
acceptait des array contrairement à ce que supposait son phpdoc ; - SVP : télécharger et activer un plugin fonctionne bien en 1 étape (comme avant).
Authentification & Chiffrement
Cette version SPIP 4.1.0-rc apporte des changements sur les authentifications et chiffrements. Nous avons repris en l’adaptant et complétant le travail de g0uZ sur le plugin Chiffrer, afin d’améliorer grandement la sécurité des sites sous SPIP.
Le formulaire de login
HTTPS est fortement conseillé
Côté navigateur, SPIP ne cherche plus à chiffrer le mot de passe des auteurs en Javascript depuis le formulaire de login.
Il existait effectivement certains rares cas où la librairie Javascript utilisée ne produisait le hash exact attendu. De plus les navigateurs indiquaient (en http, pas en https) que le mot de passe allait circuler en clair et que c’était dangereux (ce qui n’était pas forcément vrai dans le cas de SPIP donc, mais les navigateurs ne le savaient pas).
Mais surtout HTTPS s’est grandement démocratisé : ce protocole chiffre les données transmises entre le navigateur et le serveur (et donc dans ce cas précis le mot de passe envoyé n’est pas lisible lorsqu’il transite sur le réseau).
Comme SPIP 4.1.0-rc ne chiffre plus le mot de passe en Javascript, il est donc fortement recommandé (encore plus qu’avant) d’avoir son site en https (et non http), pour que ça soit directement le protocole qui se charge du chiffrement.
En conséquence la constante _AUTORISER_AUTH_FAIBLE
n’est plus utilisée et supprimée. Elle permettait de forcer l’envoi du mot de passe en clair (sans chiffrement en Javascript), ce qui est maintenant toujours le cas.
Poivre, sel & hash du mot de passe
L’essentiel des changements se trouve dans le traitement côté serveur, dans SPIP et sa base de données.
Le mot de passe d’un auteur est maintenant haché dans SPIP en utilisant un poivre (une clé unique spécifique pour le site). La fonction password_hash
de PHP s’occupe ensuite de trouver le meilleur algorithme de hachage et de créer un sel dedans. password_verify
est utilisé pour le vérifier.
Les « aléas » rotatifs des auteurs sont toujours créés, mais ne sont plus utilisés pour saler le mot de passe vu que la fonction PHP password_hash
gère cela très bien toute seule. Par contre, l’application supplémentaire d’un poivre est une nouveauté.
Comme avant, à chaque authentification réussie d’un auteur, on enregistre dans la base un nouveau hash du mot de passe, avec password_hash
: cela applique un nouveau sel sur celui-ci, et éventuellement PHP en profite pour utiliser un algorithme de hachage plus performant si besoin.
Clés de chiffrement
Pour mener à bien ce poivre, et d’autres actions dans SPIP, des clés de chiffrement sont utilisées et stockées dans config/cles.php
. Il y en a 2 par défaut :
- secret_des_auth : elle sert à poivrer le mot de passe des auteurs. C’est une nouvelle clé donc.
- secret_du_site : elle sert pour moitié au calcul du « secret du site ». L’autre moitié provenant de la base de données dans l’entrée
secret_du_site
de la tablespip_meta
. Ce secret du site (combiné) permet de signer et/ou chiffrer certaines parties de SPIP (contextes ajax, actions d’auteurs).
Lorsqu’unbackup_cles
de la table spip_auteurs
, en le chiffrant avec le mot de passe en clair de l’auteur.
Ceci permet de restaurer les clés du site lors de l’authentification d’un webmestre, si le fichier cles.php
a été effacé.
La classe \Spip\Chiffrer\SpipCles
permet de manipuler les clés au besoin.
Password
SPIP fournit deux méthodes qui sont utilisées dans ecrire/auth/spip.php
– \Spip\Chiffrer\Password::verifier($clair, $hash, $key = null): bool
– \Spip\Chiffrer\Password::hacher($clair, $key = null): string
La clé par défaut est celle de secret_des_auth
, utilisée pour poivrer.
Chiffrement
Trois méthodes sont aussi fournies pour chiffrer et déchiffrer (chiffrage symétrique) des contenus.
Dedans nous utilisons la librairie Sodium (fournie par défaut dans PHP >= 7.2).
– \Spip\Chiffrer\Chiffrement::chiffrer($message, $key): ?string
– \Spip\Chiffrer\Chiffrement::dechiffrer($encoded, $key): ?string
– \Spip\Chiffrer\Chiffrement::keygen(): string
La méthode keygen
produit simplement une clé de chiffrement à la longueur adaptée.
Les méthodes chiffrer()
et dechiffrer()
seront très lentes si la clé transmise n’a pas la bonne longueur : on considère alors la clé de chiffrement comme étant un mot de passe nécessitant un traitement supplémentaire lourd (avec sodium_crypto_pwhash
).
Chiffrement des jetons en base
SPIP n’enregistre plus les jetons d’auteurs (qui permettent par exemple de changer son mot de passe) tels quels en base de données, mais les chiffre auparavant en utilisant le « secret du site » :
Chiffrement::chiffrer($jeton, SpipCles::secret_du_site())
.
Cela évite et limite certaines failles potentielles.
Signature des actions
Les actions sont authentifiées maintenant en utilisant hash_hmac
et hash_equals
(et les aléas d’auteurs et/ou le secret du site)
Retours sur la beta
Deux petits bugs ont été remontés concernant SVP ou le plugin Archiviste que nous avons pu corriger dans cette version 4.1.0-rc.
Calendrier
Nous prévoyons la sortie de SPIP 4.1.0 (stable) pour début mars s’il n’y a pas de problème majeur rencontré avec la RC.
La version 4.0 sera maintenue jusque fin juin (peut être jusqu’à la sortie de SPIP 4.2).
Nous vous rappelons que SPIP 3.2 sera maintenue pour des correctifs de sécurité uniquement jusque fin décembre 2022 et que nous prévoyons une version 4.2 pour le début de l’été.
Tester les plugins
Les plugins n’auront probablement pas encore de version prévue pour cette toute nouvelle version de SPIP. Pour les tester afin de vérifier leur compatibilité, vous pouvez utiliser la configuration (constante) suivante dans votre fichier config/mes_options.php
Cela permet d’activer n’importe quel plugin compatible avec SPIP 4.0.
Mettre à jour en utilisant le spip_loader
Vous pouvez aussi mettre à jour au moyen de la dernière version du spip_loader (version 5.1.0).
https://www.spip.net/spip-dev/INSTALL/spip_loader.php
Résumé des versions de SPIP
Branche | Version | Suivi | Compatibilité PHP |
---|---|---|---|
SPIP 4.1 | SPIP 4.1.0-rc | Branche test | PHP 7.4 à PHP 8.1 |
SPIP 4.0 | SPIP 4.0.5 | Branche stable | PHP 7.3 à PHP 8.0 |
SPIP 3.2 | SPIP 3.2.14 | Branche stable | PHP 5.4 à PHP 7.4 |
Les versions SPIP 3.1 et antérieures ne sont plus maintenues.
Pour connaître le détail des versions maintenues :
https://www.spip.net/fr_article6500.html
Comment être tenu au courant de ces annonces ?
C’est simple, inscrivez-vous sur la mailing liste https://discuter.spip.net/c/spip-ann/13
Bien sûr les réseaux sociaux sont de la partie :
- Seenthis : https://seenthis.net/people/spip
- Twitter : https://twitter.com/spip
- Facebook : https://www.facebook.com/spip.net
- Mamot : https://mamot.fr/@spip
Une question, besoin d’aide ?
En cas de problème ou de difficultés, il y aura certainement quelqu’un pour vous aider sur IRC, N’hésitez pas à venir poser vos questions https://irc.spip.net
Vous pouvez aussi poster un message et échanger sur :
- La liste des utilisateurs et utilisatrices https://discuter.spip.net/c/spip/6
- La liste du développement spip-dev https://discuter.spip.net/c/spip-dev/5
Nous vous rappelons que pour signaler une faille, il suffit d’envoyer un mail à spip-team@rezo.net
Messages
12 mars 2022, 07:07, par Said
Merci. Pas encore testé mais je le ferai avec plaisir dès la sortie de la finale
17 mars 2022, 21:16, par Ysabeau
Bonjour,
J’ai commencé (quasiment fini en fait) une dépêche sur LinuxFr.org en prévision de la sortie de SPIP 4.1, elle est là (il faut être connecté et donc avoir un compte), si vous avez des remarques. La dépêche ne sera, évidemment, pas envoyée en modération avant la sortie de la version finale de SPIP 4.1.
J’avais déjà annoncé SPIP 4 cet été. J’ai également envoyé l’info sur discuter-spip.
30 mars 2022, 20:21, par Didier
Bonjour je viens de faire un test en local sur Wamp en intégrant dans mes_option.php la syntaxe indiquée et grosse erreur [Erreur d’exécution ../prive/squelettes/body.html [|] File C :\wamp64\www\monsite\ecrire\src\Chiffrer\Chiffrement.php Line 68 : Call to undefined function Spip\Chiffrer\sodium_crypto_secretbox_keygen()]
30 mars 2022, 23:17, par Didier
Je me réponds, sur Wamp il faut cocher l’extension php sodium.