Manual:Edit token/es

Una ficha de edición (también denominada ficha csrf) es una cadena de caracteres aleatoria que se transmite entre un cliente y un servidor MediaWiki al realizar acciones que modifican las páginas. Se emplea para comprobar que el usuario realmente ha pretendido hacer el cambio y no fue engañado para solicitar el cambio mientras visitaba un sitio externo (esto es, falsificación de solicitudes entre sitios).

Nota: un programador debe verificar la información contenida en esta página.

Por qué es necesaria
Se utilizan las fichas de edición como medida de seguridad adicional durante la realización de cambios. Si la identidad del usuario se verificara únicamente mediante las cookies, algún sitio externo podría utilizar un enlace como el siguiente para que los visitantes realicen cambios en el wiki. https://en.wikipedia.org/w/index.php?title=Image:Abcd.jpg&action=delete&oldimage=324242234 Al pulsar en un enlace como este, un administrador podría solicitar la eliminación de una imagen sin tener conocimiento de ello. Si este administrador permanece conectado, el servidor comprobaría las cookies y concedería la solicitud.

Por este motivo, las acciones que realizan modificaciones requieren un dato adicional (esto es, la ficha de edición) que se ha de transmitir como un parámetro HTTP. La ficha de edición se incrusta en las páginas web de las cuales los usuarios pueden solicitar una modificación; estas comprenden el formulario de edición (donde uno puede cambiar una página al pulsar en «Guardar los cambios»), las páginas de descripción de las imaágenes (donde los administradores pueden solicitar la eliminación de una versión anterior de las imágenes), los historiales de contribuciones (donde los administradores pueden realizar reversiones), etcétera.

Cuando el usuario solicita que el cambio se realice (al pulsar en un botón o un enlace), la ficha de edición se envía de vuelta al servidor. Ello demuestra al servidor que el usuario ha realizado el cambio directamente desde el sitio y no desde un sitio externo, dado que los sitios externos no tienen acceso a la ficha de edición del usuario.

Cómo funciona
Una ficha de edición es una cadena de caracteres aleatoria que se almacena en la sesión PHP, la cual es una matriz asociativa que se guarda en el servidor y se conserva entre sesiones gracias a una cookie (p. ej.,  en la Wikipedia en castellano). La ficha de edición se ubica en concreto dentro del elemento  de la sesión PHP.

Las fichas de edición se incrustan en las páginas de donde los usuarios pueden solicitar cambios. Cuando se genera alguna de estas páginas, la ficha de edición se recupera del elemento  de la sesión PHP, si existe; en caso contrario, se genera una cadena al azar y se guarda en el elemento aludido.

Lo que de hecho se incrusta en la página web no es en sí el elemento. En lugar de ello, este elemento se concatena con la «sal», la cual es una cadena de caracteres que varía en función de la acción y la página concretas; la cadena que resulta se cifra con el algoritmo MD5 y esto es lo que queda incrustado en la página. Cuando el usuario solicita la acción, esta cadena se devuelve al servidor por medio de un parámetro HTTP. El servidor comprobará la exactitud de este parámetro repitiendo el procedimiento de generación desde la sesión PHP y revisará que el resultado equivalga al parámetro.

Validez
La ficha de edición devuelta por el servidor puede reutilizarse varias veces para distintas operaciones de edición. La ficha es válida solo durante un período específico. Las llamadas a la API que incluyan una ficha vieja fallarán con el error badtoken: si esto sucede, será necesario obtener una ficha de edición nueva desde el servidor antes de intentar la operación de nuevo.

Código fuente
El archivo User.php, o más precisamente los métodos expuestos a continuación, procesan las fichas de edición.
 * getEditToken(salt) : devuelve el cifrado MD5 de la concatenación del elemento  de la sesión PHP más la «sal»; si este elemento no existe en la sesión PHP, se genera uno aleatoriamente. Consúltese la función getEditToken en el repositorio.
 * matchEditToken(token, salt) : comprueba si su primer argumento es una ficha de edición válida con respecto a la «sal»; esto se realiza al repetir el procedimiento de generación y comparar el resultado con el primer argumento. En concreto, esta función invoca a  y, acto seguido, compara el resultado con el primer argumento.

Sal
La «sal» predeterminada es una cadena de caracteres vacía; la mayor parte de las acciones utilizan este valor predeterminado. Como resultado, una cadena de ficha de edición recibida desde un servidor para realizar una acción inicial en una página puede reutilizarse para realizar más acciones en otras páginas. Sin embargo, como la ficha de edición se guarda en la sesión PHP, puede utilizarse solo mientras la sesión permanezca en el servidor y el cliente retenga la cookie de sesión correspondiente (p. ej., eswiki_session).

Es posible utilizar una ficha cifrada generada por medio de una «sal» para realizar acciones adicionales únicamente si tanto el cliente como el servidor tienen esta misma «sal». De esto se desprende que si la «sal» se incrusta solo en la página donde se realiza la acción inicial, entonces no se puede usar la misma ficha cifrada para permitir acciones en otras páginas.


 * Aquellas acciones que no emplean la «sal» vacía predeterminada son:


 * reversión : la «sal» es el título del artículo (incluido el prefijo del espacio de nombres) concatenado con el nombre del usuario cuyas ediciones deben revertirse;
 * eliminación de una versión antigua de una imagen : la «sal» es el parámetro  (al eliminar todas las versiones, este parámetro es una cadena vacía, la «sal» predeterminada);
 * Especial:PermisosUsuarios : la «sal» es el nombre de usuario de la persona cuyas propiedades deben modificarse;
 * Especial:EditarSeguimiento/clear : la «sal» es la cadena 'clearwatchlist'

Sufijo de la ficha de edición
A partir de la revisión 18112, se ha añadido una barra invertida al final de las fichas de edición; las fichas de los usuarios anónimos consisten de una única barra invertida. Este cambio evita que se hagan ediciones desde servidores proxy mal configurados: aquellos proxies que no pueden manejar correctamente la barra invertida típicamente estropean el código wiki. Este sufijo se cambió a  en la revisión 23287 para bloquear también a los proxies que manejan incorrectamente el carácter «+».

Recuperación por el lado cliente
A partir de la versión 1.18, no es necesario recuperar la ficha de edición a través de AJAX. Está disponible como. Téngase en cuenta que hace falta definir mediawiki.user como dependencia de ResourceLoader en su módulo. Se recomienda utilizar el método auxiliar, el cual se encarga de los reintentos automáticamente en caso de que la ficha haya caducado desde el momento en que se cargó la página web.