wp_verify_nonce vs check_admin_referer - Diferencias y cuándo usarlas

5 abr 2012, 19:45:50
Vistas: 14.8K
Votos: 29

¿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.

1
Comentarios

¿Insignia Tumbleweed para esta pregunta? ¿En serio? ¿Alguien?

Jeff Jeff
19 abr 2012 21:53:05
Todas las respuestas a la pregunta 2
3
38

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.

15 may 2012 23:13:40
Comentarios

Buen trabajo de investigación, gracias, eso aclara un poco las cosas.

Jeff Jeff
17 may 2012 01:19:03

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.

SeventhSteel SeventhSteel
9 mar 2015 20:41:54

@SeventhSteel - por supuesto que tienes razón. Mi interpretación de la pregunta era que se comparaba la lógica de verificación de nonces en lugar de lo que ocurre cuando no es válido.

Stephen Harris Stephen Harris
9 mar 2015 20:58:31
0

¡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 la verificació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 );

20 mar 2017 23:01:56