Para começar com o segundo plano, este post é o que Jeff Atwood diz sobre os tokens de CSRF. Nesta mesma página, ele continua dizendo:
Um método de prevenção ainda mais forte, embora mais complexo, é alavancar o estado do servidor - gerar (e rastrear, com tempo limite) uma chave aleatória exclusiva para cada FORMULÁRIO HTML enviado para o cliente. Usamos uma variante desse método no Stack Overflow com grande sucesso.
Mas neste post em si, Jeff nunca comenta sobre quando e como os tokens devem ser atualizados.
Eu estava usando uma técnica semelhante em um aplicativo da web em que estava trabalhando. Funciona assim:
- Sempre que o usuário
POST
fornecer dados ao meu servidor, um token csrf é enviado junto. - Esse token CSRF é armazenado em um cookie criptograficamente forte na sessão do usuário.
- Se o token for válido, a solicitação do usuário é processada e vice-versa.
- Se a solicitação for válida, descarte o token antigo no lado do servidor e crie um novo token. A resposta do servidor contém um novo token csrf para ser usado na próxima solicitação. O token antigo em todos os formulários de uma página é atualizado com o novo, para que a próxima solicitação seja processada corretamente.
É aconselhável atualizar os tokens após qualquer POST
solicitação ou a atualização deve ser feita apenas quando o usuário faz uma GET
solicitação e mantém o mesmo token até a próxima solicitação GET ser feita?
Respostas:
O ponto principal de um token CSRF é que ele não pode ter sido enviado de outro site. Portanto, (a) não pode ser previsto ou detectado por um invasor e (b) não é anexado automaticamente a uma solicitação da maneira que um cookie é.
Portanto, teoricamente, se um token CSRF nunca for divulgado a terceiros, novamente, teoricamente, você não precisará expirá-lo. Mas então você corre o risco de o seu token ser "vazado" de alguma forma. Portanto, seu período de validade deve ser curto o suficiente para combater a possibilidade de um token sair e ser usado contra seu usuário.
Na verdade, não existem diretrizes, mas uma boa técnica sólida é gerar automaticamente um novo token a cada solicitação que incorpore um código de tempo assinado e, em seguida, aceite tokens até uma certa idade.
Uma função de amostra pode ser:
O token contém informações de tempo e um salt, mas também contém uma assinatura que não pode ser falsificada e que está vinculada ao ID do usuário.
Em seguida, você pode definir seu próprio intervalo de expiração - uma hora, um dia, 2 horas. Tanto faz. O intervalo, neste caso, não está vinculado ao token; portanto, você pode definir regras de expiração da maneira que desejar.
No mínimo, os tokens de CSRF devem expirar quando a sessão de login expirar ou quando o usuário efetuar logout. Não há expectativa do usuário de que um formulário que você criou ANTES de fazer logoff continuará funcionando depois que você fizer login novamente.
fonte