wp_verify_nonce vs check_admin_referer - Diferencias y cuándo usarlas
¿Cuál es la diferencia y cuál debería usar?
Sé que wp_verify_nonce verifica el límite de tiempo, y check_admin_referer creo que también llama a wp_verify_nonce además de verificar un segmento de URL de administración, pero estoy un poco confundido sobre cuál debería usar y cuándo.
Gracias por la claridad.
Yo pensaba que check_admin_referer
verificaba el nonce (de hecho llama a wp_verify_nonce
), y además la URL de referencia. Después de investigar el código central me di cuenta de que no hacía esto. Pensando que era un error lo reporté, y Ryan Boren respondió con lo siguiente:
En realidad, si el nonce es válido no se debería verificar el referente. La falta de fiabilidad de los referentes es una de las razones por las que se usan nonces. Los nonces reemplazan completamente la verificación de referentes. El único momento en que verificamos el referente es cuando manejamos la condición de compatibilidad hacia atrás -1. -1 significa que alguien no está usando nonces, así que recurrimos a la verificación de referentes. Este uso ahora es muy raro. check_admin_referer() está mal nombrado ahora que casi nunca hace verificación de referentes. Sería mejor nombrarlo algo como check_nonce(), pero lo mantenemos así por compatibilidad hacia atrás y por los viejos tiempos.
Así que en realidad no hay ninguna diferencia.

En realidad hay una gran diferencia que afecta al uso... check_admin_referer mata todo el script con die() si el nonce no es válido, mientras que wp_verify_nonce devuelve false. Así que si hay ciertas circunstancias normales en las que el nonce puede fallar, usa wp_verify_nonce para que el resto del script siga ejecutándose.

¡NO! ¡CUIDADO!
No confíes en check_admin_referer()
sin los parámetros correctos. Porque, en algunos casos puede que no ejecute die()
(contrario a lo que esperarías), en su lugar solo devolverá la respuesta false
.
Revisa el comportamiento descrito en la lógica del código fuente:
function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
$result = isset( $_REQUEST[ $query_arg ] ) ? wp_verify_nonce( $_REQUEST[ $query_arg ], $action ) : false;
//Ahora, "verificación die()"
if ( ! $result && ( -1 !== $action || strpos( wp_get_referer(), admin_url() ) !== 0 ) ) {
die();
}
return $result;
}
Entonces, necesitas entender lo que hace esta lógica. Aquí el desglose:
A) Si llamas simplemente check_admin_referrer()
sin parámetros:
- RECUERDA, usará automáticamente el valor incorporado
_wpnonce
(que es seguro, pero aún así recuerda tener exactamente ese campo al enviar). - Como lo llamaste sin parámetros, usa el valor predeterminado
-1
para la acción, lo que hace que laverificación die()
se omita y la función no ejecutarádie()
- Por lo tanto, siempre deberías usar (al llamar sin parámetros):
if ( check_admin_referer() ) exit;
B) Si quieres que check_admin_referrer
termine automáticamente, entonces siempre debes crear tus nonces y llamarlo con parámetros:
check_admin_referrer($action_name, $name_field );
