Los incumplimientos pueden hundirte
TL;DR: Trate las respuestas desconocidas como no autorizadas, no como válidas.
Problemas
- Riesgos de seguridad
- Ignorando casos desconocidos
- Error de interpretación errónea
- Establecimiento de estados válidos de forma predeterminada
- Autorizaciones no coincidentes
- No se pueden registrar eventos
- Potencial de explotación
Soluciones
- Validar todas las respuestas frente a un conjunto cerrado de códigos conocidos.
- Predeterminado (y desconocido) a no autorizado o Eliminar valores predeterminados .
- Registre todos los casos no coincidentes o inesperados para su análisis.
- Prueba con escenarios de borde.
- Sincronice periódicamente los grupos de respuestas con los procesadores para evitar códigos obsoletos.
- Centrarse en la seguridad convirtiéndola en un proceso de cambio hacia la izquierda.
- Diseñar sistemas con resiliencia al cambio para manejar escenarios cambiantes.
Contexto
Hoy es el día de la seguridad informática y todo programador debe reconocer su responsabilidad.
Imagine una aplicación que gestiona ventas y que depende de grupos de respuestas de procesadores de tarjetas de crédito para gestionar las transacciones.
Cada procesador de tarjetas de crédito proporciona códigos de respuesta predefinidos para diversas situaciones, como saldo insuficiente o tarjetas vencidas.
El problema comienza cuando un procesador agrega un nuevo código de respuesta para transacciones denegadas pero no notifica a la plataforma.
La aplicación no reconoce el nuevo código, lo trata como "no encontrado" y autoriza la compra.
Los usuarios notan esta falla y la aprovechan para realizar compras no autorizadas.
Los ingresos de la plataforma se desploman, lo que la lleva a la quiebra.
Código de muestra
Equivocado
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; default: // Authorize purchase break; }
Bien
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "APPROVED": // Authorize purchase break; case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; case "DECLINED_NEW_REASON": // Handle new declined reason break; default: // Reject purchase (default case for unknown responses) break; }
Detección
- [x] Manual
Puedes detectar este olor revisando la lógica de manejo de errores.
Verifique si el sistema registra y rechaza los casos no reconocidos.
Las pruebas automatizadas pueden ayudar a identificar si las entradas nuevas o inesperadas se convierten en acciones válidas de forma predeterminada.
Las herramientas de análisis estático pueden ayudar al señalar un manejo de errores potencialmente incompleto.
Etiquetas
- Seguridad
Nivel
- [x] Intermedio
¿Por qué es importante la biyección?
Es fundamental mantener una correspondencia uno a uno entre la representación interna de las respuestas del procesador de pagos de su aplicación y los códigos reales devueltos por el procesador.
Cuando se rompe la Biyección , se crea un desajuste.
La aplicación interpreta incorrectamente códigos desconocidos, lo que genera un comportamiento inesperado, agujeros de seguridad y consecuencias comerciales potencialmente desastrosas.
Generación de IA
Las herramientas de IA pueden crear este olor si no se especifica cómo manejar los casos desconocidos.
Por ejemplo, el manejo de errores genéricos podría tener como predeterminados resultados benignos como "no encontrado" o "éxito".
Detección de IA
Los generadores de IA pueden solucionar este problema si les indica que traten los casos desconocidos como no autorizados y enfaticen el registro y la prueba de escenarios inesperados.
¡Pruébalos!
Recuerde: los asistentes de IA cometen muchos errores
Sin instrucciones adecuadas | Con instrucciones específicas |
---|---|
Conclusión
Maneje siempre los casos desconocidos con cautela.
Valores predeterminados como "no encontrado" pueden generar graves problemas de seguridad y pérdidas financieras.
Haga que el registro y la denegación de respuestas desconocidas formen parte de sus prácticas de desarrollo.
Tome decisiones de desplazamiento hacia la izquierda relacionadas con la seguridad mientras programa.
Relaciones
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352
Descargo de responsabilidad
Los olores del código son mi opinión .
Créditos
Foto de Nathana Rebouças en Unsplash
https://www.youtube.com/watch?v=J2QOejhA6ek
Las suposiciones son la madre de todos los fracasos.
Dijo Ouissal
Grandes citas sobre ingeniería de software
Este artículo es parte de la serie CodeSmell.