Жёсткое кодирование ("~vmtky tk;njkfguny)

Перейти к навигации Перейти к поиску

Жёсткое кодирование (также хардкодинг (от англ. hard coding) ) — это практика разработки программного обеспечения, заключающаяся в встраивании данных непосредственно в исходный код программы или другой исполняемый объект, в отличие от получения данных из внешних источников или их генерации во время выполнения .

Жёстко закодированные данные обычно можно изменить только путём редактирования исходного кода и перекомпиляции исполняемого файла, хотя их можно изменить в памяти или на диске с помощью отладчика или Hex-редактора .

Данные, которые жёстко закодированы, лучше всего подходят для неизменяемых фрагментов информации, таких как физические константы, номера версий и статические текстовые элементы.

Данные с программным кодированием, с другой стороны, кодируют произвольную информацию посредством пользовательского ввода, текстовых файлов, файлов INI, ответов HTTP-сервера, файлов конфигурации, макросов препроцессора, внешних констант, баз данных, аргументов командной строки и определяются во время выполнения.

Обзор[править | править код]

Жёсткое кодирование требует изменения исходного кода программы каждый раз, когда изменяются входные данные или желаемый формат, когда конечному пользователю может быть удобнее изменить детали каким-либо образом вне программы. [1]

Часто требуется жёсткое кодирование, но его также можно считать антишаблоном . [2] У программистов может не быть разработанного решения динамического пользовательского интерфейса для конечного пользователя, но они все равно должны предоставить эту функцию или выпустить программу. Обычно это носит временный характер, но в краткосрочной перспективе устраняет необходимость доставки кода. Позже выполняется программное кодирование, позволяющее пользователю передавать параметры, которые дают конечному пользователю возможность изменять результаты или результат.

Термин "жесткий код" первоначально использовался как аналогия с аппаратными схемами, а в контексте расширяемых сред совместной разработки во время выполнения, таких как MUD, чтобы передать недостаток гибкости, возникающий в результате его использования при разработке и реализации программного обеспечения, жесткое кодирование включает текстовые файлы, INI-файлы, макросы препроцессора, внешние константы, и данные. - Сервер, конфигурационные файлы и пользовательский ввод. В данном случае этот термин не является уничижительным и относится не к конкретной реализации результата, а к общему развитию.

Хардкодинг и бэкдоры[править | править код]

Жёсткое кодирование учётных данных — популярный способ создания бэкдора . Жёстко закодированные учётные данные обычно не видны в файлах конфигурации или выводе команд перечисления учётных записей, и пользователи не могут легко изменить или обойти их. В случае обнаружения пользователь может отключить такой бэкдор, изменив и пересобрав программу из ее исходного кода ( если исходный код общедоступен ), декомпилировав или реконструировав программное обеспечение, напрямую отредактировав двоичный код программы или установив целостность. проверки (например, цифровые подписи, защита от несанкционированного доступа и защита от мошенничества ), чтобы предотвратить неожиданный доступ, но такие действия часто запрещены лицензионным соглашением с конечным пользователем .

Жесткое кодирование и DRM[править | править код]

В качестве меры управления цифровыми правами разработчики программного обеспечения могут жестко закодировать уникальный серийный номер непосредственно в программе. Или принято жестко запрограммировать открытый ключ, создавая DRM, для которого невозможно создать генератор ключей.

В противоположном случае взломщик программного обеспечения может жестко запрограммировать действительный серийный номер программы или даже запретить исполняемому файлу запрашивать его у пользователя, позволяя перераспределять неавторизованные копии без необходимости ввода действительного номера, таким образом используя один и тот же код. ключ для каждой копии, если она жёстко запрограммирована.

Исправлен путь установки[править | править код]

Если программа Windows запрограммирована так, что она всегда устанавливается в C:\Program Files\Appname, и кто-то пытается установить ее на другой диск из-за нехватки места или по организационным причинам, она может не установиться или не запустится после установки. Эту проблему можно не выявить в процессе тестирования, поскольку средний пользователь выполняет установку на диск и каталог по умолчанию, а тестирование может не включать возможность изменения каталога установки. Однако программистам и разработчикам рекомендуется не фиксировать путь установки программы, поскольку путь установки по умолчанию зависит от операционной системы, версии ОС и решений сисадмина . Например, во многих установках Microsoft Windows в качестве основного жесткого диска используется диск C:, но это не гарантируется.

Похожая проблема была с микропроцессорами ранних компьютеров, которые начинали выполнение по фиксированному адресу в памяти.

Загрузочный диск[править | править код]

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

Этот последний пример показывает, почему жесткое кодирование может оказаться непрактичным, даже если на тот момент казалось, что оно будет работать полностью. В 1980-х и 1990-х годах подавляющее большинство компьютеров было оснащено хотя бы одним дисководом для гибких дисков, но позже дисководы для гибких дисков вышли из употребления. Программа, жестко запрограммированная таким образом 15 лет назад, может столкнуться с проблемами, если ее не обновить.

Специальные папки[править | править код]

Некоторые операционные системы Windows имеют так называемые специальные папки, которые логически упорядочивают файлы на жестком диске. Существуют проблемы, которые могут возникнуть при жестком кодировании:

Путь к профилю[править | править код]

Некоторые программы Windows жестко кодируют путь профиля к папкам, определенным разработчиком, например C:\Documents and Settings\ Username . Это путь для подавляющего большинства Windows 2000 или более поздних версий, но это может привести к ошибке, если профиль хранится в сети или перемещается иным образом. Правильный способ получить его — вызвать функцию GetUserProfileDirectory или разрешить переменную среды %userprofile% . Еще одно предположение, которое часто делают разработчики, — это предположение, что профиль находится на локальном жестком диске.

Путь к папке «Мои документы»[править | править код]

Некоторые программы Windows жестко кодируют путь к My Documents как ProfilePath \My Documents . Эти программы будут работать на компьютерах с английской версией, но в локализованных версиях Windows эта папка обычно имеет другое имя. Например, в итальянских версиях папка My Documents называется Documenti . My Documents также могли быть перемещены с помощью перенаправления папок в групповой политике в Windows 2000 или более поздней версии. Правильный способ получить его — вызвать функцию SHGetFolderPath .

Решение[править | править код]

Косвенную ссылку, такую как переменная внутри программы под названием «Имя файла», можно расширить, открыв диалоговое окно «Обзор файла», и код программы не придется изменять, если файл будет перемещен.

Часто одни и те же жестко закодированные значения, такие как размер массива, могут встречаться в исходном коде программы несколько раз. Это будет магическое число. Обычно это может привести к программным ошибкам, если изменяются некоторые признаки значения, но не все. Такие ошибки трудно обнаружить, и они могут оставаться в программе в течение длительного времени. Если одно и то же жестко закодированное значение используется для нескольких значений параметров, например, для массива из 6 элементов, минимальная длина входной строки равна 6, может возникнуть аналогичная проблема. Программист может случайно изменить все экземпляры значения, не проверив в коде, как используется каждый экземпляр (обеих ситуаций можно избежать, определив константы, которые связывают имена со значениями, и используя имена констант для каждого вхождения в коде.

Одним из ключевых случаев жесткого кодирования является размещение строк непосредственно в файле, и переводчик может редактировать исходный код для перевода программы (существует инструмент под названием gettext, который позволяет оставлять строки в файле, но переводчик может переводить их без изменения исходного кода).).

Жесткое программирование на соревнованиях[править | править код]

В компьютерных соревнованиях, таких как Международная олимпиада по информатике, участники должны написать программу с определенным шаблоном ввода-вывода в соответствии с требованиями вопросов.

В редких случаях, когда количество возможных входных данных очень невелико, участники могут рассмотреть возможность использования подхода, который сопоставляет все возможные входные данные с правильным результатом. Эта программа считается жестко запрограммированным решением и не является алгоритмическим решением (жестко запрограммированная программа не является алгоритмическим решением).

Рекомендации[править | править код]

  1. Elfriede Dustin. Effective Software Testing: 50 Specific Ways to Improve Your Testing. — Addison-Wesley Professional, 2002. — P. 188–. — ISBN 978-0-201-79429-8.
  2. Tanya Janca. Alice and Bob Learn Application Security. — Wiley, 14 October 2020. — P. 15–. — ISBN 978-1-119-68740-5.