AJAX-为什么多次调用wp_create_nonce()会返回相同的值?

时间:2011-04-14 作者:Gabriele B

我在使用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的第二次调用会返回相同的字符串?

1 个回复
最合适的回答,由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”作为某些不同操作的操作名称,您希望能够单独检查这些操作-也许您可以为尝试执行和授权的每个操作使用更具体的操作名称。

结束

相关推荐

如何使用AJAX Submit创建附件ID?无页面刷新

我知道我以前也这样做过,使用一个前端post表单,它使用Ajax将表单数据发送到一个php脚本,该脚本使用wp\\u insert\\u post(),然后在显示成功消息后重定向到该帖子,但我不知道如何使用附件。我想做的是有点难以解释。让我试试。我有一个metabox,您可以使用jquery添加/删除附件,以添加或删除另一组输入,然后从站点中删除该文件。那东西有用。我想做的是,当您添加一组新的输入时,填写信息,选择要上载的图像文件,然后单击该组输入的保存(每组都有自己的保存按钮)。保存按钮有一个Ajax脚