PHP 8.2+ v1.0

Documentação SafeNode

Tudo em um só lugar: Quickstart, Guia de Integração, API Reference e Referência de Funções. Use o menu à esquerda ou Ctrl+K para buscar.

Quickstart 5 minutos

Integre a proteção SafeNode em 4 passos simples.

1. Instale o middleware

No início do seu index.php (ou arquivo de entrada):

index.php
<?php
require_once '/caminho/para/safenode/includes/SafeNodeMiddleware.php';
SafeNodeMiddleware::protect();

// Seu código normal
?>

2. Cadastre o site

  1. Acesse o painel SafeNode
  2. Gerenciar SitesAdicionar site
  3. Informe o domínio (ex: seusite.com)
  4. Salve

3. Gere a chave de API (Verificação Humana)

  1. Verificação HumanaAPI Keys
  2. Criar chave → escolha o site
  3. Copie a chave gerada

4. Teste a proteção

Simular ataque (deve bloquear):

Terminal
curl "https://seusite.com/?id=1' OR '1'='1"
# Resposta: 403 Acesso negado

Requisição normal (deve permitir):

curl "https://seusite.com/"
# Resposta: 200 OK

Próximos passos

  • SDK React: npm install @safenode/react e use <SafeNodeProvider>
  • PHP puro: O middleware já protege; ajuste o caminho em require_once
  • WordPress: Use o plugin em sdk/wordpress/

Guia de Integração

Integre a verificação humana do SafeNode em 3 passos.

1. Cadastre seu site

Em Sites, adicione o domínio que deseja proteger (ex: meusite.com). O domínio deve corresponder ao que o usuário acessa (com ou sem www).

2. Crie uma API Key

Em Verificação Humana → API Keys, gere uma chave. Configure os domínios permitidos (separados por vírgula) para restringir o uso.

3. Adicione o código

Modo simples — uma linha (auto-init em todos os formulários):

HTML
<link rel="preconnect" href="https://safenode.cloud">
<script src="https://safenode.cloud//sdk/safenode-hv.js" data-api-key="sk_sua_api_key" async></script>
<form><input name="email"><button type="submit">Enviar</button></form>

Controle manual — use SafeNodeHVConfig ou instância SafeNodeHV(apiBaseUrl, apiKey, options) com attachToForm('#meuFormulario'). Opções: confirmCheckbox, initOnInteraction, silentVerify, performanceRum.

O SDK (JS, React, Vue) carrega automaticamente coleta comportamental e Core Web Vitals (LCP, FCP, CLS) para a página Performance. Documentação completa: Verificação Humana.

Uso em formulários

O SDK injeta automaticamente um campo oculto com o token. Ao enviar o formulário via AJAX ou submit normal, inclua no body:

  • token – valor do campo safenode_hv_token
  • nonce – valor do campo safenode_hv_nonce
  • js_enabled"1"

No backend, chame POST /api/sdk/validate.php com esses dados e a API key. Se retornar success: true, o usuário passou na verificação.

Fluxo recomendado

  1. Usuário carrega a página → SDK chama init automaticamente
  2. Usuário preenche o formulário e envia
  3. Seu backend recebe o form, chama validate com token/nonce/js_enabled
  4. Se validate retornar sucesso → processar o form; senão → rejeitar

Dicas

  • Nunca exponha a API key no frontend de forma que possa ser extraída por terceiros
  • Para formulários via AJAX, garanta que token e nonce sejam enviados no body
  • O token expira; se o usuário demorar muito, peça para recarregar a página

API Reference

Endpoints do SafeNode para verificação humana (Human Verification). Use a API Key no header X-API-Key ou no body.

Base URL

https://safenode.cloud//api/sdk

1. Init – Inicializar desafio

GET /init.php

Retorna um token único para o formulário. O token expira conforme configurado na API key (padrão: 1 hora).

Parâmetros: api_key (obrigatório) – Header X-API-Key ou POST/GET

