Магическая строка

Магическая строка — это входные данные, которые, как считает программист, никогда не будут получены извне и которые активируют скрытые функции. Пользователь такой программы обычно вводит данные, которые в большинстве ситуаций дают ожидаемый ответ. Однако, если пользователь случайно (непреднамеренно) вводит заранее определённую строку, активирующую внутреннюю функциональность, ответ программы часто совершенно неожиданнный для пользователя (а потому кажется «магическим»)[1].

Предпосылки

Обычно магические строки появляются из-за нехватки времени. Разработчик вынужден искать быстрое решение, вместо того, чтобы глубже вникнуть в проблему и найти вариант лучше. Например, при тестировании программы, которая обрабатывает личные данные пользователя и проверяет номер кредитной карты, разработчик может решить добавить магическую строку в качестве сокращения. Ввод маловероятного значения, такого как «***» в качестве номера кредитной карты приведёт к тому, что программа автоматически продолжит работу, как если бы номер карты был правильным, не тратя времени на проверку карты. Если разработчик забудет удалить магическую строку, а пользователь финальной версии программы случайно введёт «***» в качестве номера кредитной карты при заполнении формы, пользователь непреднамеренно активирует скрытую функциональность.

Решение

Причины ситуаций/проблем

Часто с самого начала участия разработчика в проекте существуют значительные ограничения по времени, не зависящие от него. Ниже приведены распространенные проблемы, которые могут привести к этому анти-паттерну в результате:

  • Null != null[2] или любые вариации, когда тип данных не сравнивается побитно с предположительно идентичным типом. Эта проблема может возникнуть даже в одной и той же среде разработки (тот же язык программирования и тот же компилятор). Эта проблема имеет долгую историю для числовых и булевых типов, и большинство компиляторов хорошо с ней справляются (с соответствующими предупреждениями и ошибками, разрешением по умолчанию и т.д.). Допускающие пустую ссылку типы, такие как строки, сталкиваются с трудностями из-за исторических различий определения NULL. Возникающие ошибки и предупреждения часто имеют обобщённый вид или представляют собой «наилучший вариант» ошибки, сообщение о которой не всегда описывает точно, что произошло. Если разработчик не может получить достаточно подсказок для выявления проблемы через отладку, использование обходного пути и кодирование в «строке по умолчанию» может стать единственным способом сохранить проект в графике. Одним из решений может быть применение шаблона Null object[3].
  • Загнан в угол программированием. Иногда кажется, что проект понятен и даже прост, но обнаруживается логическая ошибка, связанная с возможным вводом данных пользователем из-за непредвиденных обстоятельств, возникающих ближе к концу разработки. Разработчик может чувствовать необходимость реализовать ввод данных пользователем со специальными мерами безопасности или допуска, чтобы справиться с этими обстоятельствами. Ирония в том, что часто становится очевидно: более продуманный дизайн с самого начала, вероятно, позволил бы избежать этой проблемы. Однако его реализация могла бы занять слишком много времени и противоречила бы фундаментальному инженерному принципу KISS (Keep It Simple, Stupid) – сохранять дизайн и реализацию простыми и удовлетворяющими только первоначальным необходимым требованиям.
  • Разрешение внешнего доступа к глобальному флагу[4]. Чрезмерная уверенность в том, что глобальный флаг никогда не может быть установлен случайно или злонамеренно (что часто является вполне разумным предположением), оправдывает такую реализацию для целей тестирования и отладки, особенно для небольших приложений с простыми интерфейсами. Однако, если программа широко распространена, рано или поздно кто-нибудь установит этот флаг. Очевидным решением является никогда не использовать глобальную переменную таким образом. Разработчик также может непреднамеренно сделать флаг доступным при определенных обстоятельствах. Таким образом, сама по себе «магическая строка» будет обрабатываться программой как любой другой ввод[5]. Пользователю придётся воспроизвести как настройку, так и конкретный набор обстоятельств или событий, которые позволяют пользовательскому интерфейсу принять эту настройку — сценарий гораздо менее вероятный (хотя и все еще возможный).

Строгое форматирование

