Manuel:Jeton d'édition
Un jeton d'édition (csrf token) est une chaîne aléatoire passée entre un client et le serveur MediaWiki lorsque vous réalisez des actions qui modifient les pages. Il est utilisé pour vérifier que l'utilisateur a bien l'intention de faire une modification, plutôt que d'être amené à demander le changement sur le wiki lors de la visite d'un site externe (par exemple la falsification de requête inter-sites).
Pourquoi c'est nécessaire
Les jetons d'édition sont utilisés comme mesure de sécurité supplémentaire quand les modifications sont réalisées. Si l'identité des utilisateurs avait été testée uniquement au travers des cookies, un site externe pourrait utiliser un lien tel que le suivant, pour que les visiteurs puissent réaliser des modifications sur le wiki.
https://en.wikipedia.org/w/index.php?title=Image:Abcd.jpg&action=delete&oldimage=324242234
En suivant un tel lien un administrateur pourrait inconsciemment demander la suppression d'une image. Si l'administrateur est encore connecté, le serveur vérifiera les cookies et honorera la requête.
Pour cette raison, les actions qui induisent des modifications nécessitent une information supplémentaire passée dans un paramètre HTTP : c'est le jeton d'édition. Un jeton de modification est inclus dans les pages web à partir desquelles l'utilisateur peut demander une modification; cela comprend le formulaire de modification (où vous pouvez modifier une page en pressant « Publier les modifications ») mais aussi les pages de description d'images (où un administrateur peut demander la suppression d'une ancienne version de l'image), les historiques de contribution (où les administrateurs peuvent faire des restitutions), etc.
Quand l'utilisateur demande actuellement que la modification soit realisée (en pressant un bouton ou en suivant un lien), le jeton de modification est renvoyé au serveur. Cela prouve au serveur que l'utilisateur a demandé la modification directement à partir du site et non à partir d'un site externe, étant donné que les sites externes n'ont pas accès aux jetons de modification de l'utilisateur.
Comment ça marche ?
Un jeton de modification est une chaîne aléatoire stockée dans la session PHP, c'est à dire un tableau associatif enregitré sur le serveur et maintenu au travers des sessions grâce à un cookie (par exemple, enwiki_session
sur la Wikipedia anglaise).
Le jeton d'édition est en particulier contenu dans l'élément wsEditToken
de la session PHP.
Les jetons d'édition sont inclus dans les pages web à partir desquelles l'utilisateur peut demander une modification.
Quand une telle page doit être générée, le jeton de modification est récupéré de l'élément wsEditToken
de la session PHP, si cet élément existe; sinon, une chaîne aléatoire est générée et stockée dans cet élément.
Ce qui se trouve actuellement dans la page web n'est pas l'élément wsEditToken
lui-même.
Mais plutôt, cet élément est concaténé dans le sel, qui est une chaîne dépendant de l'action particulière et de la page; la chaîne résultante est ensuite hachée MD5; c'est ce qui est inclus dans la page web.
Lorsque l'utilisateur demande actuellement l'action, cette chaîne est renvoyée vers le serveur dans un paramètre HTTP.
Le serveur peut alors vérifier si ce paramètre est correct : il répète la procédure utilisée pour le générer à partir de la session PHP et vérifie si le résultat est égal au paramètre.
Validité
Le jeton d'édition renvoyé par le serveur peut être réutilisé plusieurs fois pour différentes opérations de modification. Le jeton n'est valable que pendant une période de temps donnée. L'appel de l'API avec un jeton périmé provoque une erreur de type badtoken. Dans ce cas, il est nécessaire d'obtenir du serveur, un nouveau jeton d'édition avant de retenter l'opération.
Code source
Les jetons de modification sont principalement gérés avec dans le fichier source User.php, et en particulier à l'aide des méthodes suivantes.
- getEditToken(salt)
- renvoie la valeur de hachage MD5 de la concaténation de l'élément
wpEditToken
de la session PHP et du sel. si un tel élément n'existe pas dans la session PHP, un élément aléatoire équivalent est généré. Voir la fonction getEditToken dans le dépôt. - matchEditToken(token, salt)
- vérifie si son premier argument est un jeton valide de modification en fonction du sel; ceci est réalisé en répétant la procédure de génération et en comparant le résultat avec le premier argument; en particulier cette fonction appelle
editToken(salt)
puis compare le résultat avec le premier argument;
Le sel
Par défaut, le sel est la chaîne vide; la plupart des actions utilisent cette valeur par défaut. En conséquence, la chaîne d'un jeton de modification reçue d'un serveur pour réaliser une action initiale sur une page peut aussi être utilisée pour réaliser des actions supplémentaires sur d'autres pages. Néanmoins, comme un jeton de modification est stocké dans la session PHP, il ne peut être utilisé seulement que lorsque la session est établie dans le serveur et que le client possède le cookie du jeton de session correspondant (par exemple, le cookie enwiki_session).
Une valeur de hachage du jeton de modification générée en utilisant un sel peut être utilisée pour réaliser des actions supplémentaires seulement si le sel utilisé à la fois sur le serveur et sur le client, est le même. Il en résulte que si le sel est seulement inclus dans la page où l'action initiale est réalisée, alors cette même valeur de hachage ne peut être utilisée pour autoriser des actions sur d'autres pages.
- Les actions qui n'utilisent pas le sel vide par défaut sont :
- restauration (rollback)
- le sel est le titre de l'article (y compris le préfixe de l'espace de noms) concaténé au nom de l'utilisateur dont les modifications doivent être annulées;
- supprimer l'ancienne version d'une image
- le sel est le paramètre
oldimage
(lors de la suppression de toutes les versions, ce paramètre est la chaîne vide, qui est également le sel par défaut); - Special:UserRights
- le sel est le nom de l'utilisateur dont les propriétés vont être modifiées;
- Special:Watchlist/clear
- le sel est la chaîne 'clearwatchlist'
Suffixe du jeton d'édition
Les jetons de modification se terminent par +\
pour empêcher les proxy corrompus, de modifier : les proxy qui ne gèrent pas convenablement le backslash '\' ou le signe d'addition '+' sautent typiquement aussi le code de balisage wiki.
Récupération du côté client
Dans 1.18 et supérieur, vous n'avez pas besoin de récupérer le jeton d'édition en utilisant AJAX. Il est disponible en tant que mw.user.tokens.get( 'csrfToken' )
.
Notez que pour votre module, vous devez avoir défini mediawiki.user comme une dépendance de ResourceLoader.
Il vous est recommandé d'utiliser la méthode de l'assistant mw.api.postWithToken()
, qui prend en charge automatiquement les nouvelles tentatives quand le jeton a expiré depuis le moment où la page a été chargée.