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):
<?php
require_once '/caminho/para/safenode/includes/SafeNodeMiddleware.php';
SafeNodeMiddleware::protect();
// Seu código normal
?>
2. Cadastre o site
- Acesse o painel SafeNode
- Gerenciar Sites → Adicionar site
- Informe o domínio (ex: seusite.com)
- Salve
3. Gere a chave de API (Verificação Humana)
- Verificação Humana → API Keys
- Criar chave → escolha o site
- Copie a chave gerada
4. Teste a proteção
Simular ataque (deve bloquear):
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):
<link rel="preconnect" href="https://safenode.cloud">
<script src="https://safenode.cloud//sdk/safenode-hv.min.js" data-api-key="pk_live_sua_public_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 valid: true, o usuário passou na verificação.
Fluxo recomendado
- Usuário carrega a página → SDK chama init automaticamente
- Usuário preenche o formulário e envia
- Seu backend recebe o form, chama validate com token/nonce/pow_counter/behavior
- Se validate retornar sucesso → processar o form; senão → rejeitar
Dicas
- Nunca exponha a secret key (sk_) no frontend; use pk_ no navegador e sk_ apenas no backend
- 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
POST /init.php
Retorna token, nonce e parâmetros de PoW para o desafio da sessão.
Parâmetros: api_key (obrigatório) – Header X-API-Key ou POST/GET
{
"success": true,
"token": "token_assinado",
"nonce": "nonce_hex",
"max_age": 300,
"pow_bits": 18,
"pow_stamp": "stamp_base64url"
}
Erros: 401 (API key inválida), 403 (origin não permitido), 429 (rate limit)
2. Validate – Validar verificação
POST /validate.php
Valida token, nonce e PoW. Envie também pow_counter e behavior (JSON) para manter o score comportamental consistente.
{
"api_key": "sk_live_sua_chave",
"token": "token do init",
"nonce": "nonce do init",
"js_enabled": "1",
"pow_counter": 12345,
"behavior": {"hasMouse": true}
}
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
// 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
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.
$db = getSafeNodeDatabase();
if (!$db) {
die("Erro ao conectar ao banco de dados");
}
$stmt = $db->prepare("SELECT * FROM tabela WHERE coluna = ?");
$stmt->execute([$valor]);
Verifica se o banco de dados safend existe e está acessível.
if (!safenodeDatabaseExists()) {
error_log("Banco de dados safend não encontrado");
// Criar banco ou exibir erro
}
Retorna a URL base do SafeNode detectada automaticamente do ambiente.
Obtém o IP real do cliente. Compatível com Cloudflare (CF-Connecting-IP), proxies (X-Forwarded-For, X-Real-IP) e REMOTE_ADDR.
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
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.
// 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
Sanitiza e valida input JSON ou arrays recursivamente. Remove caracteres de controle, limita tamanho de strings (10KB) e sanitiza chaves.
$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
Valida o tamanho do payload HTTP. Retorna false e envia HTTP 413 se exceder o limite (padrão: 10KB).
if (!HVSecurityHeaders::validatePayloadSize(5120)) {
// Payload maior que 5KB - requisição rejeitada
exit;
}
Valida formato de API key. Formato esperado: prefixo + caracteres hexadecimais.
$apiKey = $_POST['api_key'] ?? '';
if (!HVSecurityHeaders::validateApiKeyFormat($apiKey)) {
http_response_code(400);
echo json_encode(['error' => 'Formato de API key inválido']);
exit;
}
Valida formato de token. Deve ser hexadecimal de exatamente 64 caracteres.
Registra ameaça detectada nos logs de segurança.
// Chamado internamente por detectAttack() quando $logToSecurityTable = true
// Use apenas para registrar ameaças detectadas por outros meios
Detecção de Ameaças
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.
$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
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.
// 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
Gera um novo token CSRF criptograficamente seguro (64 caracteres hex) e armazena na sessão com timestamp.
Obtém o token CSRF atual da sessão, ou gera um novo se não existir.
Valida o token CSRF usando comparação segura (hash_equals).
// 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
}
Retorna HTML do campo hidden com o token CSRF já formatado e escapado.
echo '';
Valida automaticamente o token de POST ou GET. Retorna false e envia HTTP 403 se inválido.
Sanitização de Input
Escapa string para uso em HTML (htmlspecialchars com ENT_QUOTES e UTF-8).
$userInput = $_GET['name'] ?? '';
echo '' . XSSProtection::escape($userInput) . '';
Escapa string para uso em atributos HTML.
Escapa string para uso em JavaScript (JSON encode).
Sanitiza string removendo tags HTML e caracteres perigosos.
Sanitiza array recursivamente aplicando sanitização em todos os valores string.
Validação de Dados
Valida formato de email usando filter_var com FILTER_VALIDATE_EMAIL.
Valida formato de URL.
Valida formato de domínio.
Valida string com tamanho mínimo e máximo.
Valida se o valor é um inteiro.
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