En programación informática , una cadena mágica es una entrada que el programador cree que nunca llegará externamente y que activa una funcionalidad que de otro modo estaría oculta. Un usuario de este programa probablemente proporcionaría una entrada que daría una respuesta esperada en la mayoría de las situaciones. Sin embargo, si el usuario, de hecho, proporciona inocentemente (sin intención) la entrada predefinida, activando la funcionalidad interna, la respuesta del programa suele ser bastante inesperada para el usuario (por lo que parece "mágica"). [ 1 ]
Fondo
Por lo general, la implementación de cadenas mágicas se debe a limitaciones de tiempo. Un desarrollador debe encontrar una solución rápida en lugar de profundizar en el problema y encontrar una mejor solución. Por ejemplo, al probar un programa que toma los datos personales de un usuario y verifica su número de tarjeta de crédito, un desarrollador podría decidir agregar un atajo con una cadena mágica que, al ingresar la improbable entrada "***" como número de tarjeta de crédito, haría que el programa procediera automáticamente como si la tarjeta fuera válida, sin perder tiempo en verificarla. Si el desarrollador olvida eliminar la cadena mágica y un usuario del programa final ingresa "***" como número de tarjeta de crédito de marcador de posición al completar el formulario, activaría inadvertidamente la funcionalidad oculta.
Resolución
Situaciones/problemas de causa
A menudo, existen importantes limitaciones de tiempo ajenas al control del desarrollador desde el inicio de su participación en un proyecto. Algunos problemas comunes que pueden conducir a este antipatrón son:
- Null != null [ 2 ] o cualquier variación donde un tipo de dato no se compara bit a bit con un tipo supuestamente idéntico. Este es un problema que puede ocurrir incluso dentro del mismo entorno de desarrollo (mismo lenguaje de programación y compilador ). Este problema tiene una larga historia para los tipos numéricos y booleanos, y la mayoría de los compiladores lo manejan bien (con advertencias y errores aplicables, resolución predeterminada, etc.). Los tipos anulables , como las cadenas, tienen la dificultad de definiciones históricamente diferentes para NULL . Los errores/advertencias producidos suelen ser generales o un error predeterminado de "mejor ajuste" cuyo mensaje en realidad no describe lo que está sucediendo. Si el desarrollador no puede obtener suficientes pistas para rastrear el problema a través de la depuración , tomar un atajo y codificar una cadena "predeterminada" puede ser la única manera de mantener el proyecto dentro del cronograma. Una solución a esto puede ser la aplicación del patrón Null Object . [ 3 ]
- Programado en un callejón sin salida. A veces, un diseño parece sencillo e incluso simple, pero resulta tener un fallo lógico relacionado con la posible entrada del usuario debido a una circunstancia a menudo imprevista hacia el final del desarrollo planificado. Por lo tanto, un desarrollador puede sentir la necesidad de implementar una entrada de usuario con permisos especiales de seguridad/operativos para lidiar con tales circunstancias. Esto puede ser particularmente irónico, ya que a veces se hace evidente que un diseño más robusto desde el principio probablemente habría dejado margen para manejar el fallo. Sin embargo, esto tal vez habría tomado demasiado tiempo para implementarse y podría haber entrado en conflicto con el concepto fundamental de ingeniería KISS ( Keep It Simple, Stupid), que consiste en mantener un diseño e implementación simples y cumplir solo con los requisitos iniciales necesarios.
- Permitir el acceso externo a una bandera global . [ 4 ] La excesiva confianza en que una bandera global nunca se puede establecer accidental o maliciosamente (a menudo una suposición bastante razonable) justifica dicha implementación para fines de prueba y depuración, especialmente para aplicaciones pequeñas con interfaces simples. Sin embargo, si la distribución del programa es considerable, suele ser solo cuestión de tiempo antes de que alguien establezca la bandera. Una solución obvia es nunca usar una variable global de esa manera. Un desarrollador también podría hacer inadvertidamente que la bandera sea accesible circunstancialmente . Entonces la cadena mágica por sí sola sería tratada por el programa como cualquier otra entrada. [ 5 ] El usuario entonces tendría que reproducir la configuración, así como el conjunto particular de circunstancias o eventos que permiten que la interfaz de usuario permita que la bandera acepte discretamente la configuración unescenario mucho más improbable (aunque todavía posible).
Formato estricto
Restringir el formato de entrada es una posible solución de mantenimiento (corrección de errores) . Básicamente, esto implica validar la información de entrada para comprobar que tenga el formato correcto, con el fin de reducir la posibilidad de que el usuario descubra la cadena mágica. Algunos ejemplos incluyen validar un número de teléfono para asegurar que contenga solo dígitos (y posiblemente espacios y signos de puntuación en cierta medida) o comprobar que el nombre de una persona tenga nombre y apellido (y que esté escrito correctamente con mayúsculas). Se hace una excepción para la cadena mágica en el código de validación para que no sea rechazada. Se espera que, dado que un usuario probablemente notaría rápidamente la estricta aplicación del formato, no se le ocurriría intentar introducir una cadena que no se ajuste al formato. Por lo tanto, es muy improbable que el usuario intente introducir la cadena mágica.
Como en cualquier proceso de validación de datos, es importante asegurarse de que el formato no sea restrictivo de manera que limite involuntariamente el uso de la aplicación por parte de algunos usuarios. Un ejemplo de esto es restringir la entrada de números de teléfono o códigos postales [ 6 ] según el sistema de un país (por ejemplo, exigir que cada usuario proporcione un código postal de cinco dígitos ), lo que causa problemas a los usuarios legítimos que residen en otros países.
Implementación con propósito
Como suele ocurrir con los antipatrones, existen escenarios específicos donde las cadenas mágicas son una solución correcta para una implementación. Algunos ejemplos son los códigos de trucos [ 7 ] y los huevos de Pascua . Además, hay casos en los que los usuarios inventan cadenas mágicas, y los sistemas que no están programados para aceptarlas pueden producir resultados inesperados, como la ausencia de matrículas. [ 8 ]
Incidentes
A continuación se presenta una lista de algunos incidentes conocidos en los que el uso de una cadena mágica ha causado problemas.
- En varios casos, conductores con caracteres personalizados en sus placas de matrícula recibieron multas de tráfico incorrectas . En los sistemas de multas afectados, cuando los agentes de policía rellenaban una multa para un coche sin placa, escribían "NOPLATE", "NOTAG", "MISSING" o similares. Esto causó problemas cuando a los conductores se les asignaron placas de matrícula reales con estos valores, y por lo tanto comenzaron a recibir numerosas multas de tráfico destinadas a estos vehículos sin placa. [ 8 ]
- En 1999, unos hackers descubrieron una vulnerabilidad de seguridad en Hotmail que permitía a cualquiera iniciar sesión en cualquier cuenta de Hotmail usando la contraseña "eh". En aquel momento, se la denominó "el incidente de seguridad más extendido en la historia de la web". [ 9 ]
- Las personas con el apellido Null han reportado diversos problemas al usar sistemas en línea, como no poder reservar boletos de avión, usar sitios web de impuestos gubernamentales o pagar facturas de servicios públicos. [ 10 ] El problema se debe a que estos sistemas confunden su nombre con un puntero nulo . Dependiendo del sistema, esto puede provocar que el sistema no muestre su nombre, que le pida al usuario que ingrese un nombre diferente (a veces con un mensaje que indica que el campo del nombre se dejó en blanco) o que muestre un mensaje de error . [ 11 ]
Véase también
- Número mágico (programación)
- Errores de formato y almacenamiento de hora , para problemas que pueden ser causados por magics
- Valor centinela (también conocido como valor de bandera, valor de viaje, valor anómalo, valor de señal, datos ficticios)
- Valor canario , valor especial para detectar desbordamientos de búfer.
- Códigos de trucos para videojuegos que tienen el mismo origen
- XYZZY (comando)
Referencias
- ↑ Chris Falter (6 de marzo de 2008), Una buena solución para datos de cadenas mágicas , Tutoriales de Egghead Cafe, archivado del original el 13 de noviembre de 2009 , consultado el 11 de mayo de 2009.
- ↑ Wang Lam (21 de mayo de 2003), El comportamiento de los valores NULL en SQL , Universidad de Stanford , consultado el 13 de mayo de 2009.
- ↑ Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates; 2004, Head First Design Patterns , 1.ª ed., O'Reilly, Capítulo 6, pág. 214, El patrón Command , ISBN 0-596-00712-4, ISBN 978-0-596-00712-6
- ↑ James McCaffrey (2009), Automatización de pruebas para aplicaciones web ASP.NET con SSL , Microsoft , consultado el 13 de mayo de 2009 .
- ↑ Andrew Cumming; 2007, SQL Hacks , 1.ª ed., O'Reilly, pág. 174, Prevenir un ataque de inyección SQL , ISBN 0-596-52799-3, ISBN 978-0-596-52799-0
- ↑ Brian Knight, Allan Mitchell, Darren Green, Douglas Hinson, Kathi Kellenberger; 2005, Professional SQL Server 2005 Integration Services , 1.ª ed., John Wiley and Sons, Capítulo 5, pág. 129, Manejo de datos sucios , ISBN 0-7645-8435-9, ISBN 978-0-7645-8435-0
- ↑ Sezen, Tonguc Ibrahim; Isikoglu, Digdem (27 de abril de 2007). "De Ozans a God-Modes: Trampas en el entretenimiento interactivo de diferentes culturas" (PDF) . pág. 8. Consultado el 24 de enero de 2009 .
- 1 2 "¿Qué sucede cuando tu matrícula dice 'SIN MATRÍCULA'?" 30 de octubre de 1999.
- ↑ Glave, James (30 de agosto de 1999). "Hackers de Hotmail: 'Lo hicimos'"" . Wired . Condé Nast . Consultado el 16 de julio de 2024 .
- ↑ Baraniuk, Chris (25 de marzo de 2016). "Estas personas desafortunadas tienen nombres que estropean las computadoras" . BBC.com . Consultado el 30 de enero de 2022 .
- ↑ Null, Christopher (5 de noviembre de 2015). "Hola, soy el Sr. Null. Mi nombre me hace invisible para las computadoras" . Wired . Consultado el 30 de enero de 2022 .
- Antipatrones