下面由WordPress教程欄目給大家介紹關于wordpress中的nonce,希望對需要的朋友有所幫助!
WordPress中的Nonce
Nonce是number used once的縮寫,Wordpress的nonce不是數(shù)字,而一是串由數(shù)字和字符組成的Hash值,不僅只能使用一次,還同時具有生命周期(lifetime),在生命周期內(nèi),針對每個用戶,同樣的參數(shù)會生成同樣的nonce值,直到生命周期結束。這篇文章我們就來介紹一下如何用Nonce來防止csrf攻擊。
創(chuàng)建一個Nonce
Nonce可以被放在Url請求中,也可以放在一個Form的Hidden元素中,然后在ajax請求時,通過JavaScript來獲取他它。一個Nonce生命周期只在當前Session中,如果你退出登錄后再次登錄,之前的nonce也都會失效。
向URL中添加nonce
你可以通過wp_nonce_url()方法來向Url中添加一個Nonce:
wp_nonce_url( $actionurl, $action, $name ); // 例如: $complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID );
其中$bare_url(必選)為要添加nonce的url,而$action為為nonce定義的動作名字,可選,默認為-1。
默認情況下,生成的nonce在鏈接中的名字為_wpnonce,為了避免可能的沖突,在Wordpress3.6版本后,wp_nonce_url增加了可選的$name參數(shù),可以讓用戶自己指定nonce在鏈接中的名字。如:
$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID, 'my_nonce' );
向Form中添加nonce
你可以能過wp_nonce_field()方法向表單中添加一個hidden元素:
PHP wp_nonce_field( $action, $name, $referer, $echo ) //例如 : wp_nonce_field( 'delete-comment_'.$comment_id ); wp_nonce_field( $action, $name, $referer, $echo ) //例如 : wp_nonce_field( 'delete-comment_'.$comment_id );
調(diào)用上面的方法,會生成類似下面的代碼:
<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" /> <input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />
單獨生成一個nonce
如果你只是想要生成一個獨立的nonce,可以過wp_create_nonce()方法:
wp_create_nonce( $action ); // 例如: $nonce = wp_create_nonce( 'my-action_'.$post->ID );
同樣的,$action為可選參數(shù),默認為-1。上面的方法會返回類似“295a686963”的結果。
驗證nonce有效性
驗證表單中的nonce
在Admin管理界面,你可以通過check_admin_referer方法來驗證Url中Nonce的有效性:
check_admin_referer( $action, $query_arg );
下面是一個例子演示如何在插件中使用check_admin_referer驗證nonce:
<form method="post"> <!-- some inputs here --> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> </form>
驗證方法:
check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' );
驗證Ajax中的nonce
如果要檢查Ajax請求中的nonce有效性,可以使用check_ajax_referer()方法:
check_ajax_referer( $action, $query_arg, $die )
$die指定如果$nonce無效,是否結束腳本執(zhí)行。(默認為True)
一個簡單使用check_ajax_referer的例子:
<?php //Set Your Nonce $ajax_nonce = wp_create_nonce( "my-special-string" ); ?> <script type="text/javascript"> jQuery(document).ready(function($){ var data = { action: 'my_action', security: '<?php echo $ajax_nonce; ?>', my_string: 'Hello World!' }; $.post(ajaxurl, data, function(response) { alert("Response: " + response); }); }); </script>
在向后通過下面的代碼進行驗證:
add_action( 'wp_ajax_my_action', 'my_action_function' ); function my_action_function() { check_ajax_referer( 'my-special-string', 'security' ); echo sanitize_text_field( $_POST['my_string'] ); wp_die(); }
驗證獨立生成的nonce
1 wp_verify_nonce( $nonce, $action );