關於WordPress中的Nonce詳解

藏色散人
發布: 2021-03-12 11:40:48
轉載
4639 人瀏覽過

以下由WordPress教學專欄為大家介紹關於WordPress中的Nonce,希望對需要的朋友有幫助!

WordPress中的Nonce

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

建立一個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參數,可以讓使用者自己指定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 );
登入後複製

調用上面的方法,會產生類似下面的程式碼:

<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( &#39;name_of_my_action&#39;, &#39;name_of_nonce_field&#39; ); ?>
</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 );
登入後複製

以上是關於WordPress中的Nonce詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!