Resposta 200
{
  "success": true,
  "token": "64 caracteres hex",
  "nonce": "32 caracteres hex",
  "timestamp": 1234567890,
  "max_age": 3600
}

Erros: 401 (API key inválida), 403 (origin não permitido), 429 (rate limit)

2. Validate – Validar verificação

POST /validate.php

Valida o token e o nonce. Opcional: envie fingerprint (quando o front envia) para considerar histórico comportamental.

Body JSON
{
  "api_key": "sua_api_key",
  "token": "token do init",
  "nonce": "nonce do init",
  "js_enabled": "1",
  "fingerprint": "opcional - para histórico comportamental"
}

Erros: 400 (token inválido/expirado ou histórico negativo), 401 (API key inválida), 429 (rate limit)

Rate limiting

Limites por IP e por API key conforme security_level:

  • low: 200 req/min
  • medium: 100 req/min
  • high: 50 req/min
  • under_attack: 20 req/min

Referência de Funções

Referência completa das funções internas do SafeNode. Projetado para máxima performance em triagem de ameaças e gerenciamento de infraestrutura cloud.

Esta documentação cobre os principais métodos utilitários usados em todo o core do SafeNode, desde a conexão segura com o banco de dados até os motores de detecção em tempo real.

Quick Start

Proteção Básica
// 1. Aplicar headers de segurança
require_once 'includes/HVSecurityHeaders.php';
HVSecurityHeaders::apply();

// 2. Proteção completa com middleware
require_once 'includes/SafeNodeMiddleware.php';
SafeNodeMiddleware::protect();

// 3. Conectar ao banco
$db = getSafeNodeDatabase();

// 4. Validar input
$input = $_POST['data'] ?? '';
if (HVSecurityHeaders::detectAttack($input)) {
    http_response_code(403);
    exit;
}

// 5. Sanitizar antes de usar
$clean = HVSecurityHeaders::sanitizeInput($input);

Segurança

Headers HTTP, CSRF, XSS, SQL Injection, Rate Limiting, Threat Detection

Infraestrutura

Conexão PDO, Configuração, Base URL, Validação de Ambiente

Performance

Monitoramento, Métricas, Alertas, Logging, Cache

Infraestrutura Central

PDO|false getSafeNodeDatabase()

Inicializa a conexão PDO com o banco de dados configurado (safend). Usa caching estático interno para evitar múltiplas conexões. Retorna false em caso de erro.

Características: Conexão persistente, tratamento de exceções, timeout de 5 segundos, charset UTF-8MB4, prepared statements desabilitados por padrão.

Usage Example
$db = getSafeNodeDatabase();
if (!$db) {
    die("Erro ao conectar ao banco de dados");
}
$stmt = $db->prepare("SELECT * FROM tabela WHERE coluna = ?");
$stmt->execute([$valor]);
bool safenodeDatabaseExists()

Verifica se o banco de dados safend existe e está acessível.

Usage Example
if (!safenodeDatabaseExists()) {
    error_log("Banco de dados safend não encontrado");
    // Criar banco ou exibir erro
}
string getSafeNodeBaseUrl()

Retorna a URL base do SafeNode detectada automaticamente do ambiente.

string safenode_get_client_ip()

Obtém o IP real do cliente. Compatível com Cloudflare (CF-Connecting-IP), proxies (X-Forwarded-For, X-Real-IP) e REMOTE_ADDR.

Redis|null getSafeNodeRedis()

Retorna instância Redis quando SAFENODE_REDIS_HOST está configurado. Usado para rate limit distribuído. Retorna null se Redis não disponível.

Security Headers

void HVSecurityHeaders::apply()

Aplica todos os headers HTTP de segurança necessários: XSS Protection, Content-Type Options, Frame Options, CSP, HSTS (apenas HTTPS), Referrer Policy, Permissions Policy e Cache Control.

