很明显,表单提交和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...
});
});
最合适的回答,由SO网友:DarkNeuron 整理而成
我知道这个问题很古老,但不,它不是很安全。
任何了解AJAX端点的人都能够生成有效的nonce,这首先就违背了目的。
尽管如此,nonces首先是一种低级别防御:它们只会阻止最简单的攻击。一个聪明的攻击者会从一开始就抓取你的主页,并吃掉所有的nonce(这些天的默认寿命为24小时),然后只使用该nonce进行攻击。您的AJAX端点只会使该任务稍微容易一些。
编辑
正如Janh所指出的,只要nonce是特定于用户的,这意味着nonce只适用于特定的用户,如果是这样,ajax生成的nonce就可以了。不过,您可能需要通过AJAX端点发送更多的信息,因此返回的nonce与正确的用户相关联。