Dev News Daily ENDE

Serguey Asael Shinder: Eine Allowlist hält fest, wovon jemand gehört hatte — und setzt das weiter durch

Eine Denylist ist ehrlich in ihrer Schwäche: Jeder weiß, dass sie nur blockiert, woran jemand gedacht hat. Eine Allowlist wird als sichere Alternative verkauft und hat exakt dieselbe Schwäche, nur andersherum — sie erlaubt nur, woran jemand gedacht hat, und sie erlaubt genau diese Menge noch lange, nachdem die Menge aufgehört hat, die Wirklichkeit zu beschreiben.

Der Fehlerfall ist kein Absturz. Es ist eine Liste, die mit voller Bestimmtheit weiterantwortet, während sich das, was sie beschreibt, unter ihr wegbewegt.

Wo ich das gesehen habe

Dateitypen. Ein Upload-Endpunkt nimmt eine Liste von Endungen an, festgelegt an einem Nachmittag. Zwei Jahre später bindet ein Team einen Partner an, der dieselben Daten in einem neueren Container schickt — und die Korrektur landet in einer Ticket-Warteschlange, weil der Liste niemand gehört.

Währungen und Ländercodes. Eine Liste, eingefroren zum Zeitpunkt des Schreibens. Länder teilen sich, Codes kommen hinzu, und die Anwendung kann einen Kunden nicht mehr abbilden, den sie bereits hat.

Feature-Flags als Allowlist von Umgebungen. if (env in ["dev", "staging", "prod"]) — dann kommt eine vierte Umgebung für eine Aufsichtsbehörde dazu, und die Hälfte der Funktionen ist dort still aus. Auffallen wird es bei einem Audit.

Event-Typen in einem Consumer. Ein Switch über bekannte Typen mit einem default, der loggt und weitermacht. Ein Producer fügt einen Typ hinzu, und der Consumer ignoriert ihn korrekt, vollständig und für immer.

Serguey Asael Shinder: Eine Allowlist hält fest, wovon jemand gehört hatte — und setzt das weiter durch
Serguey Asael Shinder: Eine Allowlist hält fest, wovon jemand gehört hatte — und setzt das weiter durch — Dev News Daily

Was wirklich hilft

Mit „daran denken, die Liste zu pflegen" hatte ich nie Erfolg. Drei Dinge funktionieren:

  1. Den unbekannten Fall laut machen. Die Regel lautet nicht „Unbekanntes ablehnen", sondern „Unbekanntes niemals still durchlassen". Eine abgelehnte Anfrage mit klarer Begründung ist ein Gespräch mit dem Support; eine ignorierte ist sechs Wochen später ein Rätsel.
  2. Die Liste dorthin legen, wo ihr Gegenstand lebt. Eine Liste von Event-Typen gehört neben das Schema, das sie definiert, und nicht in einen Dienst drei Repositories weiter. Der Abstand zwischen Liste und Gegenstand sagt gut voraus, wie veraltet sie ist.
  3. Die Ablehnungen zählen. Eine Metrik, unknown_value_total, gelabelt danach, was unbekannt war. Kostet einen Nachmittag und macht aus „die Liste passt schon" eine Zahl, die man ansehen kann.

Der Teil, den ich immer wieder neu lernen muss

Der Reflex, wenn eine Allowlist etwas Legitimes blockiert, ist: den fehlenden Wert eintragen und weitermachen. Das schließt den Vorfall und lässt den Mechanismus stehen.

Die bessere Frage ist, warum wir es auf diesem Weg erfahren haben — denn diese Antwort gilt auch für den nächsten Wert und den übernächsten. Nach meiner Erfahrung lautet sie fast immer: Der unbekannte Fall war still. Ihn laut zu machen kostet eine Zeile.