Nonces and Cache

时间:2013-11-18 作者:gyo

很明显,表单提交和AJAX请求,尤其是合理的请求,需要“nonces”来避免某些攻击。然而,随着高速缓存系统的大量使用,很难生成它们并输出新的nonce而不是高速缓存的nonce。

为了解决这个问题,我考虑创建一个AJAX函数,返回一个新的nonce,在提交表单之前进行请求。然后,此nonce将作为隐藏字段附加到表单中。

你认为这是一种安全的方法吗?

返回新nonce的PHP函数:

function create_nonce() {
    return wp_create_nonce(\'my-nonce\');
}

add_action(\'wp_ajax_create_nonce\', \'create_nonce\');
add_action(\'wp_ajax_nopriv_create_nonce\', \'create_nonce\');
提交表单(request() 是我创建的一个自定义函数,可轻松发出ajax请求):

$(\'form\').on(\'submit\', function(e){
    e.preventDefault();
    var $form = $(this);

    request(\'create_nonce\', function(nonce){
         // Append the fresh nonce to the form
         $form.append(\'<input type="hidden" name="nonce" value="\'+nonce+\'">\');

         // Proceed with the form submission...
    });
});

1 个回复
最合适的回答,由SO网友:DarkNeuron 整理而成

我知道这个问题很古老,但不,它不是很安全。

任何了解AJAX端点的人都能够生成有效的nonce,这首先就违背了目的。

尽管如此,nonces首先是一种低级别防御:它们只会阻止最简单的攻击。一个聪明的攻击者会从一开始就抓取你的主页,并吃掉所有的nonce(这些天的默认寿命为24小时),然后只使用该nonce进行攻击。您的AJAX端点只会使该任务稍微容易一些。

编辑

正如Janh所指出的,只要nonce是特定于用户的,这意味着nonce只适用于特定的用户,如果是这样,ajax生成的nonce就可以了。不过,您可能需要通过AJAX端点发送更多的信息,因此返回的nonce与正确的用户相关联。

结束

相关推荐

使用wp_ajax和wp_ajax_nopriv挂接

我想发送一个ajax请求,如果用户登录,我想处理它。因此,我想使用以下两个挂钩,但我不确定是否正确使用了它们。使用相同的功能是否正确take_action_function 对于两个挂钩,然后检查该功能是否用户已登录?或者我应该创建two different functions, 一个用于执行操作,另一个仅用于返回用户应登录的消息?add_action(\'wp_ajax_nopriv_test-action\', \'take_action_function\'); add_action(\'w