", e o número de // WhatsApp usado em enviar_whatsapp.php/obrigado.php) — ou seja, não é // segredo nenhum, é informação pública da própria loja. Isso reduzia a // "checagem de 2 fatores" a, na prática, só precisar adivinhar/saber o // e-mail cadastrado pra sequestrar a conta MASTER da loja inteira (PIX, // gateway de pagamento, todos os dados) — e, pior, a senha temporária // nova já saía pronta na tela pra quem quer que tivesse passado nessa // checagem, sem nunca provar que tinha acesso de verdade ao e-mail. // // Agora, bater email+telefone só dá direito a receber um CÓDIGO de 6 // dígitos por E-MAIL (mesmo padrão/infra já usado em // login/email_solicitar.php e cadastro/enviar_codigo_email.php) — só // depois de confirmar esse código (etapa 5b, abaixo) é que a sessão // ganha permissão de trocar a senha. Isso garante que quem está // mexendo aqui realmente tem acesso à caixa de entrada cadastrada, não // só ao número de telefone público da loja. if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['acao']) && $_POST['acao'] === 'verificar') { $email = isset($_POST['email']) ? trim($_POST['email']) : ''; $telefone = isset($_POST['telefone']) ? preg_replace('/\D/', '', $_POST['telefone']) : ''; if (recuperarTentativasExcedidas($connect)) { $erro = 'Muitas tentativas. Aguarde alguns minutos antes de tentar novamente.'; } elseif (empty($email) || empty($telefone)) { $erro = 'Preencha todos os campos.'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $erro = 'Email inválido.'; } elseif (strlen($telefone) < 10 || strlen($telefone) > 11) { $erro = 'Telefone inválido. Digite apenas números (10 ou 11 dígitos).'; } else { recuperarRegistrarTentativa($connect); try { $stmt = $connect->prepare(" SELECT id, nomeadmin, email, celular FROM config WHERE email = ? AND (celular = ? OR REPLACE(REPLACE(REPLACE(celular, '(', ''), ')', ''), '-', '') = ?) AND status = 1 LIMIT 1 "); $stmt->execute([$email, $telefone, $telefone]); $user = $stmt->fetch(PDO::FETCH_OBJ); if ($user) { $codigo = str_pad((string)random_int(0, 999999), 6, '0', STR_PAD_LEFT); $_SESSION['recuperar_verificacao'] = [ 'user_id' => (int)$user->id, 'email' => $user->email, 'codigo' => $codigo, 'expira' => time() + 600, // 10 minutos 'tentativas' => 0, ]; unset($_SESSION['reset_user_id'], $_SESSION['reset_validated_at']); $cfgSmtp = $connect->query( 'SELECT smtp_host, smtp_porta, smtp_seguranca, smtp_usuario, smtp_senha, smtp_remetente_nome, smtp_remetente_email, nome_plataforma FROM plataforma_config WHERE id = 1' )->fetch(PDO::FETCH_OBJ); if (empty($cfgSmtp->smtp_host)) { // Sem SMTP configurado na plataforma não há como provar // que quem está aqui tem acesso ao e-mail — não dá pra // continuar (voltar ao antigo modo inseguro anularia a // correção acima). unset($_SESSION['recuperar_verificacao']); $erro = 'Recuperação por e-mail está temporariamente indisponível. Entre em contato com o suporte.'; } else { $nomePlataforma = $cfgSmtp->nome_plataforma ?? 'a plataforma'; $corpo = "Seu código para redefinir a senha é: $codigo\n\n" . "Ele expira em 10 minutos. Se você não pediu essa recuperação, pode ignorar este e-mail — sua conta continua segura."; $envio = masterEnviarEmailSmtp($cfgSmtp, $user->email, "Código para redefinir sua senha — $nomePlataforma", $corpo); if ($envio['ok']) { $modo = 'codigo'; } else { unset($_SESSION['recuperar_verificacao']); $erro = 'Não foi possível enviar o e-mail agora. Tente novamente em instantes.'; } } } else { $erro = 'Dados não encontrados. Verifique email e telefone cadastrados.'; } } catch (\Throwable $e) { $erro = 'Erro ao verificar dados. Tente novamente.'; } } } // ================================================================ // 5b. CONFIRMAR CÓDIGO ENVIADO POR E-MAIL // ================================================================ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['acao']) && $_POST['acao'] === 'confirmar_codigo') { $verificacao = $_SESSION['recuperar_verificacao'] ?? null; $codigoDigitado = isset($_POST['codigo']) ? trim($_POST['codigo']) : ''; if (!recuperarCsrfValido() || !$verificacao) { $erro = 'Verificação expirada. Refaça a verificação de email e telefone.'; $modo = 'form'; } elseif (time() > $verificacao['expira']) { unset($_SESSION['recuperar_verificacao']); $erro = 'Esse código expirou. Refaça a verificação de email e telefone.'; $modo = 'form'; } elseif ($verificacao['tentativas'] >= 5) { unset($_SESSION['recuperar_verificacao']); $erro = 'Muitas tentativas erradas. Refaça a verificação de email e telefone.'; $modo = 'form'; } else { $_SESSION['recuperar_verificacao']['tentativas']++; if (hash_equals($verificacao['codigo'], $codigoDigitado)) { $_SESSION['reset_user_id'] = $verificacao['user_id']; $_SESSION['reset_validated_at'] = time(); $userId = $verificacao['user_id']; unset($_SESSION['recuperar_verificacao']); $modo = 'validado'; } else { $restantes = 5 - $_SESSION['recuperar_verificacao']['tentativas']; $erro = $restantes > 0 ? "Código incorreto. Você tem mais {$restantes} tentativa(s)." : 'Código incorreto. Peça um novo.'; $modo = 'codigo'; } } } $recuperarCsrf = recuperarCsrfToken(); // ================================================================ // 6. HTML DA PÁGINA // ================================================================ ?> Recuperar Senha - Sistema de Pedidos

Recuperar Senha

Informe seus dados para recuperar o acesso

Digite apenas números (DDD + número)