CSRF
O middleware CSRF (Cross-Site Request Forgery) no Lithe protege sua aplicação contra ataques que tentam realizar ações em nome do usuário sem a sua autorização.
Instalando o Middleware CSRF
Para instalar o middleware CSRF, utilize o Composer:
composer require lithemod/csrf
Você pode encontrar mais informações e o código fonte do módulo em github.com/lithemod/csrf.
Usando o Middleware CSRF
O middleware CSRF no Lithe é projetado para proteger sua aplicação contra ataques de falsificação de requisições entre sites (CSRF). Para configurá-lo, adicione-o à sua aplicação usando o método use()
em uma instância do aplicativo Lithe:
use Lithe\Middleware\Security\csrf;
$app->use(csrf([
'expire' => 600,
]));
Configurações do Middleware
O middleware CSRF pode ser configurado com os seguintes parâmetros em um array:
- name (string): O nome do token CSRF. O padrão é
_token
. - expire (int): O tempo de expiração do token em segundos. O padrão é 600 segundos.
- checkBody (bool): Indica se o token deve ser verificado no corpo da requisição. O padrão é
false
. - bodyMethods (array): Métodos HTTP para os quais a validação do token deve ser aplicada se a configuração
checkBody
estiver habilitada. O padrão é['POST']
. - regenerate (bool): Indica se o token deve ser regenerado a cada requisição. O padrão é
false
.
Exemplo de configuração dentro de uma rota:
$app->use(csrf([
'name' => '_token',
'expire' => 600,
'checkBody' => true,
'bodyMethods' => ['POST', 'PUT', 'DELETE'],
'regenerate' => true,
]));
Gerando e Obtendo Tokens CSRF
O middleware CSRF gera um token único para cada sessão. Você pode gerar e obter o token usando os seguintes métodos:
-
generateToken(bool $force = false): string
Gera um novo token CSRF e o armazena na sessão. Se$force
fortrue
, um novo token será gerado mesmo que já exista um.$app->get('/', function ($req, $res) { $token = $req->csrf->generateToken(); // Lógica adicional });
-
getToken(): string
Retorna o token CSRF atual armazenado na sessão.$app->get('/', function ($req, $res) { $token = $req->csrf->getToken(); // Lógica adicional });
Incluindo o Token CSRF em Formulários
Para incluir o token CSRF em formulários HTML, use o método getTokenField()
para gerar um campo oculto com o token:
$app->get('/form', function ($req, $res) {
$res->send($req->csrf->getTokenField());
});
Verificando Tokens CSRF
O middleware verifica automaticamente o token em requisições POST e outros métodos especificados em bodyMethods
quando a opção checkBody
está habilitada. Se o token for inválido ou estiver ausente, uma exceção HTTP 419 será lançada. Se checkBody
estiver desativado, você pode usar os seguintes métodos para verificar a validade do token:
-
verifyToken(string $token, bool $checkBody = false): bool
Verifica se o token CSRF fornecido é válido. Se$checkBody
fortrue
, ele verifica o token no corpo da requisição; caso contrário, verifica na sessão.$app->post('/submit', function ($req, $res) { $isValid = $req->csrf->verifyToken($req->input('_token')); // Lógica adicional });
Funções de Manipulação de Token
-
invalidate(): void
Destroi o token CSRF e sua variável de sessão associada, invalidando-o.$app->get('/invalidate', function ($req, $res) { $req->csrf->invalidate(); });
-
exists(): bool
Verifica se um token CSRF existe na sessão.$app->get('/', function ($req, $res) { $exists = $req->csrf->exists(); // Lógica adicional });
Considerações
- Segurança: Certifique-se de que o token CSRF esteja incluído em todos os formulários que enviam dados modificáveis e em requisições AJAX para prevenir ataques CSRF. A validação e inclusão adequada do token são essenciais para proteção adequada.
- Expiração do Token: Configure o tempo de expiração do token com cuidado para equilibrar segurança e usabilidade. Tokens expirados são regenerados para evitar problemas de autenticação.
- Verificação no Corpo: Se
checkBody
estiver habilitado, o token será verificado tanto nos cabeçalhos quanto no corpo da requisição. Isso é útil para APIs que recebem tokens via POST, PUT ou DELETE, mas pode adicionar uma sobrecarga extra. - Regeneração do Token: Quando
regenerate
está habilitado, um novo token é gerado a cada requisição. Isso pode aumentar a segurança, mas deve ser usado com cautela para não impactar a experiência do usuário. - Tratamento de Erros: Esteja preparado para lidar com exceções HTTP 419 lançadas quando o token CSRF é inválido ou ausente. Isso pode incluir redirecionar para uma página de erro ou exibir uma mensagem apropriada para o usuário. Para mais informações sobre o tratamento de exceções HTTP, consulte a documentação de Exceções HTTP.