wp_verify_nonce vs check_admin_referer

21

Qual é a diferença, qual deles devo usar?

Eu sei que wp_verify_nonce verifica o limite de tempo, e check_admin_referer, acho que chama wp_verify_nonce, além de verificar se há um segmento de URL de administrador, mas estou um pouco confuso sobre qual devo usar e quando.

Obrigado pela clareza.

Jeff
fonte
1
Distintivo Tumbleweed para esta pergunta? Sério? Alguém?
19412 Jeff

Respostas:

29

Eu pensei que check_admin_refererverificou o nonce (ele faz chamada wp_verify_nonce, e o URL de referência Depois de cavar o código do núcleo percebi que não fez isso pensando que era um bug I Divulgados, e Ryan Boren respondeu com o seguinte..:

Na verdade, se o nonce for válido, o referenciador não deve ser verificado. A falta de confiabilidade dos referenciadores é um dos motivos pelos quais os nonces são usados. Os nonces substituem completamente a verificação do referenciador. A única vez que verificamos o referenciador é ao lidar com a condição de compatibilidade com versões anteriores -1. -1 significa que alguém não está usando nonces, então voltamos à verificação de referências. Esse uso agora é muito raro. check_admin_referer () é mal nomeado agora que quase nunca faz a verificação de referências. Seria melhor nomeado algo como check_nonce (), mas nós o mantemos como é para os compatriotas e os velhos tempos.

Portanto, de fato, não há diferença.

Stephen Harris
fonte
Bom trabalho de escavação, obrigado, que traz alguma clareza.
16162 Jeff
5
Na verdade, existe uma grande diferença que afeta o uso ... check_admin_referer mata o script inteiro com die () se o nonce não for válido, enquanto wp_verify_nonce retorna false. Portanto, se houver certas circunstâncias normais nas quais o nonce falhará, use wp_verify_nonce para que o restante do script ainda seja executado.
SeventhSteel 9/03/2015
@ SeventhSteel - você certamente está certo. A minha interpretação da questão foi que a lógica da verificação nonces estavam sendo comparado ao invés do que acontece quando a sua inválido
Stephen Harris
3

NÃO!!!

Não conte com check_admin_referer, tenha cuidado!

  • Inclui wp_verify_noneapenas no caso em que _wpnoncefoi definido !!!
  • Nesse caso, não DIE(). Em vez disso, ele retorna false ...

Veja este phseudo-código ( a fonte completa está aqui ):

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
fonte