Usage Example
// No início do arquivo PHP
require_once 'includes/HVSecurityHeaders.php';
HVSecurityHeaders::apply();

// Headers aplicados automaticamente:
// - X-XSS-Protection: 1; mode=block
// - X-Content-Type-Options: nosniff
// - X-Frame-Options: DENY
// - Content-Security-Policy: ...
// - Strict-Transport-Security: ... (apenas HTTPS)
// - Referrer-Policy: strict-origin-when-cross-origin
// - Permissions-Policy: geolocation=(), microphone=(), camera=()
// - Cache-Control: no-store, no-cache, must-revalidate
array HVSecurityHeaders::sanitizeInput($input)

Sanitiza e valida input JSON ou arrays recursivamente. Remove caracteres de controle, limita tamanho de strings (10KB) e sanitiza chaves.

Usage Example
$rawInput = json_decode(file_get_contents('php://input'), true);
$clean = HVSecurityHeaders::sanitizeInput($rawInput);

// Remove caracteres de controle e limita tamanho
// Sanitiza chaves para permitir apenas alfanuméricos, underscore e hífen
bool HVSecurityHeaders::validatePayloadSize($maxSize = 10240)

Valida o tamanho do payload HTTP. Retorna false e envia HTTP 413 se exceder o limite (padrão: 10KB).

Usage Example
if (!HVSecurityHeaders::validatePayloadSize(5120)) {
    // Payload maior que 5KB - requisição rejeitada
    exit;
}
bool HVSecurityHeaders::validateApiKeyFormat($apiKey)

Valida formato de API key. Formato esperado: prefixo + caracteres hexadecimais.

Usage Example
$apiKey = $_POST['api_key'] ?? '';
if (!HVSecurityHeaders::validateApiKeyFormat($apiKey)) {
    http_response_code(400);
    echo json_encode(['error' => 'Formato de API key inválido']);
    exit;
}
bool HVSecurityHeaders::validateTokenFormat($token)

Valida formato de token. Deve ser hexadecimal de exatamente 64 caracteres.

void HVSecurityHeaders::logSecurityThreat($ipAddress, $attackType, $input, $userAgent = null, $referer = null, $siteId = null)

Registra ameaça detectada nos logs de segurança.

Uso
// Chamado internamente por detectAttack() quando $logToSecurityTable = true
// Use apenas para registrar ameaças detectadas por outros meios

Detecção de Ameaças

string|null HVSecurityHeaders::detectAttack($input, $logToSecurityTable = true)

Analisa strings em busca de padrões de ataque: SQL Injection, XSS, Command Injection, Path Traversal. Retorna o tipo da ameaça ou null se seguro.

Uso: Sempre sanitize e valide input antes de processar. Use $logToSecurityTable = false para não registrar em contexto de teste.

Usage Example
$userInput = $_POST['search'] ?? '';

$threat = HVSecurityHeaders::detectAttack($userInput);
if ($threat) {
    http_response_code(403);
    echo json_encode([
        'error' => 'Ataque detectado: ' . $threat
    ]);
    exit;
}

// Input seguro, processar normalmente
processSearch($userInput);

Controle de Fluxo

bool HVSecurityHeaders::checkIpRateLimit($ipAddress, $maxRequests = 100, $windowSeconds = 60)

Rate limiting por IP. Prioridade: Redis (distribuído) > banco de dados > arquivo temporário. Retorna false se o limite foi excedido.

Configuração: Defina SAFENODE_REDIS_HOST no .env para rate limit distribuído em múltiplos workers.

Usage Example
// Limitar a 30 requisições por minuto
$ip = $_SERVER['REMOTE_ADDR'];
if (!HVSecurityHeaders::checkIpRateLimit($ip, 30, 60)) {
    http_response_code(429);
    header('Retry-After: 60');
    echo json_encode([
        'error' => 'Rate limit excedido. Tente novamente em 60 segundos.'
    ]);
    exit;
}

// Requisição permitida, continuar processamento

