В компьютерном программировании магическая строка — это ввод, который, по мнению программиста, никогда не придет извне и который активирует скрытую функциональность. Пользователь этой программы, скорее всего, предоставит ввод, который в большинстве ситуаций даст ожидаемый ответ. Однако, если пользователь на самом деле невинно (непреднамеренно) предоставит предопределенный ввод, вызывая внутреннюю функциональность, ответ программы часто оказывается для пользователя совершенно неожиданным (и, таким образом, выглядит «магическим»). [1]
Фон
Обычно реализация магических строк обусловлена временными ограничениями. Разработчик должен найти быстрое решение вместо того, чтобы глубже вникать в проблему и находить лучшее решение.
Например, при тестировании программы, которая берет персональные данные пользователя и проверяет номер его кредитной карты, разработчик может решить добавить быструю клавишу магической строки, с помощью которой ввод маловероятного ввода "***" в качестве номера кредитной карты заставит программу автоматически продолжить работу, как будто карта действительна, не тратя время на ее проверку. Если разработчик забудет удалить волшебную строку, и пользователь финальной программы случайно введет "***" в качестве заполнителя номера кредитной карты при заполнении формы, пользователь непреднамеренно активирует скрытую функциональность.
Разрешение
Ситуации/вопросы причины
Часто существуют значительные временные ограничения, которые неподконтрольны разработчику с самого начала его участия в проекте. Распространенные проблемы, которые могут привести к этому антишаблону в результате:
Null != null [2] или любая вариация, где тип данных не сравнивается побитово с предположительно идентичным типом. Это проблема, которая может возникнуть даже в одной и той же среде разработки (один и тот же язык программирования и компилятор). Эта проблема имеет долгую историю для числовых и логических типов, и большинство компиляторов справляются с ней хорошо (с соответствующими предупреждениями и ошибками, разрешением по умолчанию и т. д.). Типы, допускающие значение null, такие как строки, имеют сложность исторически различных определений для NULL . Выдаваемые ошибки/предупреждения часто являются общими или «наиболее подходящими» ошибками по умолчанию, сообщение о которых на самом деле не описывает, что происходит. Если разработчик не может получить достаточно подсказок, чтобы отследить проблему с помощью отладки, то, возможно, единственным способом сохранить проект в соответствии с графиком будет использование сокращенного пути и кодирование в строке «по умолчанию». Одним из решений этой проблемы может быть применение шаблона Null Object . [3]
Запрограммировано в угол. Иногда дизайн кажется простым и даже прямолинейным, но оказывается, что имеет логический изъян, зависящий от возможных пользовательских входов, из-за часто непредвиденных обстоятельств к концу запланированной разработки. Таким образом, разработчик может почувствовать необходимость реализовать пользовательский вход с особыми допусками безопасности/эксплуатации, чтобы справиться с такими обстоятельствами. Это может быть особенно иронично, поскольку иногда становится очевидным, что более надежный дизайн с самого начала, вероятно, оставил бы место для обработки изъяна. Однако это, возможно, заняло бы слишком много времени для реализации и могло бы противоречить фундаментальной инженерной концепции KISS , сохраняя дизайн и реализацию простыми и отвечая только первоначальным необходимым требованиям.
Разрешение внешнего доступа к глобальному флагу. [4] Чрезмерная уверенность в том, что глобальный флаг никогда не может быть установлен случайно или злонамеренно (часто вполне разумное предположение), оправдывает такую реализацию для целей тестирования и отладки, особенно для небольших приложений с простыми интерфейсами. Однако, если распределение программы значительно, обычно это всего лишь вопрос времени, прежде чем кто-то установит флаг. Очевидное решение — никогда не использовать глобальную переменную таким образом. Разработчик также может непреднамеренно сделать флаг доступным по обстоятельствам . Таким образом, магическая строка сама по себе будет обрабатываться программой как любой другой ввод. [5] Затем пользователю придется воспроизвести настройку, а также создать некоторую коллекцию других событий, которые пользовательский интерфейс незаметно допускает, чтобы флаг принял настройку — гораздо менее вероятный (хотя все еще возможный) сценарий.
Строгое форматирование
Ограничение формата ввода является возможным решением по обслуживанию (исправлению ошибок) — по сути, это означает проверку входной информации для проверки ее правильности в формате, чтобы снизить вероятность обнаружения пользователем магической строки. Примерами являются проверка телефонного номера для обеспечения того, чтобы он содержал только цифры (и, возможно, пробелы и знаки препинания в ограниченной степени) или проверка того, что имя человека содержит имя и фамилию (и правильно написано заглавными буквами). Исключение сделано для магической строки в коде проверки, чтобы она не была отклонена проверкой. Ожидается, что, поскольку пользователь, скорее всего, быстро заметит строгое соблюдение форматирования, ему, скорее всего, не придет в голову попытаться ввести строку, не соответствующую формату. Поэтому маловероятно, что пользователь попробует магическую строку.
Как и в случае с любым процессом проверки ввода, важно убедиться, что формат не является ограничительным таким образом, чтобы непреднамеренно ограничивать использование приложения некоторыми пользователями. Примером этого является ограничение ввода телефонного номера или почтового индекса [6] на основе системы одной страны (например, требование от каждого пользователя указывать пятизначный почтовый индекс ), что создает проблемы для законных пользователей, которые находятся в других странах.
Целенаправленное внедрение
Как это часто бывает с анти-шаблонами, существуют определенные сценарии, где магические строки являются правильным решением для реализации. Примерами являются чит-коды [7] и пасхальные яйца . Кроме того, есть случаи, когда пользователи изобретают магические строки, и системы, которые не закодированы для их принятия, могут выдавать неожиданные результаты, такие как отсутствие номерных знаков. [8]
Инциденты
Этот список неполный ; вы можете помочь, добавив недостающие пункты. ( Январь 2022 г. )
Ниже приведен список некоторых известных случаев, когда использование волшебной нити приводило к проблемам.
В нескольких различных случаях водители с персонализированными строками на регистрационных знаках своих транспортных средств получали неправильные штрафы за нарушение правил дорожного движения . В затронутых системах выдачи билетов, когда сотрудники полиции заполняли штраф за нарушение правил дорожного движения для автомобиля без регистрационного знака, они писали «NOPLATE», «NOTAG», «MISSING» или что-то подобное. Это вызывало проблемы, когда водителям выдавали настоящие регистрационные знаки с этими значениями, и, таким образом, они начали получать многочисленные штрафы за нарушение правил дорожного движения, предназначенные для этих транспортных средств без номерных знаков. [8]
В 1999 году хакеры обнаружили уязвимость в системе безопасности Hotmail , которая позволяла любому человеку войти в любой аккаунт Hotmail, используя пароль «eh». В то время это назвали «самым масштабным инцидентом безопасности в истории Интернета». [9]
Люди с фамилией Null сообщали о различных проблемах с использованием онлайн-систем, таких как невозможность забронировать билеты на самолет, использовать правительственные налоговые сайты или оплачивать счета за коммунальные услуги. [10] Проблема возникает из-за того, что эти системы путают их имя с указателем null . В зависимости от системы это может привести к тому, что система не будет показывать их имя, попросит пользователя ввести другое имя (иногда с сообщением о том, что поле имени было оставлено пустым) или покажет сообщение об ошибке. [11]
↑ Крис Фальтер (6 марта 2008 г.), Хорошее решение для данных Magic String, Egghead Cafe Tuturiols , получено 11 мая 2009 г.
↑ Wang Lam (21 мая 2003 г.), The Behavior of NULL's in SQL, Стэнфордский университет , получено 13 мая 2009 г.
^ Эрик Фримен, Элизабет Фримен, Кэти Сьерра, Берт Бейтс; 2004, Head First Design Patterns , 1-е изд., O'Reilly, Глава 6, стр. 214, The Command Pattern , ISBN 0-596-00712-4 , ISBN 978-0-596-00712-6
↑ Джеймс Маккаффри (2009), Автоматизация тестирования для веб-приложений ASP.NET с SSL, Microsoft , получено 13 мая 2009 г.
^ Эндрю Камминг; 2007, SQL Hacks , 1-е изд., O'Reilly, стр. 174, Предотвращение атаки с использованием SQL-инъекции , ISBN 0-596-52799-3 , ISBN 978-0-596-52799-0
^ Брайан Найт, Аллан Митчелл, Даррен Грин, Дуглас Хинсон, Кэти Келленбергер; 2005, Профессиональные службы интеграции SQL Server 2005 , 1-е изд., John Wiley and Sons, Глава 5, стр. 129, Обработка грязных данных , ISBN 0-7645-8435-9 , ISBN 978-0-7645-8435-0
^ Сезен, Тонгуч Ибрагим; Исикоглу, Дигдем (27 апреля 2007 г.). «От Озанов до Божественных режимов: мошенничество в интерактивных развлечениях из разных культур» (PDF) . стр. 8. Получено 24 января 2009 г.
^ ab «Что происходит, когда на вашем номерном знаке написано «НЕТ НОМЕРА»?». 30 октября 1999 г.
↑ Глэйв, Джеймс (30 августа 1999 г.). «Hotmail Hackers: „We Did It“». Wired . Condé Nast . Получено 16 июля 2024 г. .
^ Баранюк, Крис (25 марта 2016 г.). «У этих несчастных людей имена, которые ломают компьютеры». BBC.com . Получено 30 января 2022 г. .
↑ Null, Кристофер (5 ноября 2015 г.). «Привет, я мистер Null. Мое имя делает меня невидимым для компьютеров». Wired . Получено 30 января 2022 г.