wp_verify_nonce vs check_admin_referer

21

Apa bedanya, mana yang harus saya gunakan?

Saya tahu bahwa wp_verify_nonce memeriksa batas waktu, dan check_admin_referer saya pikir panggilan wp_verify_nonce serta memeriksa segmen admin url, tapi saya agak bingung di mana yang harus saya gunakan dan kapan.

Terima kasih atas kejelasannya.

Jeff
sumber
1
Lencana Tumbleweed untuk pertanyaan ini? Sangat? Siapa saja?
Jeff

Jawaban:

29

Saya berpikir bahwa check_admin_referermemeriksa Nonce (itu tidak panggilan wp_verify_nonce, dan url merujuk Setelah menggali ke dalam kode inti saya menyadari bahwa itu tidak melakukan hal ini Berpikir itu bug Saya melaporkan, dan Ryan Boren menjawab dengan berikut..:

Sebenarnya, jika nonce valid, pengarah tidak harus diperiksa. Rujukan yang tidak dapat diandalkan adalah salah satu alasan penggunaan nonces. Nonces menggantikan pengecek referensi sepenuhnya. Satu-satunya waktu kami memeriksa pengarah adalah ketika menangani kondisi kompatibilitas mundur -1. -1 berarti seseorang tidak menggunakan nonces sehingga kami kembali ke pengecekan perujuk. Penggunaan ini sekarang sangat jarang. check_admin_referer () diberi nama buruk karena hampir tidak pernah memeriksa perujuk. Akan lebih baik dinamai sesuatu seperti check_nonce (), tapi kami tetap menggunakannya untuk back compat dan dulu.

Jadi sebenarnya tidak ada perbedaan.

Stephen Harris
sumber
Pekerjaan penggalian yang bagus, terima kasih, itu memberikan kejelasan.
Jeff
5
Sebenarnya ada satu perbedaan besar yang memengaruhi penggunaan ... check_admin_referer membunuh seluruh skrip dengan die () jika nonce tidak valid, sedangkan wp_verify_nonce mengembalikan false. Jadi jika ada keadaan normal tertentu di mana nonce akan gagal, gunakan wp_verify_nonce sehingga sisa skrip masih dijalankan.
SeventhSteel
@ SeventhSteel - Anda tentu saja benar. Interpretasi saya terhadap pertanyaan ini adalah bahwa logika memeriksa nonces dibandingkan daripada apa yang terjadi ketika tidak valid
Stephen Harris
3

TIDAK!!!

Dont mengandalkan check_admin_referer, Hati-hati!

  • Ini termasuk wp_verify_nonehanya dalam kasus ketika _wpnoncediatur !!!
  • Dalam hal itu, tidak DIE(). Sebaliknya, ia mengembalikan false ...

Lihat melalui kode-phseudo ini ( sumber lengkap ada di sini ):

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
sumber