Caminho no Gestor bibliotecas/seguranca.php
Reúne as defesas de requisição do Gestor. O roteador a carrega em toda requisição, para validar o CSRF antes de qualquer módulo (ciclo de uma requisição).
CSRF
seguranca_csrf_requisicao_validar() roda em gestor_start() e só exige o token quando todas as condições valem:
-
o método é POST, PUT, PATCH ou DELETE;
-
a requisição traz o cookie de autenticação (
COOKIE_AUTHNAME): formulários públicos de visitantes não passam por aqui e se protegem com CAPTCHA; -
a rota não é isenta:
_api/…,api/…e_gestor-csrf-token, além das exceções de transição doadmin-atualizacoespara clientes anteriores à 2.9.25.
Falhou, a resposta é 403 com {"status":"error","code":"CSRF_INVALID_OR_EXPIRED",…}.
| Função | |
|---|---|
gestor_csrf_token() |
O token da sessão (64 hex), criado na primeira chamada. Vai em <meta name="csrf-token"> e em gestor.csrfToken |
seguranca_csrf_token_requisicao() |
Lê o token do cabeçalho X-CSRF-Token, do POST _csrf_token ou do $_REQUEST |
gestor_csrf_validar($token, $esperado = null) |
Compara com hash_equals() |
seguranca_csrf_token_resposta($ctx) |
Decide a resposta da rota _gestor-csrf-token/ (o global.js a usa para renovar um token vencido): 200 com o token, ou 401 AUTH_EXPIRED com X-Gestor-Auth-Redirect se o login expirou |
seguranca_csrf_retorno_normalizar($r) |
Aceita só um caminho relativo (sem esquema, //, :, .. mesmo codificado, nem controles) para voltar depois do login |
Em código próprio, formulários enviados por fetch/$.ajax já levam o token (o global.js o anexa). Num <form> HTML comum, inclua o campo:
<input type="hidden" name="_csrf_token" value="…valor de gestor_csrf_token()…">CAPTCHA
gestor_captcha_validar($token = null, $opcoes = []) confere o token no provedor de CAPTCHA_PROVIDER (google-recaptcha, cloudflare-turnstile ou none, que sempre aprova).
-
Sem
$token, lêcf-turnstile-response,g-recaptcha-responseoutokendo POST. -
Opções:
provider,secret,v2(usa a chave do reCAPTCHA v2),action(exigida no v3: confere a ação e nota mínima 0,5),return_response,transport(injeção para testes). -
Devolve o array de resposta do provedor em caso de sucesso, ou
false. Tempo limite de 5 s.
No reCAPTCHA v3, a nota só é conferida quando action é passada: sem ela, qualquer token válido passa, mesmo de robô.
Sessão: User-Agent e IP
No login, seguranca_sessao_registrar() guarda na sessão o User-Agent (255 caracteres) e o bloco de IP (/24 no IPv4; o endereço inteiro no IPv6). A cada requisição autenticada, gestor_permissao_token() chama seguranca_sessao_validar(); divergiu, seguranca_sessao_invalidar() apaga o token de usuarios_tokens e o usuário volta ao login.
O IP usado é o REMOTE_ADDR cru, não o de ip_get(): atrás de proxy reverso, é sempre o IP do proxy e a checagem de IP não distingue ninguém.
Utilitários
-
seguranca_token_aleatorio($bytes = 32): hexadecimal comrandom_bytes(), mínimo de 16 bytes. -
seguranca_ip_bloco($ip = null),seguranca_user_agent().
Auxiliares internos (usados pelas funções acima; raramente chamados direto): seguranca_csrf_rota_isenta(), seguranca_csrf_resposta_invalida_corpo(), seguranca_csrf_atualizador_transicao_isento(), seguranca_csrf_atualizador_status_isento(), seguranca_csrf_atualizador_sessao_legada_isento().
Funções
Gerado a partir de gestor/bibliotecas/seguranca.php · 18 funções
gestor_captcha_validar
ver no código · linha 23 ↗gestor_captcha_validar(?string $token = null, array $opcoes = []): array|boolValida o provedor configurado. O transporte pode ser injetado nos testes.
Parâmetros
$token?string$opcoesarray
Retorno
seguranca_token_aleatorio
ver no código · linha 78 ↗seguranca_token_aleatorio(int $bytes = 32): stringGera um identificador hexadecimal com entropia criptograficamente segura.
Parâmetros
$bytesint- Quantidade de bytes aleatórios (mínimo: 16 / 128 bits).
Retorno
seguranca_ip_bloco
ver no código · linha 91 ↗seguranca_ip_bloco(string|null $ip = null): stringRetorna o bloco de rede do IP (3 primeiros octetos no IPv4).
Parâmetros
$ipstring|null- IP a avaliar (padrão: REMOTE_ADDR).
Retorno
seguranca_user_agent
ver no código · linha 108 ↗seguranca_user_agent(): stringRetorna o User-Agent atual (truncado).
Retorno
seguranca_sessao_registrar
ver no código · linha 119 ↗seguranca_sessao_registrar(): voidRegistra na sessão o User-Agent e o bloco de IP do cliente no momento do login.
Retorno
seguranca_sessao_validar
ver no código · linha 132 ↗seguranca_sessao_validar(): boolValida a conformidade do User-Agent e bloco de IP atuais com os registrados.
Retorno
seguranca_sessao_invalidar
ver no código · linha 152 ↗seguranca_sessao_invalidar(string|null $tokenPubId = null): voidInvalida a sessão/token atual em caso de sequestro suspeito.
Parâmetros
$tokenPubIdstring|null- pubID do token de autorização a remover.
Retorno
gestor_csrf_token
ver no código · linha 168 ↗gestor_csrf_token(): stringObtém o token CSRF da sessão, gerando-o na primeira chamada.
Retorno
gestor_csrf_validar
ver no código · linha 185 ↗gestor_csrf_validar(string $token, $esperado = null): boolValida um token CSRF recebido contra o armazenado na sessão.
Parâmetros
$tokenstring- Token recebido na requisição.
$esperado
Retorno
seguranca_csrf_token_requisicao
ver no código · linha 198 ↗seguranca_csrf_token_requisicao(): stringObtém o token CSRF enviado em campo de formulário ou cabeçalho HTTP.
Retorno
seguranca_csrf_rota_isenta
ver no código · linha 213 ↗seguranca_csrf_rota_isenta(array $caminho): boolInforma se a rota usa autenticação M2M/Bearer e, portanto, não usa cookie de sessão. O canal distribuído é protegido por HMAC dentro do controlador da API.
Parâmetros
$caminhoarray- Segmentos normalizados da rota.
Retorno
seguranca_csrf_resposta_invalida_corpo
ver no código · linha 240 ↗seguranca_csrf_resposta_invalida_corpo(string $mensagem): arrayCorpo JSON da recusa por CSRF (req-107, code acrescentado na req-175).
Parâmetros
$mensagemstring- Mensagem legível já existente.
Retorno
seguranca_csrf_token_resposta
ver no código · linha 260 ↗seguranca_csrf_token_resposta(array $contexto): arrayDecide a resposta da rota _gestor-csrf-token (req-175). Função PURA: o roteador só emite.
Parâmetros
$contextoarray- token, tem_cookie_auth, autenticado, url_raiz.
Retorno
seguranca_csrf_retorno_normalizar
ver no código · linha 307 ↗seguranca_csrf_retorno_normalizar(mixed $retorno): stringNormaliza o caminho de retorno enviado pelo cliente para o pós-login (req-175).
Parâmetros
$retornomixed- Valor bruto recebido.
Retorno
/, ou ''.seguranca_csrf_atualizador_transicao_isento
ver no código · linha 342 ↗seguranca_csrf_atualizador_transicao_isento(array $caminho, string $versao): boolMantém compatibilidade somente no autoatualizador que introduziu o CSRF.
Parâmetros
$caminhoarray- Segmentos normalizados da rota.
$versaostring- Versão atual do Gestor.
Retorno
seguranca_csrf_atualizador_status_isento
ver no código · linha 360 ↗seguranca_csrf_atualizador_status_isento(array $caminho, array $requisicao): boolReconhece a consulta de status do autoatualizador como operação de leitura.
Parâmetros
$caminhoarray- Segmentos normalizados da rota.
$requisicaoarray- Parâmetros recebidos pela requisição.
Retorno
seguranca_csrf_atualizador_sessao_legada_isento
ver no código · linha 381 ↗seguranca_csrf_atualizador_sessao_legada_isento(array $caminho, array $requisicao, string|null $rootPath = null, int|null $agora = null): boolPermite concluir uma sessao do autoatualizador iniciada por um cliente anterior ao CSRF. O SID aleatorio e o estado persistido limitam a isencao a uma transicao real, recente, inacabada e na etapa esperada.
Parâmetros
$caminhoarray- Segmentos normalizados da rota.
$requisicaoarray- Parametros recebidos pela requisicao.
$rootPathstring|null- Raiz fisica do Gestor (injetavel nos testes).
$agoraint|null- Timestamp atual (injetavel nos testes).
Retorno
seguranca_csrf_requisicao_validar
ver no código · linha 429 ↗seguranca_csrf_requisicao_validar(): boolExige CSRF em métodos mutáveis autenticados pelo cookie do painel.
Retorno