Skip to content

Instantly share code, notes, and snippets.

@vichfs
Created May 29, 2025 13:59
Show Gist options
  • Save vichfs/1b41ad7b95fcf4269802de33da80a14c to your computer and use it in GitHub Desktop.
Save vichfs/1b41ad7b95fcf4269802de33da80a14c to your computer and use it in GitHub Desktop.
Classe para criar e verificar Tokens CSRF no Adianti Framework
<?php
use Adianti\Registry\TSession;
class TokenUtils
{
private const TEMPO_VALIDADE_TOKEN = 300; // 5 minutos
/**
* Gera um token que pode ser utilizado para proteger formulários
* que modificam dados contra ataques CSRF. Insere o token na
* sessão e retorna.
*
* O valor do token pode ser adicionado a um formulário como um
* campo hidden. Quando o usuário submete o formulário, o valor
* do campo é comparado com o da sessão.
*
* @param $nomeSessao
* @return string
*/
public static function gerar(string $nomeSessao = 'form_token'): string
{
$token = bin2hex(random_bytes(32));
TSession::setValue($nomeSessao, $token);
TSession::setValue($nomeSessao . '_timestamp', time());
return $token;
}
/**
* Recebe um token como parâmetro e compara seu valor com o
* token guardado na sessão (se houver). Retorna true se
* forem iguais; false se não.
*
* @param $token string
* @param $nomeSessao
*
* @return bool
*/
public static function verificar(string $tokenForm, string $nomeSessao = 'form_token'): bool
{
// se o token veio vazio, retornar false imediatamente
if (!$tokenForm) {
return false;
}
// verificar se o token está na sessão e está válido e comparar tokens
$tokenSessao = TSession::getValue($nomeSessao);
$timestampSessao = TSession::getValue($nomeSessao . '_timestamp');
if ($tokenSessao && $timestampSessao) {
TSession::delValue($nomeSessao);
TSession::delValue($nomeSessao . '_timestamp');
return (self::tokenEhValido($timestampSessao) && hash_equals($tokenSessao, $tokenForm));
}
return false;
}
private static function tokenEhValido(int $timestampSessao): bool
{
return ($timestampSessao + self::TEMPO_VALIDADE_TOKEN) > time();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment