Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Positivliste für Befehle und Pfade

Nach dieser Lektion: Ich kann genau festlegen, welche Befehle und Pfade ein Agent benutzen darf.

Lektion, 60 Min.6 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Nur, was auf der Liste steht

Eine Positivliste nennt genau die Befehle und Pfade, die ein Agent benutzen darf. Alles, was nicht auf der Liste steht, wird abgelehnt.

Das ist wichtig, weil ein Agent, der Befehle ausführen kann, auch den falschen ausführen kann. Eine Liste des Erlaubten ist kurz und prüfbar. Eine Liste des Verbotenen wird nie fertig.

Am Ende dieser Lektion

Notiz

Ich kann genau festlegen, welche Befehle und Pfade ein Agent benutzen darf.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Positivlisteeine Liste dessen, was erlaubt ist, und sonst nichts
Richtliniedie schriftlichen Regeln für einen Agenten
Argumentein Wort, das einem Befehl mitgegeben wirdquellen/app.js
Optionein Argument, das mit einem Bindestrich beginnt-l
Ablehnungeine Antwort, die Nein sagt und den Grund nennt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Richtlinie sagt, was erlaubt ist

Die Richtlinie nennt für jeden Befehl die Pfade und Optionen, die er benutzen darf. Eine Anfrage besteht aus einem Befehl und einigen Argumenten.

Prüfen Sie der Reihe nach. Steht der Befehl auf der Liste? Steht jede Option auf ihrer Liste? Beginnt jeder Pfad mit einem erlaubten Ordner? Der erste Fehler ist die Antwort.

Durchgerechnetes Beispiel: fünf Anfragen

AnfrageAntwortGrund
ls -l quellen/ErlaubtBefehl, Option und Pfad stehen auf der Liste
rm -rf quellen/Abgelehntrm steht nicht auf der Liste
cat /etc/passwdAbgelehntDer Pfad beginnt mit keinem der Ordner
grep -r quellen/app.jsAbgelehntDie Option -r ist für grep nicht erlaubt
cat quellen/notizen.txtErlaubtDer Pfad beginnt mit quellen/

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein häufiger Fehler

Warnung

Viele denken, ein Pfad, der mit quellen/ beginnt, sei sicher. Das stimmt nicht. Der Pfad quellen/../.env beginnt mit quellen/ und zeigt doch nach draußen. Ein Anfangstest prüft nur, womit ein Pfad beginnt, und ist darum nur ein erster Schritt. Lektion 2 prüft, wohin ein Pfad wirklich führt.

Eine Ablehnung nennt den Grund

Eine Ablehnung, die nur Nein sagt, lässt den Agenten raten. Vielleicht versucht er es dann mit einer noch schlechteren Idee.

Sagen Sie, welcher Teil gescheitert ist: der Befehl, die Option oder der Pfad. Der Agent kann dann einen erlaubten Befehl versuchen, und wer das Protokoll liest, sieht, was schiefging.

Die Modellhilfe schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' '  return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > model.js"

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 Modellhilfe schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' '  try {' '    const res = await fetch(basis + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"Status \" + res.status);' '    const d = await res.json();' '    return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' '  } catch (fehler) {' '    console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' '    return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' '  }' '}' 'module.exports = { fragen };' >> model.js"

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 Positivliste schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const richtlinie = {' '  ls: { pfade: [\"quellen/\", \"doku/\"], optionen: [\"-l\"] },' '  cat: { pfade: [\"quellen/\", \"doku/\"], optionen: [] },' '  grep: { pfade: [\"quellen/\"], optionen: [\"-n\", \"-i\"] },' '};' > liste.js"

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 Positivliste schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function entscheiden(anfrage) {' '  const regel = richtlinie[anfrage.befehl];' '  if (regel === undefined) return \"abgelehnt: Befehl nicht auf der Liste\";' '  for (const a of anfrage.args) {' '    if (a.startsWith(\"-\")) {' '      if (regel.optionen.indexOf(a) < 0) return \"abgelehnt: Option \" + a + \" nicht erlaubt\";' '    } else if (regel.pfade.some(function (p) { return a.startsWith(p); }) === false) {' '      return \"abgelehnt: Pfad \" + a + \" nicht erlaubt\";' '    }' '  }' '  return \"erlaubt\";' '}' >> liste.js"

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 Positivliste schreiben, Teil 3

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const anfragen = [' '  { befehl: \"ls\", args: [\"-l\", \"quellen/\"] },' '  { befehl: \"rm\", args: [\"-rf\", \"quellen/\"] },' '  { befehl: \"cat\", args: [\"/etc/passwd\"] },' '  { befehl: \"grep\", args: [\"-r\", \"quellen/app.js\"] },' '  { befehl: \"cat\", args: [\"quellen/../.env\"] },' '];' 'async function main() {' '  anfragen.forEach(function (a) { console.log(a.befehl + \" \" + a.args.join(\" \") + \" -> \" + entscheiden(a)); });' '  const q = \"Schreiben Sie in einem kurzen Satz, warum eine Liste erlaubter Befehle sicherer ist als eine Liste verbotener.\";' '  const probe = \"Man kann nicht jeden schlechten Befehl vorhersehen, aber die wenigen guten lassen sich aufzählen.\";' '  const antwort = await fragen([{ role: \"user\", content: q }], probe, 60);' '  console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> liste.js"

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 Positivliste ausführen

Befehl
docker exec -w /home/node/project agent node liste.js

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Was der Run ausgibt

ZeileWas sie zeigt
ls -l quellen/ -> erlaubtBefehl, Option und Pfad stehen auf der Liste
rm -rf quellen/ -> abgelehnt: Befehl nicht auf der ListeDie erste Prüfung scheiterte
cat /etc/passwd -> abgelehnt: Pfad ...Der Pfad liegt außerhalb der Ordner
grep -r quellen/app.js -> abgelehnt: Option -r ...Die Option steht nicht auf der Liste
cat quellen/../.env -> erlaubtDie Lücke: ein Anfangstest lässt sich täuschen
Das Modell sagte: ...Ein Satz. Die Worte ändern sich bei jedem Lauf oder zeigen Aufgezeichnete Probe

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.