更新日期:2022-09-30

nonce 是一串由數字和字母組成的散列,用於幫助保護 URL 和表單免受某些類型的濫用、惡意或其他方式的影響。他被產生時不是只使用一次,而是有一個有限的生命週期,之後它們就會過期。他常用於放在 url 參數上,在後端接收參數時順便驗證是否合法。

用在網址上

你的網址可以這樣子帶參數

$nonce = wp_create_nonce( 'my_nonce' );
echo "<a href='myplugin.php?action=foo&_wpnonce={$nonce}'>Save Something</a>";

或是這樣子直接產生一個網址

echo '<a href="' . wp_nonce_url( 'myplugin.php?action=foo', 'my_nonce', '_wpnonce' ) . '">Save Something</a>';

後端用 wp_verify_nonce() 來驗證,如果驗證結果返回 false,表示驗證不通過,程式中斷並送出 “403 Forbidden”。

wp_verify_nonce( $_REQUEST['_wpnonce'], 'my_nonce' );

用在表單上

在寫後端外掛常常會用到輸入表單,所以就會資料的傳入驗證。我們可以在 Form 裡面加上這一行:

wp_nonce_field( 'delete-comment_'.$comment_id );

他會自動產生像這樣子的隱藏欄位

<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />

接收表單的資料時,用 check_admin_referer() 驗證 nonce 是否合法正確。

check_admin_referer( 'delete-comment_'.$comment_id );

用於 Ajax 驗證

一樣方式建立 url

$nonce = wp_create_nonce( 'my_nonce' );
echo "<a href='myplugin.php?action=foo&_wpnonce={$nonce}'>Save Something</a>";

驗證的函數 check_ajax_referer()

check_ajax_referer( 'my_nonce', '_wpnonce' );

驗證結果返回值

check_admin_referer() 和 check_ajax_referer() 都是 wp_verify_nonce() 的延伸,所以三種返回值都是一樣。
如果 nonce 有效且在 0-12 小時前生成,則為 1,如果 nonce 有效且在 12-24 小時前生成,則為 2。如果 nonce 無效,則為 False。)

相關資訊: https://codex.wordpress.org/WordPress_Nonces