Жесткое кодирование - Hard coding

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

Обзор

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

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

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

Жесткое кодирование и бэкдоры

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

Жесткое кодирование и DRM

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

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

Фиксированный путь установки

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

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

Загрузочный диск

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

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

Специальные папки

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

Путь к профилю

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

Путь к папке Мои документы

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

Решение

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

Жесткое кодирование особенно проблематично при подготовке программного обеспечения к переводу на другие языки.

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

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

Жесткое кодирование в соревнованиях

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

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