Das Wichtigste
- Die Daten jedes Restaurants werden in der Datenbank selbst getrennt, nicht nur in der App.
- Passwörter werden mit scrypt gehasht; wiederholte Fehlversuche sperren das Konto für 15 Minuten.
- Sitzungen werden bei jeder Aktualisierung erneuert, und eine wiederverwendete Sitzung beendet die gesamte Anmeldekette.
- Aufzeichnungen zu Bestellungen, Bargeld, Punkten und Prüfvorgängen können nur ergänzt werden.
Jedes Restaurant in seinem eigenen Bereich
Alle Restaurants laufen auf einer Plattform, doch die Datenbank erzwingt die Trennung. Für jede Restauranttabelle ist Row-Level-Security aktiviert und erzwungen, und jede Anfrage läuft in einer Transaktion, die auf genau ein Restaurant festgelegt ist. Das Konto, das die Anwendung verwendet, kann diese Regeln nicht umgehen.
Zwei interne Rollen dürfen diese Regeln für eng begrenzte Aufgaben überschreiten: die Hintergrundprozesse, die lediglich auflisten dürfen, welche Restaurants aktiv sind, bevor sie ihre Arbeit Restaurant für Restaurant erledigen, und das Kontrollzentrum des SCALE-Teams, das keinen Zugriff auf Kundenadressen, Bestellstandorte, Passwort-Hashes oder die eigenen Prüfprotokolle der Restaurants hat.
Anmeldung und Passwörter
- Passwörter sind 8 bis 128 Zeichen lang und werden als scrypt-Hashes mit zufälligem Salt gespeichert; der Vergleich erfolgt in konstanter Zeit.
- Fünf falsche Passwörter sperren das Konto für 15 Minuten. Die Anmeldung bei einem Konto, das nicht existiert, dauert genauso lange, sodass nicht erkennbar ist, welche Konten existieren.
- Anmeldeversuche sind zusätzlich pro Adresse über 15 Minuten begrenzt: 10 für Mitarbeiter, 60 für Kunden, 5 Neuregistrierungen von Kunden. Die Zähler werden von allen Servern gemeinsam genutzt.
- Bestätigungscodes haben 6 Ziffern, laufen nach 10 Minuten ab und erlauben nur eine begrenzte Anzahl von Versuchen.
- Der Bot-Schutz von Cloudflare kann für die Anmeldung und das Aufgeben von Bestellungen aktiviert werden.
Sitzungen, die sich nicht wiederverwenden lassen
Eine Anmeldung erzeugt ein kurzlebiges Zugriffstoken (standardmäßig 15 Minuten) und ein Aktualisierungstoken. Bei jeder Aktualisierung wird das Aktualisierungstoken durch ein neues ersetzt. Wird ein altes Token jemals erneut verwendet, wird die gesamte Sitzungskette beendet – so lässt sich ein gestohlenes Token nicht lange nutzen.
Bei jeder Anfrage wird außerdem geprüft, ob die Sitzung noch aktiv ist. Wird ein Mitarbeiter entfernt, sein Passwort geändert oder seine Rolle eingeschränkt, wird er daher sofort überall abgemeldet. Konsolen-Cookies können von Skripten auf der Seite nicht gelesen werden und werden von anderen Websites nicht mitgesendet.
Rollen nach dem Minimalprinzip
Der Zugriff setzt sich aus 29 Berechtigungen zusammen – vom Lesen von Bestellungen bis zum Bestätigen von Barzahlungen oder Verwalten von Mitarbeitern. Der Inhaber kann Rollen mit beliebigen Kombinationen davon anlegen, und Mitarbeiter lassen sich auf eine Filiale beschränken. Niemand kann eine Berechtigung vergeben, die er nicht selbst besitzt, integrierte Rollen können nicht bearbeitet werden, und der letzte aktive Inhaber kann nicht entfernt werden.
Die Konsole blendet aus, was eine Rolle nicht nutzen kann – das dient aber nur der Übersicht: Der Server prüft bei jeder Aktion Berechtigung, Filiale und Mitgliedschaft.
Aufzeichnungen, die sich nicht umschreiben lassen
Statusänderungen von Bestellungen, das Punktekonto, Lagerbewegungen, die Preishistorie und das Prüfprotokoll können nur ergänzt werden. Die Datenbank lehnt jede Änderung oder Löschung ab; Korrekturen erfolgen daher durch einen neuen, sichtbaren Eintrag.
Respekt vor den Daten der Kunden
- Standorte zu Bestellungen werden nur erfasst, während die App geöffnet ist, nur mit Einwilligung, und nach 180 Tagen gelöscht.
- Kunden können ihr Konto über die Website oder App löschen. Ihre Adressen, Standorte, Geräte, Benachrichtigungen und ihr Passwort werden entfernt, und ihr Profil wird anonymisiert.
- Damit dieselbe Person Neukundenangebote nicht erneut in Anspruch nehmen kann, werden nur geschützte Fingerabdrücke ihrer Telefonnummer und E-Mail-Adresse aufbewahrt.