Bagaimana cara kerja verifikasi nonce?

14

Saya dapat melihat bahwa wp_nonce_field menghasilkan nilai di bidang tersembunyi.

<input type="hidden" id="message-send" name="message-send" value="cabfd9e42d" />

Tapi wp_verify_nonce tidak menggunakan nilai itu sejauh yang saya tahu, tapi saya mungkin salah.

Sepertinya menggunakan token sesi untuk verifikasi.

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
 if ( hash_equals( $expected, $nonce ) ) 
  { return 1;  }

Lalu apa gunanya memiliki atribut nilai di bidang tersembunyi?

ed-ta
sumber
1
Anda juga mendapat $noncenilai di sana - cek mengembalikan false jika $noncenilainya hilang.
birgire
Ya, saya melihat itu, tetapi hanya memeriksa apakah tidak kosong sehingga bisa apa saja
ed-ta
kami juga mendapat $noncenilai dalam perbandingan ini:hash_equals( $expected, $nonce )
birgire
Itu benar. Saya fokus pada nilai.
ed-ta

Jawaban:

15

TL; DR

Singkatnya, wp_verify_nonce() gunakan nilai itu karena mengharapkan nilai itu sebagai argumen pertama.

wp_verify_nonce() argumen

wp_verify_nonce() menerima 2 argumen:

  1. $nonce
  2. $action

Nilai dalam bidang tersembunyi ( 'cabfd9e42d'dalam contoh Anda) mewakili $nonce.

Argumen pertama adalah yang pertama, dan berasal dari permintaan

Bahkan, wp_verify_nonce()harus digunakan seperti ini:

// here I assume that the form is submitted using 'post' as method

$verify = wp_verify_nonce($_POST['message-send']);

Jadi argumen pertama yang diteruskan wp_verify_nonce()adalah persis nilai yang ada di bidang tersembunyi.

Argumen ke-2: wp_create_nonce()metode

Mengenai argumen kedua, itu tergantung pada bagaimana Anda membangun nilai nonce.

Misal jika Anda melakukannya:

<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />

Maka yang perlu Anda lakukan:

$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );

Jadi, argumen kedua adalah apa yang digunakan sebagai argumen wp_create_nonce().

Argumen ke-2: wp_nonce_field()metode

Jika Anda membuat nonce menggunakan wp_nonce_field()like:

wp_nonce_field( 'another_action', 'message-send' );

Maka Anda perlu memverifikasi nonce seperti:

$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );

Jadi, kali ini, tindakan adalah apa pun yang dilewati sebagai argumen pertama wp_nonce_field().

Rekap

Untuk lulus wp_verify_nonce()validasi, Anda harus melewati 2 argumen ke fungsi, satu adalah nilai di bidang tersembunyi nonce, yang lain adalah tindakan , dan tergantung pada bagaimana nilai nonce dibangun.

gmazzap
sumber
4
@Birgire Saya melakukan kesalahan ketik seperti pro :)
gmazzap
2
Setidaknya ada beberapa editor bahasa Inggris pro di situs untuk membantu kami para pengetik bahasa Inggris non-pribumi membersihkan kesalahan ketik kami, lol ;-). Penjelasan hebat BTW, +1
Pieter Goosen