Proteção CSRF

string CSRFProtection::generateToken()

Gera um novo token CSRF criptograficamente seguro (64 caracteres hex) e armazena na sessão com timestamp.

string CSRFProtection::getToken()

Obtém o token CSRF atual da sessão, ou gera um novo se não existir.

bool CSRFProtection::validateToken($token)

Valida o token CSRF usando comparação segura (hash_equals).

Usage Example
// No formulário
$token = CSRFProtection::getToken();
echo '';

// Na validação do POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $token = $_POST['csrf_token'] ?? '';
    if (!CSRFProtection::validateToken($token)) {
        http_response_code(403);
        die('Token CSRF inválido ou expirado');
    }
    // Processar formulário
}
string CSRFProtection::getTokenField()

Retorna HTML do campo hidden com o token CSRF já formatado e escapado.

Usage Example
echo '
'; echo CSRFProtection::getTokenField(); echo ''; echo '
';
bool CSRFProtection::validate()

Valida automaticamente o token de POST ou GET. Retorna false e envia HTTP 403 se inválido.

Sanitização de Input

string XSSProtection::escape(?string $string)

Escapa string para uso em HTML (htmlspecialchars com ENT_QUOTES e UTF-8).

Usage Example
$userInput = $_GET['name'] ?? '';
echo '
' . XSSProtection::escape($userInput) . '
';
string XSSProtection::escapeAttr(?string $string)

Escapa string para uso em atributos HTML.

string XSSProtection::escapeJS(?string $string)

Escapa string para uso em JavaScript (JSON encode).

string XSSProtection::sanitize(?string $string)

Sanitiza string removendo tags HTML e caracteres perigosos.

array XSSProtection::sanitizeArray(array $array)

Sanitiza array recursivamente aplicando sanitização em todos os valores string.

Validação de Dados

bool XSSProtection::email(string $email)

Valida formato de email usando filter_var com FILTER_VALIDATE_EMAIL.

bool XSSProtection::url(string $url)

Valida formato de URL.

bool XSSProtection::domain(string $domain)

Valida formato de domínio.

bool XSSProtection::string($value, int $min = 1, int $max = 255)

Valida string com tamanho mínimo e máximo.

bool XSSProtection::integer($value)

Valida se o valor é um inteiro.

Gerenciamento de Planos

array|null SubscriptionManager::getUserSubscription($userId)

Obtém a subscription ativa do usuário. Se não existir, cria automaticamente um free trial de 14 dias com 10.000 eventos.

Usage Example
$manager = new SubscriptionManager(getSafeNodeDatabase());
$subscription = $manager->getUserSubscription($userId);

if ($subscription) {
    echo "Plano: " . $subscription['plan_type'];
    echo "Eventos usados: " . $subscription['events_used'] . "/" . $subscription['events_limit'];
}
bool SubscriptionManager::canUseEvent($userId)

Verifica se o usuário pode usar um evento (tem cota disponível). Retorna false se a cota foi excedida ou a subscription está inativa.

Usage Example
$manager = new SubscriptionManager(getSafeNodeDatabase());

if (!$manager->canUseEvent($userId)) {
    http_response_code(402);
    echo json_encode(['error' => 'Cota de eventos excedida']);
    exit;
}

// Processar evento
processEvent();
$manager->incrementEvent($userId);
void SubscriptionManager::incrementEvent($userId)

Incrementa o contador de eventos usados do usuário.

array SubscriptionManager::getUsageStats($userId)

Retorna estatísticas de uso: eventos usados, limite, porcentagem, data de reset do ciclo.

array|null SubscriptionManager::createFreeTrial($userId)

Cria free trial de 14 dias com 10.000 eventos para o usuário.

Sistema de Pagamento

Visão Geral

O SafeNode oferece sistema de pagamento integrado suportando PIX e Cartão de Crédito. Processamento seguro com tokenização, confirmação automática e comprovantes em PDF.

