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。)