Cómo proteger las solicitudes web con Nonces
Problema
Un usuario ha encontrado una manera de explotar el sistema de validación de solicitudes del sistema de puntuación de un sitio web al duplicar solicitudes HTTP de alto valor. Esto compromete la integridad y confiabilidad del sistema.
Solución: implementar un sistema Nonce
Los nonces (número usado una vez) son valores que evitan ataques de repetición de solicitudes al garantizar que una solicitud en particular no haya sido hecho antes. A continuación se muestra una forma común y segura de implementar un sistema nonce:
Generación y verificación de Nonce en el lado del servidor
Función getNonce()
- Identifica al cliente que realiza la solicitud (por ejemplo, por nombre de usuario, sesión).
- Genera un nonce aleatorio usando una función hash segura (por ejemplo, SHA512).
- Almacena el nonce en una base de datos asociada con el ID del cliente.
- Devuelve el nonce al cliente.
función verificarNonce()
- Recupera el nonce previamente almacenado para el ID del cliente.
- Elimina el nonce de la base de datos (para evitar que se reutilice).
- Genera un hash con el nonce proporcionado por el cliente (cnonce), los datos de la solicitud y una sal secreta.
- Compara el hash generado con el hash proporcionado por el cliente.
- Devuelve verdadero si los hashes coinciden, lo que indica un nonce válido.
Cliente -Uso lateral de Nonce
Función sendData()
- Recupera el nonce del servidor usando la función getNonce().
- Genera un nonce específico del cliente (cnonce) usando una función hash segura.
- Concatena el nonce del servidor, el nonce del cliente y los datos de solicitud.
- Genera un hash a partir del valor concatenado.
- Envía la solicitud al servidor, incluidos los datos, cnonce y hash.
Consideraciones de seguridad
- Generación aleatoria nonce: makeRandomString( ) debe generar números aleatorios altamente impredecibles para mejorar la seguridad.
- Función Hash segura: Utilice una función hash sólida como SHA512 o bcrypt para cálculos hash no relacionados.
- Uso único por solicitud: Nonces solo debe usarse una vez y eliminarse del almacenamiento para evitar ataques de repetición.