Created
May 29, 2025 13:59
-
-
Save vichfs/1b41ad7b95fcf4269802de33da80a14c to your computer and use it in GitHub Desktop.
Classe para criar e verificar Tokens CSRF no Adianti Framework
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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