Verificação de Nonce — Proteger formulários contra CSRF

Time Full Services Time Full Services
Tipo Segurança
Nome do erro Verificação de Nonce — Proteger formulários contra CSRF
Severidade Crítico
Desde WordPress 2.0
Descrição Nonces (numbers used once) protegem formulários e ações do WordPress contra ataques CSRF, garantindo que a requisição originou de uma fonte legítima.

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;
});

Seja PRO.

Tenha acesso a snippets de código premium — PHP, JavaScript, CSS e HTML prontos para usar em seus projetos.

Conhecer o plano Pro →