Métodos de Pagamento

PIX (Pagamento Instantâneo)

  • Pagamento instantâneo via QR Code ou código "Copia e Cola"
  • Confirmação automática via webhook e polling
  • Disponível 24/7, incluindo finais de semana e feriados
  • Download de comprovante em PDF após confirmação
  • Verificação automática de status a cada 5 segundos

Cartão de Crédito

  • Processamento seguro via tokenização (dados nunca armazenados)
  • Suporte a parcelamento em até 12x
  • Validação em tempo real de dados do cartão
  • Confirmação imediata após processamento
  • Proteção PCI-DSS via processador de pagamentos

Fluxo de Pagamento PIX

  1. Seleção do Plano: Usuário escolhe um plano na página de checkout
  2. Criação da Cobrança: Sistema cria cobrança e gera identificador único
  3. Geração do QR Code: Sistema exibe QR Code e código "Copia e Cola" para pagamento
  4. Pagamento pelo Usuário: Usuário escaneia o QR Code ou copia o código no app do banco
  5. Verificação Automática: Sistema verifica status a cada 5 segundos via polling
  6. Webhook (Opcional): Notificação automática quando pagamento é confirmado
  7. Ativação do Plano: Sistema ativa automaticamente o plano do usuário
  8. Comprovante: Usuário pode baixar o comprovante em PDF

Fluxo de Pagamento Cartão de Crédito

  1. Preenchimento do Formulário: Usuário preenche dados do cartão (número, validade, CVV, nome, CPF)
  2. Tokenização: Dados do cartão são convertidos em token seguro (nunca chegam ao servidor)
  3. Processamento: Pagamento processado via token
  4. Validação: Processador valida e processa a cobrança
  5. Confirmação: Sistema recebe resposta e atualiza status do pagamento
  6. Ativação: Se aprovado, plano é ativado imediatamente

Status de Pagamento

PENDING: Aguardando pagamento
PROCESSING: Processando pagamento
COMPLETED: Pagamento confirmado e plano ativado
REJECTED: Pagamento rejeitado ou cancelado

Segurança e Privacidade

  • Dados Sensíveis: Dados de cartão nunca são armazenados no servidor SafeNode
  • Tokenização: Cartões convertidos em tokens seguros
  • HTTPS: Comunicações criptografadas via SSL/TLS
  • PCI-DSS: Conformidade via processador certificado
  • Webhooks: Notificações validadas antes de processar
  • Logs: Apenas IDs de transação são registrados, nunca dados sensíveis

Informações Técnicas

Identificadores

  • TXID: Identificador único da transação
  • End-to-End ID: Identificador do PIX confirmado
  • Charge ID: Identificador da cobrança de cartão

Endpoints de Pagamento

  • api/payments/status - Verificar status de pagamento
  • api/payments/pix - Criar cobrança PIX
  • api/process-credit-card.php - Processar cartão
  • api/tokenize-card.php - Tokenizar cartão
  • api/download-receipt.php - Comprovante em PDF

Cupons de Desconto

O sistema suporta cupons de desconto que podem ser aplicados durante o checkout:

  • Cupons podem ter desconto percentual ou valor fixo
  • Validade configurável (data de expiração)
  • Limite de uso por usuário ou global
  • Aplicável a planos específicos ou todos os planos
  • Rastreamento de uso e histórico

Troubleshooting

Pagamento PIX não confirma

  • Verifique se o QR Code não expirou (válido por 30 minutos)
  • Confirme se o valor pago corresponde exatamente ao valor da cobrança
  • O sistema verifica automaticamente a cada 5 segundos
  • Se persistir, entre em contato com o suporte

Cartão recusado

  • Verifique se os dados do cartão estão corretos
  • Confirme se há limite disponível no cartão
  • Entre em contato com o banco emissor do cartão
  • Tente novamente com outro cartão

OAuth & IdP (Identity Provider)

