Como proteger solicitações da Web com Nonces
Problema
Um usuário encontrou uma maneira de explorar o sistema de validação de solicitações do sistema de pontuação de um site, duplicação de solicitações HTTP de alto valor. Isso compromete a integridade e a confiabilidade do sistema.
Solução: Implementando um Sistema Nonce
Nonces (número usado uma vez) são valores que evitam ataques de repetição de solicitação, garantindo que uma solicitação específica não foi feito antes. Esta é uma maneira comum e segura de implementar um sistema nonce:
Geração e verificação de Nonce no lado do servidor
Função getNonce()
- Identifica o cliente que faz a solicitação (por exemplo, por nome de usuário, sessão).
- Gera um nonce aleatório usando uma função hash segura (por exemplo, SHA512).
- Armazena o nonce em um banco de dados associado ao ID do cliente.
- Retorna o nonce ao cliente.
verifyNonce() Função
- Busca o nonce armazenado anteriormente para o ID do cliente.
- Remove o nonce do o banco de dados (para evitar que ele seja reutilizado).
- Gera um hash com o nonce fornecido pelo cliente (cnonce), os dados da solicitação e um salt secreto.
- Compara o hash gerado com o hash fornecido pelo cliente.
- Retorna verdadeiro se os hashes corresponderem, indicando um Nonce válido.
Nonce do lado do cliente Uso
sendData() Função
- Recupera o nonce do servidor usando a função getNonce().
- Gera um específico do cliente nonce (cnonce) usando uma função hash segura.
- Concatena o nonce do servidor, o nonce do cliente e a solicitação data.
- Gera um hash a partir do valor concatenado.
- Envia a solicitação ao servidor, incluindo os dados, o cnonce e o hash.
Considerações de segurança
- Random Nonce Generation: A função makeRandomString() deve gerar números aleatórios altamente imprevisíveis para melhore a segurança.
- Função de hash segura: Utilize uma função de hash forte como SHA512 ou bcrypt para cálculos de hash relacionados a nonce.
- Uso único por solicitação: Nonces devem ser usados apenas uma vez e removidos do armazenamento para evitar ataques de repetição.