wp_verify_nonce vs check_admin_referer


21

Jaką różnicę powinienem zastosować?

Wiem, że wp_verify_nonce sprawdza limit czasu, a check_admin_referer myślę, że wywołuje wp_verify_nonce, a także sprawdza segment adresu URL administratora, ale jestem nieco zdezorientowany, który powinienem użyć i kiedy.

Dzięki za jasność.


1
Odznaka Tumbleweed dla tego pytania? Naprawdę? Ktoś?
Jeff

Odpowiedzi:


29

I pomyślałem , że check_admin_referersprawdził nonce (robi wezwanie wp_verify_nonce, i URL odsyłający Po wykopaniu do kodu rdzenia zdałem sobie sprawę, że nie zrobił tego Myśląc, że to błąd, zgłosiłem to i Ryan Boren odpowiedział z następujących powodów..:

W rzeczywistości, jeśli nonce jest ważny, polecający nie powinien być sprawdzany. Brak wiarygodności stron odsyłających jest jednym z powodów, dla których stosuje się nonces. Jednostki zewnętrzne całkowicie zastępują sprawdzanie strony odsyłającej. Jedyny raz, kiedy sprawdzamy stronę odsyłającą, jest podczas obsługi warunku zgodności z poprzednimi wersjami -1. -1 oznacza, że ​​ktoś nie używa nonces, więc wracamy do sprawdzania stron odsyłających. To użycie jest teraz bardzo rzadkie. check_admin_referer () jest teraz źle nazwany, ponieważ prawie nigdy nie sprawdza odsyłaczy. Lepiej byłoby nazwać go czymś w rodzaju check_nonce (), ale zachowujemy to tak, jak jest dla wstecznej kompatybilności i starych czasów.

Tak więc nie ma różnicy.


Dobra robota z kopania, dzięki, która daje trochę przejrzystości.
Jeff

5
W rzeczywistości istnieje jedna duża różnica, która wpływa na użycie ... check_admin_referer zabija cały skrypt za pomocą die (), jeśli nonce jest niepoprawny, podczas gdy wp_verify_nonce zwraca false. Więc jeśli istnieją pewne normalne okoliczności, w których jednorazowy błąd się nie powiedzie, użyj wp_verify_nonce, aby reszta skryptu nadal była wykonywana.
SeventhSteel

@SeventhSteel - oczywiście masz rację. Moją interpretacją tego pytania było porównanie logiki sprawdzania noncesów, a nie tego, co dzieje się, gdy jest nieważne
Stephen Harris

3

NIE!!!

Nie licz na to check_admin_referer, bądź ostrożny!

  • Obejmuje to wp_verify_nonetylko w przypadku, gdy _wpnoncezostał ustawiony !!!
  • W takim przypadku tak nie jest DIE(). Zamiast tego zwraca wartość false ...

Przejrzyj ten phseudokod ( pełne źródło jest tutaj ):

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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.