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;
}
T.Todua
источник