Ограничение формата входных данных является одним из возможных решений. Это означает проверку входящей информации на соответствие формату, чтобы снизить возможность случайного обнаружения магической строки пользователем. В качестве примеров можно привести проверку телефонного номера на содержание только цифр (и, возможно, пробелы и некоторые разделители из небольшого списка) или проверку, что имя человека содержит имя и фамилию (и они правильно используют заглавные буквы). Исключение делается для самой магической строки, чтобы она не была отклонена в ходе проверки. Предполагается, что, поскольку пользователь, скорее всего, быстро заметит строгое соблюдение формата, ему вряд ли придет в голову вводить строку, не соответствующую этому формату. Следовательно, вероятность того, что пользователь попытается ввести «магическую строку», очень мала.

При проверке входных данных важно убедиться, что формат не является излишне строгим и не ограничивает непреднамеренно использование приложения некоторыми пользователям. Например, если при вводе телефонного номера или почтового индекса[6] использовать формат, принятый в одной стране (например, требовать от всех пользователей вводить пятизначный почтовый индекс), это может создать проблемы для законных пользователей из других стран.

Осмысленная реализация

Как это часто бывает с антипаттернами, существуют конкретные сценарии, когда магические строки являются правильным решением для реализации. Примерами могут служить чит-коды[7] и пасхальные яйца. Более того, есть случаи, когда ввод магической строки в системе, которая не запрограммирована для их обработки, выдаёт неожиданный результат, например, отсутствие лицензии[8].

Происшествия

Ниже приведён список известных случаев, когда введённая магическая строка вызывала проблемы.

  • В нескольких различных случаях водители с персонализированными номерными знаками получали ошибочные штрафы за нарушение правил дорожного движения. В затронутых системах оформления штрафов, когда сотрудники полиции выписывали штраф за автомобиль без номерного знака, они указывали «NOPLATE», «NOTAG», «MISSING» или аналогичные обозначения. Это приводило к проблемам, когда водители, имевшие реальные номерные знаки с такими значениями, начинали получать множество штрафов, предназначенных для автомобилей без номеров[8].
  • В 1999 году хакеры обнаружили уязвимость в системе Hotmail, которая позволяла любому войти в любой аккаунт, используя пароль «eh». В то время это было названо «самым масштабным инцидентом безопасности в истории Интернета»[9].
  • Люди с фамилией Null заявляли о различных проблемах при использовании онлайновых сервисов, в частности, проблемы с заказом билетов на самолёты, использование государственных налоговых сайтов или оплату счетов[10]. В зависимости от системы, это может привести к тому, что имя не будет отображаться, система предложит пользователю ввести другое имя (иногда с сообщением о том, что поле имени было оставлено пустым), или же появится сообщение об ошибке[11].

См. также

Примечания

  1. Chris Falter (6 марта 2008), A Good Solution for Magic String Data, Egghead Cafe Tuturiols, Архивировано из оригинала 13 ноября 2009, Дата обращения: 11 мая 2009
  2. Wang Lam (21 мая 2003), The Behavior of NULL's in SQL, Stanford University, Дата обращения: 13 мая 2009
  3. Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates. Chapter 6 The Command Pattern // Head First Design Patterns. — 1st ed.. — O'Reilly,, 2004. — С. 214. — ISBN 978-0-596-00712-6.
  4. James McCaffrey (2009), Test Automation for ASP.NET Web Apps with SSL, Microsoft, Дата обращения: 13 мая 2009
  5. Andrew Cumming. Prevent an SQL Injection Attack // SQL Hacks. — 1st ed.. — O'Reilly, 2007. — С. 174. — ISBN 978-0-596-52799-0.
  6. Brian Knight, Allan Mitchell, Darren Green, Douglas Hinson, Kathi Kellenberger. Chapter 5 Handling Dirty Data // Professional SQL server 2005 integration services. — 1st ed.. — John Wiley and Sons, 2005. — С. 129. — ISBN 0-7645-8435-9.
  7. Isikoglu, Digdem; Sezen, Tonguc Ibrahim. From Ozans to God-Modes: Cheating in Interactive Entertainment From Different Cultures 8 (27 апреля 2007). Дата обращения: 24 января 2009.
  8. 1 2 What Happens when Your License Plate Says 'NO PLATE'? (30 октября 1999).
  9. James Glave. Hotmail Hackers: 'We Did It' // Wired. — Condé Nast.
  10. Baraniuk, Chris. These unlucky people have names that break computers (англ.). BBC.com (25 марта 2016). Дата обращения: 30 января 2022.
  11. Christopher Null. Hello, I'm Mr. Null. My Name Makes Me Invisible to Computers // Wired.