La seguridad de WordPress es un tema que nos tomamos muy en serio y un poco demasiado literalmente. WordPress en sí no es el problema, de hecho, los problemas que la mayoría de los usuarios enfrentan con la seguridad son el resultado de fallas en todo lo que agregamos.
Uno de los métodos de prevención más utilizados contra una variedad de posibles amenazas a la seguridad es el empleo de nonces. Los nonces tienen una funcionalidad simple: proteger todas las acciones del usuario iniciadas por un complemento.
En este artículo, le daremos una buena introducción a los nonces de WordPress para que pueda comprender lo que hacen y por qué es posible que desee prestarles más atención en el futuro. También veremos un ejemplo práctico para que pueda obtener un ejemplo de la vida real de cómo se pueden usar.
Empecemos.
El propio WordPress define los nonces como «un ‘número usado una vez’ para ayudar a proteger las URL y los formularios de ciertos tipos de uso indebido, malicioso o de otro tipo». Si entendió esa definición desde el principio, entonces es seguro asumir que tiene conocimientos de programación y ha implementado algo similar usted mismo.
Para aquellos de ustedes que no lo entendieron (no se preocupen, me tomó un tiempo entenderlo completamente) básicamente significa que un nonce es un valor de identificación que un usuario debe mostrar para autenticar su permiso de usuario. antes de que puedan llevar a cabo cualquier acción del usuario.
¿Qué aspecto tienen los nonces?
Según su definición, un nonce es un número. Aunque esto puede ser cierto en otras implementaciones de nonces, en el mundo de WordPress los nonces son valores hash compuestos por una combinación de números y letras. Esto los hace más seguros que los nonces regulares .

Los nonces de WordPress son valores hash que consisten en una combinación de números y letras.
A pesar de estas dos diferencias principales en la implementación de los nonces regulares, nos referimos a estos tokens de seguridad de WordPress como nonces de WordPress porque el principio básico detrás de ellos es el mismo.
¿Por qué necesitamos nonces?
Los nonces protegen los sitios de WordPress contra las vulnerabilidades maliciosas que se basan principalmente en la falsificación de solicitudes entre sitios (CSRF). Esta técnica de piratería consiste en transmitir comandos no autorizados de un usuario en el que el sitio web confía.
Veamos un ejemplo en nuestro intento de comprender mejor los ataques CSRF. Digamos, por ejemplo, que hay una persona malintencionada que quiere llenar su base de datos con datos inútiles para sobrecargarla. Si tiene un formulario de contacto en su sitio (como la mayoría de nosotros) que no está protegido con nonces (como la mayoría de ellos aún no lo están), el atacante malintencionado puede escribir un script PHP simple para POST en el contacto de su sitio. forma.
Crearían y publicarían un enlace en un foro popular para que tantas personas como sea posible hicieran clic en él. Cada vez que un usuario hace clic en el enlace, su formulario de contacto se llena de spam. Almacenar cantidades excesivas de datos basura en su base de datos puede sobrecargarla rápidamente y dañar el rendimiento de su sitio de WordPress .
Ahora deténgase por un minuto y realmente piense en esto. Una persona que pueda emprender con éxito una misión como esta también podría tener la capacidad de eliminar contenido importante de su sitio, crear/eliminar cuentas de usuario e incluso iniciar transacciones.
Estos ataques de seguridad de WordPress son comunes y los nonces de WordPress están ahí para garantizar que algo así no le suceda a su sitio. Esto se logra agregando una capa extra de seguridad. Una URL con una implementación nonce se vería así en el escenario para eliminar la cuenta del usuario con: userid=7
http://example.com/wp-admin/user.php?userid=7&action=remove&_wpnonce=c214gd5315
Dado que el nonce siempre será diferente, se vuelve virtualmente imposible para cualquiera adivinar el valor correcto del nonce.
Cómo funcionan los nonces
La mayoría de los webmasters no saben que los nonces se utilizan ampliamente en la funcionalidad principal de WordPress. Los nonces son valores hash y, como ocurre con otras variables similares, los nonces tienen algunas propiedades que son específicas de su funcionalidad.
Vida útil de Nonces
Los nonces de WordPress tienen una vida útil limitada que especifica el administrador del sitio web. Los nonces caducan una vez que finaliza su vida útil y no se pueden usar para realizar la acción de usuario para la que fueron definidos. De forma predeterminada, el valor de validez de un nonce es de 24 horas.
Naturaleza específica del usuario de Nonces
¿Qué sucede si un usuario malicioso accede a la fuente HTML de un sitio de WordPress e identifica el campo nonce? Técnicamente, podrían agregarlo a su URL personalizada. ¿No podrían? Por suerte, esto no funcionará porque los nonces de WordPress son únicos para la sesión del usuario actualmente activo . Esto significa que los nonces en una página no serán válidos si un usuario inicia y cierra sesión en su sitio de WordPress de forma asíncrona. Bastante genial, ¿verdad?
Veamos otro ejemplo para comprender la funcionalidad de los nonces de WordPress.
Supongamos que ha implementado nonces en su sitio de WordPress para aumentar la seguridad y evitar posibles ataques CSRF en las cuentas de usuario de los miembros y empleados de su equipo. Eliminar una cuenta del back-end del sitio es una acción común del usuario que se puede programar para trabajar a través del front-end del sitio mediante la manipulación de la URL relevante.
En este caso particular, supongamos que su pantalla de administrador genera una URL para la acción del usuario mediante la cual un administrador elimina a un usuario y agrega un nonce al final. Podría verse algo como esto:
http://example.com/wp-admin/users.php?user=7&action=delete&_wpnonce=c214gd5315
Ahora, si un usuario malicioso intenta imponer un ataque CSRF reemplazando la ID del usuario con otro valor, por ejemplo, user=5
el nonce no sería válido y la acción del usuario fallaría.
http://example.com/wp-admin/users.php?user=5&action=delete&_wpnonce=c214gd5315
En tal escenario, WordPress muestra una respuesta 403 Prohibida al navegador del usuario malicioso con un mensaje de error que dice «¿ Estás seguro de que quieres hacer esto?» ” Los nonces hacen que sea prácticamente imposible que los usuarios malintencionados o los piratas informáticos alteren el contenido de su sitio o intenten dañarlo eliminando contenido.
Ahora que hemos cubierto los conceptos básicos de los nonces, echemos un vistazo a cómo implementarlos en WordPress. Pero primero una nota rápida sobre los ataques CSRF.
Falsificación de solicitud entre sitios
Los ataques de falsificación de solicitudes en sitios cruzados (CSRF) son uno de los exploits maliciosos más comunes de los sitios web. El mayor problema es que el ataque se lleva a cabo desde la propia dirección IP del usuario involuntario , lo que hace que sea más difícil de rastrear.

