Verificação de Nonce — Proteger formulários contra CSRF
Causa
Sem verificação de nonce, qualquer site malicioso pode forçar um usuário logado a executar ações em seu WordPress através de formulários ou links forjados.
Como resolver
Gere nonces com wp_create_nonce() e verifique com wp_verify_nonce() ou check_admin_referer(). Use nonces específicos por ação para maior granularidade.
PHP
<?php
// ── GERAR NONCE NO FORMULÁRIO ──────────────────────────────────
function meu_formulario_html(): string
{
$nonce = wp_create_nonce('salvar_perfil_' . get_current_user_id());
return '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '">
<input type="hidden" name="action" value="salvar_perfil">
<input type="hidden" name="_nonce" value="' . esc_attr($nonce) . '">
<input type="text" name="nome" value="' . esc_attr(wp_get_current_user()->display_name) . '">
<button type="submit">Salvar</button>
</form>';
}
// ── VERIFICAR NO HANDLER ───────────────────────────────────────
add_action('admin_post_salvar_perfil', function (): void {
$nonce = sanitize_text_field(wp_unslash($_POST['_nonce'] ?? ''));
if (!wp_verify_nonce($nonce, 'salvar_perfil_' . get_current_user_id())) {
wp_die('Ação não autorizada.', 'Erro de segurança', ['response' => 403]);
}
if (!current_user_can('edit_profile')) {
wp_die('Sem permissão.', 'Acesso negado', ['response' => 403]);
}
$nome = sanitize_text_field(wp_unslash($_POST['nome'] ?? ''));
wp_update_user(['ID' => get_current_user_id(), 'display_name' => $nome]);
wp_safe_redirect(add_query_arg('saved', '1', wp_get_referer()));
exit;
});