Làm thế nào để xác minh nonce hoạt động?


14

Tôi có thể thấy rằng wp_nonce_field tạo ra một giá trị trong trường ẩn.

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

Nhưng wp_verify_nonce không sử dụng giá trị đó theo như tôi có thể nói, nhưng tôi có thể sai.

Có vẻ như nó đang sử dụng mã thông báo phiên để xác minh.

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

Vậy thì điểm có thuộc tính giá trị trong trường ẩn là gì?


1
Bạn cũng đã có $noncegiá trị ở đó - séc trả về sai nếu $noncethiếu giá trị.
bạch dương

Vâng, tôi đã thấy điều đó, nhưng nó chỉ kiểm tra nếu nó không trống để nó có thể là bất cứ thứ gì
ed-ta

chúng tôi cũng nhận được $noncegiá trị trong so sánh này:hash_equals( $expected, $nonce )
birgire

Đúng. Tôi đã tập trung vào giá trị.
ed-ta

Câu trả lời:


15

TL; DR

Nói tóm lại, wp_verify_nonce() sử dụng giá trị đó bởi vì nó mong đợi giá trị đó là đối số đầu tiên của nó.

wp_verify_nonce() tranh luận

wp_verify_nonce() nhận được 2 đối số:

  1. $nonce
  2. $action

Giá trị trong trường ẩn ( 'cabfd9e42d'trong ví dụ của bạn) đại diện cho $nonce.

Đối số thứ nhất là nonce và xuất phát từ yêu cầu

Trong thực tế, wp_verify_nonce()phải được sử dụng như vậy:

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

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

Vì vậy, đối số đầu tiên được chuyển đến wp_verify_nonce()chính xác là giá trị hiện diện trong trường ẩn.

Đối số 2: wp_create_nonce()phương thức

Về đối số thứ hai, nó phụ thuộc vào cách bạn xây dựng giá trị nonce.

Ví dụ: nếu bạn đã làm:

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

Sau đó, bạn cần phải làm:

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

Vì vậy, đối số thứ hai là đối số được sử dụng làm đối số wp_create_nonce().

Đối số 2: wp_nonce_field()phương thức

Nếu bạn đã tạo nonce bằng cách sử dụng wp_nonce_field()như:

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

Sau đó, bạn cần xác minh nonce như vậy:

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

Vì vậy, lần này, hành động là bất cứ điều gì được thông qua như là đối số đầu tiên wp_nonce_field().

Tóm tắt

Để vượt qua wp_verify_nonce()xác thực, bạn cần truyền 2 đối số cho hàm, một là giá trị trong trường ẩn nonce, hai là hành động và phụ thuộc vào cách xây dựng giá trị nonce.


4
@birgire Tôi đánh máy như một người chuyên nghiệp :)
gmazzap

2
Ít nhất có một số biên tập viên tiếng Anh chuyên nghiệp trên trang web để giúp chúng tôi đánh máy tiếng Anh không phải là tiếng Anh để dọn dẹp lỗi chính tả của chúng tôi, lol ;-). Giải thích tuyệt vời BTW, +1
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.