Los ataques CSRF son uno de los exploits maliciosos más comunes de los sitios web.
Los ataques CSRF están diseñados para realizar algún tipo de acción, no para robar datos como es común con otros ataques similares. Los atacantes que se encuentran con URL reproducibles que están asociadas con acciones específicas del usuario las usan para engañar al administrador para que dañe su propio sitio.
El proceso es bastante simple una vez que el atacante adquiere el enlace y lo modifica. Todo lo que tiene que hacer es colocar el enlace en una fuente de confianza del administrador del sitio web y asegurarse de que se haga clic en él cuando el administrador del sitio haya iniciado sesión en su cuenta. En general, estos enlaces se envían a través de correos electrónicos con pretensiones falsas, como informar sobre un enlace roto o actualizar datos.
Los ataques CSRF en sitios de WordPress se pueden utilizar para:
- Eliminar publicaciones del back-end.
- Eliminar cuentas de usuario de forma permanente.
- Envíe valores falsos en los formularios de WordPress.
- Manipulación de los valores de la base de datos a través de otras acciones del usuario.
Implementando Nonces de WordPress
Usar los nonces de WordPress es bastante simple y solo tendrá que familiarizarse con algunas fórmulas fáciles. Todo lo que tiene que hacer es crearlo y agregarlo a una URL o un formulario y luego verificarlo en el destino. Sin más preámbulos, ¡comencemos!
Agregar nonces a las URL
Si desea iniciar alguna acción de usuario específica a través de URL para simplificar el proceso en el futuro, es absolutamente necesario agregar un nonce para evitar ataques maliciosos. Por lo general, los nonces se pasan como argumentos de consulta a las funciones y también es totalmente posible pasarlos (transmitirlos) a través de URL.
De acuerdo, esto hace que el valor del nonce sea visible en el enlace, pero como discutimos anteriormente, los nonces son específicos de las sesiones de los usuarios y serían inútiles para cualquiera que logre averiguar su valor.
Para agregar nonces a las URL, usaremos la wp_nonce_url()
función y pasaremos la URL simple y una cadena que indica la acción del usuario como argumentos. La cadena debe ser lo más específica posible de la acción real del usuario para garantizar la máxima seguridad. Por ejemplo, si desea agregar un nonce para eliminar un usuario de su sitio, puede nombrarlo delete-user
.
$complete_url = wp_nonce_url( $bare_url, 'delete-user_'.$user->ID );
De forma predeterminada, WordPress nombra su nonce _wpnonce
. Esto también es visible en la URL que deberá recordar más adelante. Para mejorar aún más la seguridad, puede usar la siguiente llamada de función para asignar una variable nonce personalizada.
$complete_url = wp_nonce_url( $bare_url, 'delete-user_'.$user->ID, ‘my_nonces’ );
Este código creará una URL que podría verse así:
http://example.com/wp-admin/users.php?user=5&action=delete-user&my_nonces=c214gd5315
Adición de nonces a formularios
Agregar nonces a los formularios de WordPress crea campos ocultos para usted en el formulario automáticamente. El usuario tiene que llamar a la función wp_nonce_field()
y pasar una cadena que denota la acción del usuario como argumento. La función generará dos campos ocultos:
- El valor del primer campo es el nonce.
- El valor del segundo campo es la URL actual (el referente).
wp_nonce_field( 'remove-comment_'.$comment_id );
Esta llamada de función hará eco de algo como esto:
<input type="hidden" id="_wpnonce" name="_wpnonce" value="807d8877c2" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />
La función también se puede modificar para mostrar un nombre nonce diferente (similar a lo que hicimos anteriormente), eliminar el campo de referencia y hacer que se devuelva el resultado en lugar de repetirlo. Puede tomar hasta cuatro parámetros, todos los cuales son opcionales.
wp_nonce_field( $useraction, $noncename, $referer, $echo );
useraction
denota el nombre de la acción del usuario para la que es el nonce.noncename
denota el nombre definido por el usuario del nonce. Por defecto es _wpnonce.referer
contiene un valor booleano que determina si se debe crear o no un campo oculto para el referente.echo
contiene un valor booleano que determina si el resultado debe repetirse (en verdadero) o devolverse (en falso).
Verificando Nonces de WordPress
Es importante verificar los nonces una vez que los haya creado y agregado a URL o formularios en su sitio de WordPress. Este paso garantiza que nuestra implementación y las llamadas a funciones funcionen correctamente. Hay cuatro formas de verificar los nonces de WordPress y discutiremos las dos primeras en la siguiente sección. Puede verificar los nonces que se aprobaron:
- A través de una URL.
- En un formulario en la pantalla de administración.
- Como una solicitud de AJAX.
- En algún otro contexto.
Verificación de direcciones URL pasadas por Nonces
Para verificar un nonce que se creó, agregó y pasó en una URL, puede usar el siguiente método:
wp_verify_nonce($nonce, $action);
nonce
indica el nombre del nonce que desea verificar, por ejemplo, delete-user.action
denota la acción del usuario que especificó en el momento en que se creó el nonce.
Esta llamada de función devuelve false si el nonce que está tratando de verificar no es válido. Por otro lado, si el nonce es válido, devolverá un 1 o un 2. Un valor igual a 1 significa que el nonce se creó hace 12 horas (o menos), mientras que 2 significa que se creó hace más de 12 horas pero hace menos de 24 horas.
Verificación de nonces pasados a través de formularios
Para verificar un nonce que se creó originalmente y se agregó a un campo oculto en un formulario de WordPress, puede emplear el siguiente método:
check_admin_referer($action, $nonce);
action
denota la acción del usuario que especificó en el momento en que se creó el nonce.nonce
denota el nombre del nonce que desea verificar, por ejemplo, eliminar comentario.
Si el valor del nonce es válido, el complemento o el tema que lo ejecuta continuará ejecutándose según lo previsto. Sin embargo, si el nonce no se verifica, es decir, no es válido, el usuario será redirigido a una página de error 403 Prohibido .
Envolviendolo
La gravedad de las vulnerabilidades de falsificación de solicitudes en sitios cruzados (CSRF) puede variar de leve a peligrosa y es fundamental que tome las medidas necesarias para evitar posibles ataques a su sitio de WordPress. Emplear nonces en las acciones de los usuarios es una forma segura de prevenir ataques CSRF y hacer que su sitio sea más seguro.
Presentamos un ejemplo rápido para mostrar cómo es posible aprovechar el poder de los nonces para un sitio de WordPress y, con suerte, ahora está en una buena posición para realizar más investigaciones sobre estos procedimientos y tal vez llevar las cosas más lejos o al menos hablar sobre este tema. con más confianza.
¿Puede pensar en otras formas en que se pueden usar los nonces para aumentar la seguridad de su sitio de WordPress? ¿Cómo mantiene su sitio seguro de ataques maliciosos? Háganos saber en la sección de comentarios.
Imagen en miniatura del artículo de Dooder / shutterstock.com