Ein geleakter API-Schlüssel kostet Geld
Ein API-Schlüssel ist eine geheime Zeichenfolge, die beweist, dass eine Anfrage von Ihnen kommt. Ein Modellanbieter belastet oft Ihr Konto für jeden Aufruf, der ihn trägt.
Entwickelnde lassen Schlüssel durchsickern, indem sie sie in den Code tippen und diesen zu Git hochladen. Automatische Suchprogramme suchen genau das: Ein geleakter Schlüssel ist eine Rechnung und ein Risiko.
Am Ende dieser Lektion
Notiz
Ich kann einen Schlüssel aus meinem Code und meinem Git-Verlauf heraushalten.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| API-Schlüssel | eine geheime Zeichenfolge, die beweist, dass eine Anfrage Ihre ist | |
| Umgebungsvariable | ein benannter Wert, den ein Programm von außerhalb seines Codes erhält | MEIN_API_SCHLUESSEL |
| Die Datei .env | eine Textdatei mit Zeilen NAME=Wert für Ihren Rechner | |
| Die Datei .gitignore | eine Liste von Dateien, die Git nie verfolgen soll | |
| Erneuern | einen neuen Schlüssel erzeugen und den alten sperren |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
In diesem Labor enthält Ihr Code keinen Schlüssel
Ihr Skript sendet den Header authorization: Bearer lab. Das Wort lab ist ein Platzhalter, kein Schlüssel. Beim Hinausgehen tauscht die Plattform es gegen Ihr echtes Token aus und wählt das Modell.
Der Schlüssel steht also nie in Ihrem Code, und Sie sehen ihn nie. In einem echten Projekt halten Sie den Schlüssel selbst.
Ein Modell ohne Schlüssel aufrufen
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';(async()=>{const kopf={'content-type':'application/json',authorization:'Bearer lab'};console.log('Autorisierungs-Header in meinem Code: '+kopf.authorization);try{const r=await fetch(u,{method:'POST',headers:kopf,body:JSON.stringify({model:'lab',messages:[{role:'user',content:'Warum muss ein API-Schlüssel aus dem Code bleiben? Antworten Sie in einem Satz.'}],max_tokens:60})});const j=await r.json();if(r.ok===false)throw new Error(r.status+' '+j.error.message);console.log('Modell: '+j.choices[0].message.content)}catch(e){console.log('Keine Antwort ('+e.message+'). Aufgezeichnetes Beispiel:');console.log('Modell: Wer den Code lesen kann, kann den Schlüssel nutzen und Ihr Geld ausgeben.')}})()"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein echter Schlüssel lebt in der Umgebung
Ein echter Anbieter gibt Ihnen einen langen Schlüssel. Tippen Sie ihn nie in eine Datei, die Git verfolgt. Legen Sie ihn in eine Umgebungsvariable und lesen Sie ihn im Code mit process.env.MEIN_API_SCHLUESSEL.
Auf Ihrem Rechner halten Sie die Variablen in einer .env-Datei und tragen diese in .gitignore ein, damit Git sie nie sieht.
Eine Demo-.env und .gitignore schreiben
docker exec -w /home/node/project agent sh -c "mkdir -p demo-schluessel && printf 'BEISPIEL_API_SCHLUESSEL=kein-echter-schluessel-123\n' > demo-schluessel/.env && printf '.env\n' > demo-schluessel/.gitignore"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die .env lesen und den Wert verbergen
docker exec -w /home/node/project agent node -e "const fs=require('fs');const nl=String.fromCharCode(10);for(const zeile of fs.readFileSync('demo-schluessel/.env','utf8').trim().split(nl)){const i=zeile.indexOf('=');const w=zeile.slice(i+1);console.log(zeile.slice(0,i)+' ist gesetzt, '+w.length+' Zeichen, Wert verborgen')}console.log('.env steht in .gitignore: '+(fs.readFileSync('demo-schluessel/.gitignore','utf8').split(nl).includes('.env')?'ja':'nein'))"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dieselbe Idee in einem echten Betrieb
Ihr Hosting-Dienst hat einen Ort für Geheimnisse und reicht sie als Umgebungsvariablen an Ihr Programm weiter. Der Code bleibt auf Ihrem Laptop und auf dem Server derselbe.
Legen Sie eine Datei .env.example mit den Namen und erfundenen Werten ab. Sie sagt einer neuen Kollegin, was einzustellen ist.
Beispiel: was nach einem Leck zu tun ist
| Was passiert ist | Was zu tun ist |
|---|---|
| Der Schlüssel steht im Code, nicht committet | In eine Umgebungsvariable verschieben |
| Er ist committet, nicht hochgeladen | Den Schlüssel erneuern, dann den Commit umschreiben |
| Er ist in einem öffentlichen Repository | Den Schlüssel sofort erneuern, dann den Verlauf bereinigen |
| Er wurde in einen Chat oder Prompt eingefügt | Den Schlüssel erneuern |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, ein neuer Commit, der den Schlüssel löscht, entferne ihn. Git behält alle alten Commits, der Schlüssel bleibt also im Verlauf für jeden, der ihn kopiert hat. Erneuern Sie den Schlüssel, denn nur ein neuer macht den alten nutzlos.