wp_verify_nonce vs check_admin_referer

21

¿Cuál es la diferencia, cuál debo usar?

Sé que wp_verify_nonce verifica el límite de tiempo, y check_admin_referer creo que llama a wp_verify_nonce y también busca un segmento de URL de administrador, pero estoy un poco confundido sobre cuál debo usar y cuándo.

Gracias por la claridad

Jeff
fuente
1
¿Insignia de Tumbleweed para esta pregunta? De Verdad? ¿Nadie?
Jeff

Respuestas:

29

Yo pensé que check_admin_referercomprueba el valor de uso único (que hace la llamada wp_verify_nonce, y la URL de referencia Después de cavar en el código del núcleo me di cuenta que no hizo esto Pensando que era un error informé, y Ryan Boren respondió con la siguiente..:

En realidad, si el nonce es válido, no se debe verificar el referente. La falta de fiabilidad de los referentes es una de las razones por las que se utilizan nonces. Nonces reemplaza la referencia de verificación por completo. La única vez que verificamos el referente es cuando manejamos la condición de compatibilidad con versiones anteriores de -1. -1 significa que alguien no está usando nonces, por lo que recurrimos a la verificación de referencias. Este uso ahora es muy raro. check_admin_referer () tiene un nombre incorrecto ahora que casi nunca realiza la comprobación de referencias. Sería mejor nombrar algo como check_nonce (), pero lo mantenemos como es por compatibilidad de compatibilidad y por los viejos tiempos.

Entonces, de hecho, no hay diferencia.

Stephen Harris
fuente
Buen trabajo de excavación, gracias, que aporta algo de claridad.
Jeff
55
En realidad, hay una gran diferencia que afecta el uso ... check_admin_referer mata todo el script con die () si el nonce no es válido, mientras que wp_verify_nonce devuelve falso. Entonces, si hay ciertas circunstancias normales en las que el nonce fallará, use wp_verify_nonce para que el resto del script aún se ejecute.
SeventhSteel
@SeventhSteel: por supuesto, tienes razón. Mi interpretación de la pregunta fue que la lógica de verificar nonces se estaba comparando en lugar de lo que sucede cuando es inválida
Stephen Harris
3

¡¡¡NO!!!

No cuentes check_admin_referer, ¡ten cuidado!

  • ¡Incluye wp_verify_nonesolo en caso de que _wpnoncese haya configurado!
  • En ese caso, no lo hace DIE(). En cambio, devuelve falso ...

Mire a través de este seudocódigo ( la fuente completa está aquí ):

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    .....
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    do_action( 'check_admin_referer', $action, $result );
    if ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {
        die(...);
    }
    return $result;
}
T.Todua
fuente