wp_verify_nonce vs check_admin_referer


21

Яка різниця, яку я повинен використовувати?

Я знаю, що wp_verify_nonce перевіряє часовий ліміт, а check_admin_referer я думаю, що дзвонить wp_verify_nonce, а також перевіряє, чи є сегмент URL-адреси адміністратора, але я трохи розгублений, який саме я повинен використовувати і коли.

Дякую за ясність.


1
Бейджі для цього питання? У самому справі? Хтось?
Джефф

Відповіді:


29

Я думав , що check_admin_refererперевірив випадкове слово (це робить виклик wp_verify_nonce, і посилається URL Після того, як заглибитися в основний код , я зрозумів , що він не робив цього Думаючи , що це була помилка , я повідомив про це, і Райан Boren відповів наступне ..:

Насправді, якщо значення не є дійсним, референт не повинен перевірятися. Ненадійність референтів є однією з причин того, що не використовуються. Листощі замінюють перевірку реферала повністю. Єдиний раз, коли ми перевіряємо реферала, це при обробці -1 умовою сумісності назад. -1 означає, що хтось не використовує значень, тому ми повертаємось до перевірки реферала. Це використання зараз дуже рідкісне. check_admin_referer () погано названо тепер, коли він майже ніколи не здійснює перевірку реферала. Краще було б назвати щось на кшталт check_nonce (), але ми зберігаємо це так, як це робиться задньою компатою та заради старих часів.

Тож насправді різниці немає.


Приємна робота з копанням, дякую, що приносить деяку чіткість.
Джефф

5
Насправді є одна велика різниця, яка впливає на використання ... check_admin_referer вбиває весь скрипт die (), якщо значення не є дійсним, тоді як wp_verify_nonce повертає значення false. Отже, якщо існують певні нормальні обставини, при яких не виходить з ладу, використовуйте wp_verify_nonce, щоб решта сценарію все-таки виконувалася.
СьомийСтейль

@SeventhSteel - ти, звичайно, маєш рацію. Моє тлумачення питання полягало в тому, що логіка перевірки понять порівнюється, а не те, що відбувається, коли її недійсний
Стівен Харріс

3

НІ!!!

Не розраховуйте check_admin_referer, будьте обережні!

  • Він включає wp_verify_noneлише той випадок, коли _wpnonceвстановлено !!!
  • У цьому випадку це не так DIE(). Замість цього він повертає помилкове ...

Подивіться цей фсевдо-код ( повне джерело тут ):

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.