WordPress中的Nonce

Nonce是number used once的縮寫,Wordpress的nonce不是數字,而一是串由數字和字符組成的Hash值,不只只能使用一次,還同時具備生命週期(lifetime),在生命週期內,針對每一個用戶,一樣的參數會生成一樣的nonce值,直到生命週期結束。這篇文章咱們就來介紹一下如何用Nonce來防止CSRF攻擊。javascript

建立一個Noncephp

Nonce能夠被放在Url請求中,也能夠放在一個Form的Hidden元素中,而後在Ajax請求時,經過Javascript來獲取他它。一個Nonce生命週期只在當前Session中,若是你退出登陸後再次登陸,以前的nonce也都會失效。java

向URL中添加nonceajax

你能夠經過wp_nonce_url()方法來向Url中添加一個Nonce:post

wp_nonce_url( $actionurl, $action, $name );
// 例如:
$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID );

其中$bare_url(必選)爲要添加nonce的url,而$action爲爲nonce定義的動做名字,可選,默認爲-1。url

默認狀況下,生成的nonce在連接中的名字爲_wpnonce,爲了不可能的衝突,在Wordpress3.6版本後,wp_nonce_url增長了可選的$name參數,可讓用戶本身指定nonce在連接中的名字。如:插件

$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID, 'my_nonce' );

向Form中添加noncecode

你能夠能過wp_nonce_field()方法向表單中添加一個hidden元素:orm

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

調用上面的方法,會生成相似下面的代碼:生命週期

<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爲可選參數,默認爲-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無效,是否結束腳本執行。(默認爲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 );
相關文章
相關標籤/搜索