O SafeNode oferece dois fluxos OAuth: OAuth legado ("Continuar com SafeNode" para usuários do painel) e IdP ("Entrar com sua empresa" para ecossistemas como KIRVANO, SIRUS, META). O IdP usa usuários provisionados por conta via API.

string OAuthManager::generateAuthorizationCode($userId, $applicationId, $redirectUri, $scope, $state = null)

Gera código de autorização OAuth criptograficamente seguro (32 caracteres hex). Expira em 10 minutos. Verifica rate limiting antes de gerar.

Usage Example
$manager = new OAuthManager(getSafeNodeDatabase());
$code = $manager->generateAuthorizationCode(
    $userId,
    $appId,
    'https://app.com/callback',
    ['read', 'write'],
    $state
);

// Redirecionar para redirect_uri?code=$code&state=$state
header("Location: $redirectUri?code=$code&state=$state");
array|null OAuthManager::exchangeCodeForToken($code, $clientId, $clientSecret, $redirectUri)

Troca código de autorização por access token JWT. Valida credenciais do cliente, código não usado, expiração e redirect URI.

Usage Example
$tokenData = $manager->exchangeCodeForToken(
    $_GET['code'],
    $_POST['client_id'],
    $_POST['client_secret'],
    $_POST['redirect_uri']
);

if ($tokenData) {
    echo json_encode([
        'access_token' => $tokenData['access_token'],
        'token_type' => 'Bearer',
        'expires_in' => 3600,
        'scope' => $tokenData['scope']
    ]);
}
array|null OAuthManager::validateToken($token)

Valida e decodifica token JWT. Retorna dados do usuário e escopos se válido.

array OAuthManager::getUserInfo($token, $requestedScopes = [])

Retorna informações do usuário baseado no token e escopos solicitados. Suporta tokens OAuth legado e IdP.

IdP (Identity Provider)

Para SSO "Entrar com sua empresa", use aplicações IdP em safenode_idp_applications. O fluxo usa OAuthManager::generateIdpAuthorizationCode (confirmação imediata, sem email) e usuários em safenode_idp_users provisionados via API.

array IdPManager::validateApiKey(string $apiKey)

Valida API key de provisionamento. Retorna ['valid' => true, 'account_id' => int] ou ['valid' => false, 'error' => string].

array IdPManager::provisionUser(int $accountId, array $data)

Cria ou atualiza usuário IdP. $data: email, name, password (plain ou hash bcrypt/argon2), picture. Retorna user_id, sub, email, created.

array IdPManager::createApiKey(int $accountId, string $name = 'Provisioning')

Gera nova API key para provisionamento. Retorna api_key (exibida uma vez) e key_id.

void POST /api/oauth/users.php

API de provisionamento. Headers: X-API-Key ou Authorization: Bearer. Body JSON: {"email","name","password","picture"}. Resposta 201: {"success","user_id","sub","email","created"}.

Exemplo cURL
curl -X POST -H "Content-Type: application/json" -H "X-API-Key: idp_xxx" \
  -d '{"email":"user@empresa.com","name":"Nome","password":"senha123"}' \
  https://safenode.cloud/api/oauth/users.php

Interface: oauth-apps.php?tab=idp — criar apps IdP, gerar API keys, provisionar usuários.

Gerenciamento de API Keys

array|null HVAPIKeyManager::generateKey(int $userId, string $name = 'Verificação Humana', ?string $allowedDomains = null, ?int $rateLimit = null, ?int $maxTokenAge = null, string $sdkLanguage = 'javascript')

Gera nova API key para Human Verification. Retorna array com api_key, api_secret e configurações. Armazene o secret com segurança.

Usage Example
$keyData = HVAPIKeyManager::generateKey(
    $userId,
    'Meu App',
    'https://meusite.com',
    60,   // requisições/minuto
    3600, // token expira em 1 hora
    'javascript'
);
// Armazene $keyData['api_key'] e $keyData['api_secret'] com segurança
array|null HVAPIKeyManager::validateKey(string $apiKey, ?string $origin = null)

