Lerne Coding
Sensible Daten in eine .env Datei auslagern

Der Vorteil von .env Dateien

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

Git wird nicht nur gerne für Versionierung verwendet, sondern auch für das automatische Veröffentlichen neuer Updates. Die Zeiten, in denen man mit Kdiff verglichen und via FTP hochgeladen hat, sind vorbei. Doch sobald sensible Daten wie Passwörter oder API-Keys verwendet werden, fällt die Laune schnell in den Keller. Niemand hat Lust, seine privaten Daten zu versionieren. Die Folgen wären gerade bei Open-Source-Projekten fatal.

Die Lösung ist ganz einfach: eine Datei mit allen sensiblen Daten, welche jeder auf dem Rechner hat, aber gleichzeitig nicht versioniert wird. Das kann beispielsweise eine Datei in der Sprache deines Projekts sein, aber auch ein zentrales Dateiformat wie JSON. Letztendlich hat man sich jedoch auf den Standard der .env Dateien als einheitliches Format geeinigt.

Erstellen einer .gitignore Datei

Damit Git eine Datei oder ein Verzeichnis ignoriert, braucht es eine .gitignore Datei. Beachte, dass die Datei keine weitere Dateiendung wie .txt besitzt, da Git diese Datei sonst ignorieren wird. Sollte dir Windows das Erstellen dieser Datei verbieten, erstelle diese in einem Editor.

Nachdem du nun die Datei erstellt hast, kannst du pro Zeile eine Datei oder ein Verzeichnis hinzufügen, welches bei der Versionierung ignoriert werden soll. Das kann wie folgt aussehen:

/.env
/someFile.txt
/someDir/

Was ist eine .env Datei?

Eine .env Datei ist zunächst eine normale Textdatei, welche mit jedem Editor geöffnet werden kann. Zuerst wird der Name einer Umgebungsvariable gesetzt, darauf folgt ein "ist gleich" Zeichen und anschließend, ohne Leerzeichen, der Wert der Variable. Der Wert kann aber kein beliebiger Wert, sondern muss ein String oder eine Zahl sein. Booleans können als Zahl mit 0 und 1 dargestellt werden und Arrays als JSON. Hier ein Beispiel aus einem aktuellen Projekt:

DEBUG=1

WEBMASTER_NAME="Tim Riedl"
WEBMASTER_MAIL="webmaster@timriedl.com"

MYSQL_HOST="localhost"
MYSQL_HOST_USER="NUTZERNAME"
MYSQL_HOST_PASS="PASSWORT"
MYSQL_HOST_TABL="TABELLE"

EMAIL_HOST="localhost"
EMAIL_PORT=12345
EMAIL_ADDR="MAIL@ADRESSE.DE"
EMAIL_NAME="ICH"
EMAIL_PASS="PASSWORT"
EMAIL_PROTOCOL="PROTOKOLL"
EMAIL_SMTP_AUTH=1

Erstellen einer .env Datei

Da natürlich niemand riechen kann, was in einer .env Datei so alles stehen muss und schon gar nicht die Namen der Variablen weiß, werden Beispiel-Dateien mitgeliefert, also Dateien mit dem Aufbau der .env Datei, jedoch mit leeren Werten. Somit kann sich jeder diese Datei kopieren und sie wie eine Art Formular ausfüllen.

Beispiel .env-Datei
Beispiel .env-Datei

Parsen einer .env Datei

Da ich dir nun gezeigt habe, wie man diese Datei schreiben kann, möchte ich dir nun zeigen, wie du die Werte in deinem Projekt importieren kannst. Dazu habe ich mir die Programmiersprachen PHP, Python und NodeJS ausgesucht und die Vorgehensweisen an jeweils einem Beispiel beschrieben.

In PHP Parsen einer .env Datei

Da PHP keinen .env Parser integriert hat, nutze ich dazu ein Paket.

Github Logovlucas/phpdotenv
12.894 4 615

Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.

Für die Installation des Pakets verwende ich Composer. Solltest du nicht wissen, was Composer ist, dann schaue dir gerne den Artikel von Felix dazu an. Mit folgendem Paket installierst du das Paket:

composer require vlucas/phpdotenv

Um nun die Datei einzulesen und zu parsen, importiere den Composer Autoloader, erstelle eine Instanz von Dotenv mit dem Verzeichnis, in dem sich deine Datei befindet (in meinem Fall das aktuelle, also DIR) und rufe die Funktion load() auf. Nun hast du alle Werte in der globalen $_ENV Variable zur Verfügung.

require_once __DIR__."/vendor/autoload.php";
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

echo "Der Webmaster heißt: ".$_ENV['WEBMASTER_NAME'];

In Python Parsen einer .env Datei

In Python musst du ebenfalls ein Paket installieren. Dazu verwende ich den Paketmanager pip.

Github Logotheskumar/python-dotenv
6.965 55 399

Reads key-value pairs from a .env file and can set them as environment variables. It helps in developing applications following the 12-factor principles.

Installiert werden Python Pakete über den PIP Paketmanager.

pip install -U python-dotenv

In Python müssen die Pakete dotenv und os importiert werden um die Werte der .env Datei auslesen zu können.

from dotenv import load_dotenv
import os
load_dotenv()

print("Der Webmaster heißt: "+str(os.getenv("WEBMASTER_NAME")))

In NodeJS Parsen einer .env Datei

In NodeJS gibt es ebenfalls das Paket dotenv zum Parsen dieser Dateien. Der Installations-Befehl lautet:

npm i dotenv

Die Verwendung ist sehr einfach. Sobald das Modul installiert ist, muss es nur importiert und die Methode config aufgerufen werden. Danach sind die Werte in der Variable proccess.env vorhanden. So kannst du dann den Wert der Variable WEBMASTER_NAME auslesen.

require('dotenv').config()

console.log(process.env.WEBMASTER_NAME)

Fazit

Ich habe die .env Datei inzwischen in sämtlichen Projekten im Einsatz und finde den automatischen Workflow, gerade auch mit anderen Entwicklern, einfach gut. Alles läuft reibungslos ab und keiner veröffentlicht sensible Daten von sich auf GitHub.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel
Philipp schreibt ... Kommentar vom 20.12.2020
Wieso genau ein .env FIle?

Hey Tim :)

Ich kann leider aus deinem Artikel nicht rauslesen, wieso .env Files jetzt sicherer sind als wenn ich eine JSON Config File hätte.

Oder welche Vorteile mir das .env File bringt. Würde mich freuen, wenn mir dazu eine Antwort da lässt oder den Artikel erweiterst.

Liebe Grüße Philipp

Antworten
Philipp
Antwort von Tim Riedl Kommentar vom 21.12.2020
RE: Wieso genau ein .env FIle?

Hey Philipp,

also technisch kannst du genauso gut JSON Dateien nehmen, ich denke aber so eine .env File ist einfach angenehmer zu editieren da nicht auf Klammern und Kommas geachtet werden müsste. Das ist aber eine Sache, wo vermutlich jeder seine Vorlieben hat. Ich sehe bei größeren Projekten zumindest fast nur .env, deswegen finde ich sollte man zumindest davon gehört haben. Ich würde dir da keinen Punktabzug im Codereview geben, ich bin mit beiden Methoden zufrieden :)

~ Tim

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
}

oder

key1="value1"
key2="value2"
key3="value3"
Tim Riedl
Kommentar schreiben

Vom Autor Empfohlen
close