我在使用ajax提交表单时遇到了一些问题。
首先,我创建一个nonce并将其传递给我注册的脚本,然后将其发送给包含表单字段的ajax处理程序:
wp_localize_script( \'roll_script\', \'Roll\', array(
\'postRollNonce\' => wp_create_nonce(\'nonce-roll\')));
在我的ajax响应处理程序中,我验证nonce,完成我的工作,并尝试创建一个新的nonce以发送回js,以便稍后提交:
function on_ajax_roll(){
if (!wp_verify_nonce($_POST[\'postRollNonce\'], \'nonce-roll\' )) die (\'No allowed!\');
// nonce is valid! do some stuff...
$r = array(\'postRollNonce\' => wp_create_nonce(\'nonce-roll\'));
$response = json_encode($r);
header( "Content-Type: application/json" );
echo $response;
die();
}
。。。但是,回到我的js,新的nonce与旧的完全相同!既然nonce应该随时间变化,为什么对wp\\u create\\u nonce的第二次调用会返回相同的字符串?
最合适的回答,由SO网友:goldenapples 整理而成
默认情况下,nonce的生存期为一天。nonce是通过连接表示当前日期、用户id和操作名称的变量,并对结果字符串进行散列来生成的。
如果要更频繁地更改nonce值,可以过滤“nonce\\u life”值。例如,此函数将强制nonces每小时更改一次:
function nonce_hourly() {
return 3600;
}
add_filter( \'nonce_life\', \'nonce_hourly\' );
但这听起来也不像你想做的。通过为nonce的“action”值使用不同的名称,可以更好地生成所需的一次性nonce,该名称对于您尝试执行的特定操作来说是唯一的。看起来您正在使用“nonce roll”作为某些不同操作的操作名称,您希望能够单独检查这些操作-也许您可以为尝试执行和授权的每个操作使用更具体的操作名称。