Entrada que activa una funcionalidad que de otro modo estaría oculta
En programación informática , una cadena mágica es una entrada que un 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 la entrada predefinida, invocando la funcionalidad interna, la respuesta del programa a menudo es 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 más en un 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 puede decidir agregar un atajo de cadena mágica mediante el cual al ingresar el improbable dato "***" como número de tarjeta de crédito, el programa procedería automáticamente como si la tarjeta fuera válida, sin perder tiempo verificándola. Si el desarrollador olvida eliminar la cadena mágica y un usuario del programa final ingresa "***" como número de tarjeta de crédito como marcador de posición mientras completa el formulario, el usuario activaría inadvertidamente la funcionalidad oculta.
Resolución
Situaciones/cuestiones de causa
A menudo, existen limitaciones de tiempo significativas que escapan al control del desarrollador desde el comienzo de su participación en un proyecto. Problemas comunes que pueden dar lugar a este antipatrón:
- Null != null [2] o cualquier variación en la que un tipo de datos no se compare 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 que aceptan valores NULL , como las cadenas, tienen la dificultad de tener 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 en una cadena "predeterminada" puede ser la única forma de mantener el proyecto según lo programado. Una solución a esto puede ser la aplicación del patrón Null Object . [3]
- Programado en un rincón. A veces, un diseño parece sencillo e incluso directo, pero resulta tener un fallo lógico, que depende de las posibles aportaciones 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 aportación del usuario con permisos especiales de seguridad/operación para hacer frente a tales circunstancias. Esto puede ser particularmente irónico, ya que a veces se hará evidente que un diseño más robusto desde el principio probablemente habría dejado espacio para manejar la falla. Sin embargo, esto tal vez hubiera llevado demasiado tiempo para implementarse y podría haber entrado en conflicto con el concepto de ingeniería fundamental de KISS , mantener un diseño y una implementación simples y cumplir solo con los requisitos iniciales necesarios.
- Permitir el acceso externo a una bandera global . [4] La confianza excesiva en que una bandera global nunca se puede establecer de forma accidental o maliciosa (a menudo una suposición bastante razonable) justifica dicha implementación para fines de prueba y depuración, especialmente para pequeñas aplicaciones con interfaces simples. Sin embargo, si la distribución del programa es considerable, normalmente es solo cuestión de tiempo antes de que alguien establezca la bandera. Una solución obvia es no usar nunca una variable global de esa manera. Un desarrollador también podría hacer que la bandera sea accesible circunstancialmente . De modo que la cadena mágica por sí sola sería tratada por el programa como cualquier otra entrada. [5] El usuario tiene entonces que reproducir la configuración, así como producir alguna colección de otros eventos, que la interfaz de usuario permite discretamente, para que la bandera acepte la configuración; un escenario mucho más improbable, aunque todavía posible.
Formato estricto
Restringir el formato de la entrada es una posible solución de mantenimiento (corrección de errores). [ aclaración necesaria ] Básicamente, esto significa validar la información de entrada para comprobar que está en el formato correcto, con el fin de reducir la posibilidad de que el usuario descubra la cadena mágica. Los ejemplos incluyen validar un número de teléfono para garantizar que solo contenga dígitos (y posiblemente espacios y puntuación en una medida limitada) o verificar que el nombre de una persona tenga un nombre y un apellido (y esté escrito con mayúsculas apropiadas). Se hace una excepción para la cadena mágica en el código de validación para que no sea rechazada por la validación. Se espera que, dado que un usuario probablemente notará rápidamente la aplicación estricta del formato, es probable que no se le ocurra intentar ingresar una cadena que no se ajuste al formato. Por lo tanto, es muy poco probable que el usuario intente ingresar la cadena mágica.
Al igual que con cualquier proceso de validación de entrada, es importante asegurarse de que el formato no sea restrictivo de manera que restrinja involuntariamente el uso de la aplicación por parte de algunos usuarios. Un ejemplo de esto es restringir la entrada de un número de teléfono o un código postal [6] en función del 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 se encuentran en otros países.
Implementación con propósito
Como suele suceder con los antipatrones, existen escenarios específicos en los que las cadenas mágicas son una solución correcta para una implementación. Algunos ejemplos son los códigos de trampa [7] y los huevos de Pascua . Además, hay casos en los que los usuarios inventan cadenas mágicas y los sistemas que no han codificado para aceptarlas pueden producir resultados inesperados, como la falta de matrículas. [8]
Incidentes
La siguiente es una lista de algunos incidentes conocidos en los que el uso de una cuerda mágica ha causado problemas.
- En varios casos diferentes, los conductores con cadenas personalizadas en las matrículas de sus vehículos han recibido multas de tráfico incorrectas . En los sistemas de multas afectados, cuando los agentes de policía rellenaban una multa de tráfico para un coche sin matrícula, escribían "NOPLATE", "NOTAG", "MISSING" o algo similar. Esto causó problemas cuando a los conductores se les concedían matrículas reales con estos valores, y así empezaron a recibir numerosas multas de tráfico destinadas a estos vehículos sin matrícula. [8]
- En 1999, unos piratas informáticos descubrieron un fallo de seguridad en Hotmail que permitía a cualquiera iniciar sesión en cualquier cuenta de Hotmail utilizando la contraseña "eh". En su momento se lo denominó "el incidente de seguridad más extendido en la historia de la Web". [9]
- Las personas con el apellido Null han informado de diversos problemas al utilizar sistemas en línea, como la imposibilidad de reservar billetes de avión, utilizar sitios web de impuestos del gobierno o pagar facturas de servicios públicos. [10] El problema surge de que estos sistemas confunden su nombre con un puntero nulo . Según el sistema, esto puede provocar que el sistema no muestre su nombre, que le pida al usuario que introduzca un nombre diferente (a veces con un mensaje que afirma que el campo de nombre se ha dejado en blanco) o que muestre un mensaje de error. [11]
Véase también
Referencias
- ^ Chris Falter (6 de marzo de 2008), Una buena solución para los datos de cadenas mágicas, Egghead Cafe Tuturiols , consultado el 11 de mayo de 2009
- ^ Wang Lam (21 de mayo de 2003), The Behavior of NULL's in SQL, Stanford University , consultado el 13 de mayo de 2009
- ^ Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates; 2004, Patrones de diseño Head First , 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, Cómo 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, Servicios de integración de SQL Server 2005 profesionales , 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 los Ozans a los God-Modes: trampas en el entretenimiento interactivo de diferentes culturas" (PDF) . p. 8. Consultado el 24 de enero de 2009 .
- ^ ab "¿Qué sucede cuando su matrícula dice 'SIN PLACA'?". 30 de octubre de 1999.
- ^ Glave, James (30 de agosto de 1999). «Los piratas informáticos 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 rompen 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 .