Вы когда-нибудь совершали ошибку, передавая свой пароль или ключ API в публичный репозиторий, такой как Github или Bitbucket? Я уверен, что большинство разработчиков допустили эту ошибку на ранних этапах развития своей карьеры один или два раза, прежде чем выучить урок.
В этой статье я объясню, как вы можете предотвратить случайное совершение вышеуказанной ошибки, отделив вашу конфиденциальную информацию от вашего кода, что предотвратит их случайную передачу в систему контроля версий, такую как git, и попадание в публичный репозиторий.
Есть несколько способов исключить вашу конфиденциальную информацию, такую как данные для входа в систему, секреты приложения или API, из вашего кода.
Теперь давайте посмотрим, как каждый из этих методов достигает нашей цели и как сделать это в приложении Java или Node в качестве примера.
Один из лучших подходов для предотвращения случайной публикации секретов вашего приложения в общедоступных репозиториях - это установить их как переменную среды в операционной системе вместо того, чтобы включать их в ваш код. Вы можете импортировать эти переменные среды во время выполнения и использовать их по мере необходимости.
Переменные среды относятся не только к приложениям, но и к операционной системе, в которой вы запускаете приложение. Способ установки переменной среды отличается от операционной системы к операционной системе.
В Windows 10 вы можете найти параметр для установки переменных среды вРасширенные настройки системыв свойствах системы (щелкните правой кнопкой мыши «Мой компьютер»> «Свойства»> «Дополнительные параметры системы»> выберите вкладку «Дополнительно»> «Переменные среды») или на панели управления.
В операционных системах на основе Linux, чтобы установить переменную среды для всех процессов в глобальном масштабе, вы можете включить свои секреты в виде пары ключ-значение в файл в/etc/profile.dкаталог. Вы можете назвать файл с описательным именем с расширением .sh в конце.
sudo cd /etc/profile.d
sudo touch <file_name>.sh
sudo gedit <file_name>.sh #You can use vim or any other text editor
Добавьте нужную переменную среды во вновь созданный файл следующим образом. Убедитесь, что между словами и знаком равенства нет лишних пробелов.
export <VARIABLE_KEY>=<VARIABLE_VALUE>#For exampleexport MY_SECRET=this_is_my_secret
Возможно, вам придется перезапустить операционную систему, чтобы эти глобальные переменные были доступны в вашей среде разработки.
Теперь вы можете импортировать эти переменные в ваш код во время выполнения. Например, вы можете получить значения переменных среды в Java с помощьюGETENV ()метод.
String variable = System.getenv("VARIABLE_KEY")//To get the value of the above exampleString mySecret = System.getenv("MY_SECRET")
В Node.js вы можете использовать переменные окружения в вашем коде следующим образом.
VARIABLE = process.env.VARIABLE_KEY//To get the value of the above examplemySecret = process.env.MY_SECRET
Но вы должны помнить о реализации таких методов, как блоки try-catch для обработки ошибок, которые могут возникнуть в случае отсутствия этих переменных среды.
Аргументы командной строки - это еще один способ задания переменных, которые можно импортировать во время выполнения. В отличие от переменных среды эти аргументы устанавливаются при запуске приложения в качестве свойств командной строки. Поэтому их необходимо указывать при каждом перезапуске программы, и они относятся к процессу, в котором переменные среды доступны для всех процессов, работающих в операционной системе. Способ установки и использования этих аргументов отличается от языка программирования к языку программирования.
В Java эти аргументы командной строки называютсяСвойства системы, Эти свойства могут быть установлены с помощью командной строки с параметром -D при запуске приложения следующим образом. Вы можете указать несколько пар ключ-значение, разделенных
java -DpropertyName=propertyValue MyAppLauncherClass#For examplejava -DmySecret=this_is_my_secret MySecretAppLauncherClass
Или вы можете установить их динамически в вашем коде следующим образом. (Не забывайте кавычки.)
System.setProperty("propertyName","propertyValue");
Вы можете использовать значение системного свойства, установленное любым способом, используяGetProperty ()метод.
String propertyValue = System.getProperty("propertyName");//For ExampleString mySecret = System.getProperty("mySecret");
Большинство современных Java IDE предоставляют графический интерфейс для установки этих аргументов командной строки / системных свойств, поэтому вам не нужно указывать их каждый раз, когда вы запускаете код в среде разработки.
В узле эти аргументы командной строки обрабатываются так же, как переменные среды, и они переопределяют любую переменную среды с тем же именем.
$ propertyName=propertyValue node index.js
Как и переменные окружения, к которым они могут быть прочитаны, мы обращаемся так же, как и к переменным окружения в Node.js.
Вместо того, чтобы жестко кодироваться в вашем коде, ключи API и имя пользователя / пароли могут быть включены в отдельный файл конфигурации. Они могут быть импортированы и использованы при необходимости. Например, когда вы работаете над проектом Java, вы можете хранить конфиденциальную информацию вconfig.properties”И написать класс чтения файлов свойств для импорта и использования данных в этом файле.
Только включение ваших секретов в отдельный файл не решит проблему, так как если этот файл конфигурации будет загружен в общедоступный репозиторий, ваша конфиденциальная информация будет снова предоставлена. Чтобы предотвратить это, вы можете включить этот файл конфигурации в«.Gitignore»что предотвратит фиксацию этого файла, если он не был добавлен принудительно.
Если другой программист захочет поработать над вашим проектом, он должен будет либо сам создать файл конфигурации с необходимыми данными, либо получить копию исходного файла конфигурации. Если вы не хотите предоставлять исходный файл конфигурации, вы должны предоставить рекомендации о том, как данные конфигурации должны быть включены в файл конфигурации, включая любой файл шаблона, такой как «config_template.propertiesС фиктивными данными илиПрочти меня"файл с необходимой информацией для повторного создания файла конфигурации.
Когда вы публикуете свой код, вы должны быть осторожны, чтобы не раскрывать вашу конфиденциальную информацию другим. Существует три простых способа отделить ваши секреты от кода. Они устанавливают ваши секреты в качестве общесистемных переменных среды, задают их в качестве аргументов командной строки или включают все из них в отдельный файл конфигурации и задают, чтобы они игнорировались системой контроля версий.
При использовании любого из вышеперечисленных методов вы должны предоставить четкую информацию о том, как установить необходимую информацию в"Прочти меня"файл или в коде для справки других или будущих разработчиков.
В следующей статье я объясню, как вы можете использовать git-хуки для предотвращения случайного передачи секретов в git.