Valida API key e verifica se o domínio de origem está permitido. Retorna dados da key se válida.

array HVAPIKeyManager::checkRateLimit(int $apiKeyId, string $ipAddress)

Verifica rate limit para API key e IP. Retorna array com allowed (bool) e remaining.

array HVAPIKeyManager::getAllStats(int $apiKeyId, int $userId, ?string $period = '24h')

Retorna estatísticas completas: uso, performance, geolocalização para o período especificado (24h, 7d, 30d).

string HVAPIKeyManager::generateEmbedCode(string $apiKey, string $baseUrl, string $language = 'javascript')

Gera código de integração para JavaScript, React, Vue, Node.js, PHP ou Python.

Verificação Humana SDK

A proteção é baseada em token + nonce validados no backend. Endpoints: init.php (GET — obter token) e validate.php (POST — validar). SDKs: JavaScript, React, Vue, Node.js, PHP (embed ou classe), Python. O script (JS/React/Vue) pode carregar opcionalmente coleta comportamental e Core Web Vitals (LCP, FCP, CLS). Opções: confirmCheckbox, initOnInteraction, silentVerify, performanceRum. Documentação completa em Verificação Humana.

GET api/sdk/init.php

Retorna token e nonce. Requer API key (header X-API-Key). Valida domínio permitido e rate limit.

POST api/sdk/validate.php

Valida token, nonce e js_enabled. Opcional: fingerprint para considerar histórico comportamental. Retorna success ou erro.

POST api/silent-verify.php

Coleta comportamental (mouse, cliques, scroll). Aceita api_key no body para uso via SDK (histórico por API key). Usado por silent-verification.js.

POST api/performance-rum.php

Recebe Core Web Vitals (LCP, FCP, CLS, INP). Body: api_key, url, lcp, fcp, cls. Usado por performance-rum.js; o SDK HV carrega esse script automaticamente.

Performance Monitor

void PerformanceMonitor::start($endpoint = null, $requestMethod = 'GET')

Inicia monitoramento de performance. Registra tempo inicial, memória e endpoint.

array PerformanceMonitor::end()

Finaliza monitoramento e retorna métricas: tempo de resposta, uso de memória, endpoint. Salva no banco se siteId configurado.

Usage Example
$monitor = new PerformanceMonitor(getSafeNodeDatabase(), $siteId);
$monitor->start('/api/endpoint', 'POST');

// Processar requisição
processRequest();

$metrics = $monitor->end();
// $metrics['response_time'] = 0.234
// $metrics['memory_usage'] = 1024000
// $metrics['endpoint'] = '/api/endpoint'
mixed PerformanceMonitor::measure($operation, callable $callback)

Executa callback e mede tempo de execução da operação específica.

Alert Manager

int|false AlertManager::createAlert($siteId, $alertType, $severity, $title, $message, $data = null)

Cria alerta no sistema. Verifica preferências do usuário antes de enviar notificações. Tipos: attack_detected, rate_limit_exceeded, system_error, etc.

Usage Example
$alertManager = new AlertManager(getSafeNodeDatabase());
$alertId = $alertManager->createAlert(
    $siteId,
    'attack_detected',
    'high',
    'SQL Injection Detectado',
    'Tentativa de SQL injection detectada do IP ' . $_SERVER['REMOTE_ADDR'],
    ['ip' => $_SERVER['REMOTE_ADDR'], 'attack_type' => 'sql_injection']
);
int AlertManager::getUnreadCount($siteId = null, $userId = null)

Retorna contagem de alertas não lidos para o site/usuário.

SafeNode Middleware

void SafeNodeMiddleware::protect()

Middleware completo de proteção. Identifica site, verifica status, aplica firewall, geo-blocking, rate limiting e human verification quando necessário.

