Path in the Gestor bibliotecas/seguranca.php
It gathers the Gestor's request defenses. The router loads it on every request, to validate CSRF before any module runs (request lifecycle).
CSRF
seguranca_csrf_requisicao_validar() runs in gestor_start() and only requires the token when all these conditions hold:
-
the method is POST, PUT, PATCH or DELETE;
-
the request carries the authentication cookie (
COOKIE_AUTHNAME): visitors' public forms do not go through here and are protected by CAPTCHA; -
the route is not exempt:
_api/…,api/…and_gestor-csrf-token, plus theadmin-atualizacoestransition exceptions for clients older than 2.9.25.
On failure, the answer is 403 with {"status":"error","code":"CSRF_INVALID_OR_EXPIRED",…}.
| Function | |
|---|---|
gestor_csrf_token() |
The session token (64 hex), created on the first call. It goes into <meta name="csrf-token"> and gestor.csrfToken |
seguranca_csrf_token_requisicao() |
Reads the token from the X-CSRF-Token header, the _csrf_token POST field or $_REQUEST |
gestor_csrf_validar($token, $expected = null) |
Compares with hash_equals() |
seguranca_csrf_token_resposta($ctx) |
Decides the answer of the _gestor-csrf-token/ route (global.js uses it to renew an expired token): 200 with the token, or 401 AUTH_EXPIRED with X-Gestor-Auth-Redirect if the login expired |
seguranca_csrf_retorno_normalizar($r) |
Accepts only a relative path (no scheme, //, :, .. even encoded, or control characters) to return to after login |
In your own code, forms sent with fetch/$.ajax already carry the token (global.js attaches it). In a plain HTML <form>, include the field:
<input type="hidden" name="_csrf_token" value="…value of gestor_csrf_token()…">CAPTCHA
gestor_captcha_validar($token = null, $options = []) checks the token with the CAPTCHA_PROVIDER provider (google-recaptcha, cloudflare-turnstile or none, which always approves).
-
Without
$token, it readscf-turnstile-response,g-recaptcha-responseortokenfrom POST. -
Options:
provider,secret,v2(uses the reCAPTCHA v2 key),action(required in v3: checks the action and a minimum score of 0.5),return_response,transport(injection for tests). -
It returns the provider's response array on success, or
false. 5 s timeout.
In reCAPTCHA v3, the score is only checked when action is passed: without it, any valid token passes, even a bot's.
Session: User-Agent and IP
At login, seguranca_sessao_registrar() stores in the session the User-Agent (255 characters) and the IP block (/24 for IPv4; the full address for IPv6). On every authenticated request, gestor_permissao_token() calls seguranca_sessao_validar(); on a mismatch, seguranca_sessao_invalidar() deletes the token from usuarios_tokens and the user goes back to the login.
The IP used is the raw REMOTE_ADDR, not the one from ip_get(): behind a reverse proxy, it is always the proxy's IP and the IP check tells nobody apart.
Utilities
-
seguranca_token_aleatorio($bytes = 32): hexadecimal fromrandom_bytes(), at least 16 bytes. -
seguranca_ip_bloco($ip = null),seguranca_user_agent().
Internal helpers (used by the functions above; rarely called directly): 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().
Functions
Generated from gestor/bibliotecas/seguranca.php · 18 functions
gestor_captcha_validar
view source · line 23 ↗gestor_captcha_validar(?string $token = null, array $opcoes = []): array|boolValida o provedor configurado. O transporte pode ser injetado nos testes.
Parameters
$token?string$opcoesarray
Returns
seguranca_token_aleatorio
view source · line 78 ↗seguranca_token_aleatorio(int $bytes = 32): stringGera um identificador hexadecimal com entropia criptograficamente segura.
Parameters
$bytesint- Quantidade de bytes aleatórios (mínimo: 16 / 128 bits).
Returns
seguranca_ip_bloco
view source · line 91 ↗seguranca_ip_bloco(string|null $ip = null): stringRetorna o bloco de rede do IP (3 primeiros octetos no IPv4).
Parameters
$ipstring|null- IP a avaliar (padrão: REMOTE_ADDR).
Returns
seguranca_user_agent
view source · line 108 ↗seguranca_user_agent(): stringRetorna o User-Agent atual (truncado).
Returns
seguranca_sessao_registrar
view source · line 119 ↗seguranca_sessao_registrar(): voidRegistra na sessão o User-Agent e o bloco de IP do cliente no momento do login.
Returns
seguranca_sessao_validar
view source · line 132 ↗seguranca_sessao_validar(): boolValida a conformidade do User-Agent e bloco de IP atuais com os registrados.
Returns
seguranca_sessao_invalidar
view source · line 152 ↗seguranca_sessao_invalidar(string|null $tokenPubId = null): voidInvalida a sessão/token atual em caso de sequestro suspeito.
Parameters
$tokenPubIdstring|null- pubID do token de autorização a remover.
Returns
gestor_csrf_token
view source · line 168 ↗gestor_csrf_token(): stringObtém o token CSRF da sessão, gerando-o na primeira chamada.
Returns
gestor_csrf_validar
view source · line 185 ↗gestor_csrf_validar(string $token, $esperado = null): boolValida um token CSRF recebido contra o armazenado na sessão.
Parameters
$tokenstring- Token recebido na requisição.
$esperado
Returns
seguranca_csrf_token_requisicao
view source · line 198 ↗seguranca_csrf_token_requisicao(): stringObtém o token CSRF enviado em campo de formulário ou cabeçalho HTTP.
Returns
seguranca_csrf_rota_isenta
view source · line 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.
Parameters
$caminhoarray- Segmentos normalizados da rota.
Returns
seguranca_csrf_resposta_invalida_corpo
view source · line 240 ↗seguranca_csrf_resposta_invalida_corpo(string $mensagem): arrayCorpo JSON da recusa por CSRF (req-107, code acrescentado na req-175).
Parameters
$mensagemstring- Mensagem legível já existente.
Returns
seguranca_csrf_token_resposta
view source · line 260 ↗seguranca_csrf_token_resposta(array $contexto): arrayDecide a resposta da rota _gestor-csrf-token (req-175). Função PURA: o roteador só emite.
Parameters
$contextoarray- token, tem_cookie_auth, autenticado, url_raiz.
Returns
seguranca_csrf_retorno_normalizar
view source · line 307 ↗seguranca_csrf_retorno_normalizar(mixed $retorno): stringNormaliza o caminho de retorno enviado pelo cliente para o pós-login (req-175).
Parameters
$retornomixed- Valor bruto recebido.
Returns
/, ou ''.seguranca_csrf_atualizador_transicao_isento
view source · line 342 ↗seguranca_csrf_atualizador_transicao_isento(array $caminho, string $versao): boolMantém compatibilidade somente no autoatualizador que introduziu o CSRF.
Parameters
$caminhoarray- Segmentos normalizados da rota.
$versaostring- Versão atual do Gestor.
Returns
seguranca_csrf_atualizador_status_isento
view source · line 360 ↗seguranca_csrf_atualizador_status_isento(array $caminho, array $requisicao): boolReconhece a consulta de status do autoatualizador como operação de leitura.
Parameters
$caminhoarray- Segmentos normalizados da rota.
$requisicaoarray- Parâmetros recebidos pela requisição.
Returns
seguranca_csrf_atualizador_sessao_legada_isento
view source · line 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.
Parameters
$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).
Returns
seguranca_csrf_requisicao_validar
view source · line 429 ↗seguranca_csrf_requisicao_validar(): boolExige CSRF em métodos mutáveis autenticados pelo cookie do painel.
Returns