当前浏览:首页 / WordPress函数 / wp_verify_nonce()

wp_verify_nonce( string $nonce, string|int $action = -1 )

验证是否在有时间限制的情况下使用了正确的安全nonce

nonce 令牌

verify


描述

Nonce 有效期为24小时(默认情况下)。


参数

$nonce

(string) (必填) 用于验证的Nonce值,通常通过表单字段。

$action

(string|int) (可选) 应该为正在发生的事情提供上下文,并与创建nonce时保持一致。

默认值: -1


返回

(int|false) 如果nonce有效并且在0-12小时之前生成返回1,如果nonce有效并且在12-24小时之前生成返回2。如果nonce无效,则为False。


说明

该函数用于验证当前请求中发送的nonce,该请求通常由$_REQUESTPHP变量访问。

不应依赖nonce进行身份验证或授权、访问控制。使用current_user_can()保护您的函数,始终假设nonce可以被破坏。



源码

查看源码 官方文档


更新日志

版本描述
2.0.3开始引入

使用示例

  • 示例1

    示例
    验证用wp_create_nonce()创建的nonce:

    <?php
    // Step A: Create an nonce, and add it as a query var in a link to perform an action.
    $nonce = wp_create_nonce( 'my-nonce' );
    echo "<a href='myplugin.php?_wpnonce={$nonce}'>" . __( 'Save Something', 'textdomain' ) . "</a>";
    ?>
    
    // Step B: In our file that handles the request, verify the nonce.
    $nonce = $_REQUEST['_wpnonce'];
    if ( ! wp_verify_nonce( $nonce, 'my-nonce' ) ) {
    	die( __( 'Security check', 'textdomain' ) ); 
    } else {
    	// Do stuff here.
    }
    

    您还可以根据nonce的创建时间长短决定采取不同的行动:

    $nonce = wp_verify_nonce( $nonce, 'my-nonce' );
    switch ( $nonce ) {
    	case 1:
    		echo 'Nonce is less than 12 hours old';
    		break;
    	case 2:
    		echo 'Nonce is between 12 and 24 hours old';
    		break;
    	default:
    		exit( 'Nonce is invalid' );
    }
    
  • 示例2

    根据WordPress编码标准,这是验证nonce的方法:

    if ( isset( $_REQUEST['_wpnonce'] ) && wp_verify_nonce( $_REQUEST['_wpnonce'], 'wpdocs-my-nonce' ) ) {
      
      //do you action
      
    } else {
    
      die( __( 'Security check', 'textdomain' ) ); 
    
    }
    
    
  • 示例3

    该系统不太准确,关于返回值的注释不正确。值1表示 < 12小时,但2表示从1秒到 < 24小时。

    观察一天内nonce tick值的变化:

    local time ~~~ seconds since epoch ~~~ tick
    2021-05-20T00:00:00+03:00 ~~~ 1621458000 ~~~ 37534
    2021-05-20T01:00:00+03:00 ~~~ 1621461600 ~~~ 37534
    2021-05-20T02:00:00+03:00 ~~~ 1621465200 ~~~ 37534
    2021-05-20T03:00:00+03:00 ~~~ 1621468800 ~~~ 37534
    2021-05-20T04:00:00+03:00 ~~~ 1621472400 ~~~ 37535
    2021-05-20T05:00:00+03:00 ~~~ 1621476000 ~~~ 37535
    2021-05-20T06:00:00+03:00 ~~~ 1621479600 ~~~ 37535
    2021-05-20T07:00:00+03:00 ~~~ 1621483200 ~~~ 37535
    2021-05-20T08:00:00+03:00 ~~~ 1621486800 ~~~ 37535
    2021-05-20T09:00:00+03:00 ~~~ 1621490400 ~~~ 37535
    2021-05-20T10:00:00+03:00 ~~~ 1621494000 ~~~ 37535
    2021-05-20T11:00:00+03:00 ~~~ 1621497600 ~~~ 37535
    2021-05-20T12:00:00+03:00 ~~~ 1621501200 ~~~ 37535
    2021-05-20T13:00:00+03:00 ~~~ 1621504800 ~~~ 37535
    2021-05-20T14:00:00+03:00 ~~~ 1621508400 ~~~ 37535
    2021-05-20T15:00:00+03:00 ~~~ 1621512000 ~~~ 37535
    2021-05-20T16:00:00+03:00 ~~~ 1621515600 ~~~ 37536
    2021-05-20T17:00:00+03:00 ~~~ 1621519200 ~~~ 37536
    2021-05-20T18:00:00+03:00 ~~~ 1621522800 ~~~ 37536
    2021-05-20T19:00:00+03:00 ~~~ 1621526400 ~~~ 37536
    2021-05-20T20:00:00+03:00 ~~~ 1621530000 ~~~ 37536
    2021-05-20T21:00:00+03:00 ~~~ 1621533600 ~~~ 37536
    2021-05-20T22:00:00+03:00 ~~~ 1621537200 ~~~ 37536
    2021-05-20T23:00:00+03:00 ~~~ 1621540800 ~~~ 37536

    …在 tick 的边界上:

    local time ~~~ seconds since epoch ~~~ tick
    2021-05-20T14:59:58+03:00 ~~~ 1621511998 ~~~ 37535
    2021-05-20T14:59:59+03:00 ~~~ 1621511999 ~~~ 37535
    2021-05-20T15:00:00+03:00 ~~~ 1621512000 ~~~ 37535
    2021-05-20T15:00:01+03:00 ~~~ 1621512001 ~~~ 37536
    2021-05-20T15:00:02+03:00 ~~~ 1621512002 ~~~ 37536

    在本例中,您可以看到,由于勾号变化,在下午3点生成并在一秒钟后验证的nonce将返回2。由于tick以世界时为基础,因此tick与时区不对齐,因此在一天的某些时间,非时隙对代码来说总是“旧的”。