Funcionalidades: Identificação automática de site, verificação de status ativo, detecção de país por IP, bloqueio geográfico, regras de firewall, rate limiting, desafio humano quando necessário, logging de ameaças.

Usage Example
// No início do arquivo PHP que precisa de proteção
require_once 'includes/SafeNodeMiddleware.php';

// Aplica todas as proteções automaticamente
SafeNodeMiddleware::protect();

// Se passar por todas as verificações, continua execução normal
// Se bloqueado, envia resposta HTTP apropriada e termina execução

UI Helpers

void includeThemeAssets()

Inclui automaticamente todos os assets do tema (CSS, JS, fonts) necessários para o funcionamento da interface.

Usage Example
require_once 'includes/theme-helper.php';
includeThemeAssets();
string renderThemeToggle()

Renderiza botão de alternância entre tema claro/escuro com funcionalidade JavaScript integrada.

FAQ

O que é a verificação humana?

Um desafio que confirma que a ação foi feita por um humano (com JavaScript habilitado) e não por um bot. Reduz spam e abuso em formulários.

Preciso de JavaScript?

Sim. A verificação exige que o cliente execute JavaScript. Usuários com JS desabilitado não conseguirão passar.

Como funciona o token?

O endpoint init gera um token único por sessão. O token expira conforme configurado na API key (padrão: 1 hora). Após validar, o nonce é consumido e não pode ser reutilizado.

Erro "Origin não permitido"

O domínio de onde a requisição é feita deve estar na lista de domínios permitidos da API key. Verifique em Verificação Humana → API Keys → Domínios permitidos.

Erro "Token inválido ou expirado"

O token pode ter expirado ou o usuário demorou demais. Peça para recarregar a página e tentar novamente.

Rate limit 429

Muitas requisições do mesmo IP em pouco tempo. Aguarde alguns minutos ou ajuste o security_level do site no painel.

Posso usar em SPA (React, Vue, etc.)?

Sim. Inclua o SDK e chame SafeNodeHV.init() no carregamento. Ao enviar o formulário, inclua token, nonce e js_enabled no payload da sua API.

Onde ver os logs?

Em Verificação Humana → Logs você vê tentativas de init/validate, incluindo falhas e suspeitas.

Troubleshooting

Problemas comuns e como resolver.

403 Acesso negado em requisições legítimas

  • Verifique se o site está cadastrado e ativo no painel
  • Confirme se o domínio corresponde exatamente (com/sem www)
  • Revise regras de firewall e geo-blocking do site
  • Verifique logs em Traffic Monitor para ver o motivo do bloqueio

Middleware não carrega

  • Confirme o caminho em require_once – use caminho absoluto se necessário
  • Verifique se config.php e dependências estão no include path
  • Confira permissões de leitura nos arquivos do SafeNode

Banco de dados não conecta

  • Verifique credenciais no .env
  • Confirme que o banco safend existe
  • Execute o script de instalação/migração se necessário

Pagamento PIX não confirma

  • Verifique se o QR Code não expirou (válido por 30 minutos)
  • Confirme se o valor pago corresponde exatamente ao valor da cobrança
  • O sistema verifica automaticamente a cada 5 segundos

Boas Práticas

Segurança

  • Sempre use HVSecurityHeaders::apply() no início de arquivos PHP públicos
  • Valide e sanitize todos os inputs do usuário antes de processar
  • Use CSRFProtection em todos os formulários
  • Implemente rate limiting em endpoints sensíveis
  • Monitore e logue todas as ameaças detectadas

Performance

  • Use getSafeNodeDatabase() que já implementa caching de conexão
  • Monitore performance de endpoints críticos com PerformanceMonitor
  • Configure rate limits apropriados para evitar abuso
  • Use prepared statements para todas as queries SQL

Integração

  • Use SafeNodeMiddleware::protect() para proteção completa automática
  • Verifique cotas de eventos antes de processar requisições pesadas
  • Configure alertas para eventos importantes
  • Valide API keys antes de processar requisições de terceiros