‫Alles, was wir in diesem Abschnitt bisher getan
‫haben, war also, alle Anwendungen
‫und die Daten unserer Benutzer so gut wie möglich zu sichern.
‫Und ich habe über viele Dinge gesprochen, die
‫wir tun können, um das zu erreichen.
‫Aber all diese Informationen
‫waren über diese Vorlesungen verteilt.
‫Daher habe ich beschlossen, diese kurze Zusammenfassung
‫mit vielen bewährten Methoden zu erstellen, die wir bereits implementiert
‫haben und die wir im Rest
‫dieses Abschnitts noch implementieren werden.
‫Weil Sicherheit so extrem wichtig ist,
‫aber leider viele Kurse nicht genug darauf eingehen.
‫Jetzt drehe ich
‫diesen Node auch nicht. js-Kurs in einen Sicherheitskurs.
‫Dafür gibt es bessere Kurse und Experten.
‫Aber ich zeige Ihnen ein paar
‫Dinge, die Sie tun können, um Ihre Anwendungen und Daten richtig zu sichern.
‫Und ich werde mir ein paar gängige Angriffe
‫ansehen und einige Vorschläge machen, um sie zu verhindern.
‫Und als erstes haben wir den Fall einer kompromittierten
‫Datenbank, dh ein Angreifer hat sich Zugriff auf unsere Datenbank verschafft.
‫Dies ist natürlich ein äußerst schwerwiegendes Problem, aber
‫um noch größere Probleme zu vermeiden,
‫müssen wir Passwörter und Passwort-Reset-Token immer verschlüsseln, genau wie wir es
‫in den Videos in diesem Abschnitt getan haben.
‫Auf diese Weise kann der
‫Angreifer nicht zumindest die Passwörter unserer Benutzer stehlen und auch nicht zurücksetzen.
‫Kommen wir nun zum eigentlichen Verhindern von
‫Angriffen, sprechen wir über den Brute-Force-Angriff,
‫bei dem der Angreifer im Grunde versucht, ein Passwort
‫zu erraten, indem er Millionen und Abermillionen zufälliger Passwörter ausprobiert,
‫bis er das richtige findet.
‫Und was wir tun können, ist, die Anmeldeanforderung wirklich langsam zu machen.
‫Und das bcrypt-Paket, das
‫wir verwenden, tut genau das.
‫Eine andere Strategie besteht darin, eine Ratenbegrenzung zu implementieren,
‫die die Anzahl der Anfragen
‫begrenzt, die von einer einzelnen IP kommen.
‫Und dieses werden wir
‫in einem der nächsten Videos implementieren.
‫Außerdem ist es eine gute Strategie, für
‫jeden Benutzer eine maximale Anzahl von Anmeldeversuchen zu implementieren.
‫Zum Beispiel könnten wir es so
‫machen, dass der Benutzer nach 10 fehlgeschlagenen Versuchen
‫eine Stunde warten muss, bis er es erneut versuchen kann.
‫Nun, ich werde diese Funktionalität
‫in diesem Abschnitt nicht implementieren, aber
‫Sie können gerne selbst damit experimentieren.
‫Es ist wahrscheinlich eine wirklich coole Lernerfahrung, dies selbst
‫zu programmieren, und es ist
‫eigentlich nicht so schwer.
‫Gut.
‫Als nächstes gibt es den Cross-Site-Scripting-Angriff, bei dem
‫der Angreifer
‫versucht, Skripte in unsere Seite einzuschleusen, um seinen Schadcode auszuführen.
‫Auf Client-Seite ist dies besonders gefährlich,
‫da es dem Angreifer ermöglicht, den lokalen
‫Speicher auszulesen, weshalb
‫wir das JSON-Webtoken niemals im lokalen Speicher speichern sollten.
‫Stattdessen sollte es in einem reinen HTTP-Cookie gespeichert werden, das es dem
‫Browser ermöglicht, das Cookie nur
‫zu empfangen und zu senden, aber
‫nicht darauf zuzugreifen oder es in irgendeiner Weise zu ändern.
‫Damit ist es dann für einen
‫Angreifer unmöglich, das im Cookie gespeicherte JSON-Webtoken zu stehlen.
‫Auch hier implementieren wir dies in einer Sekunde.
‫Um XSS-Angriffe zu verhindern, sollten wir nun auf
‫der Backend-Seite Benutzereingabedaten
‫bereinigen und einige spezielle HTTP-Header
‫setzen, die diese Angriffe etwas schwieriger machen.
‫Und Express enthält diese Best Practices nicht
‫sofort, daher werden wir Middleware verwenden, um
‫all diese speziellen Header festzulegen.
‫Als nächstes haben wir Denial-of-Service-Angriffe.
‫Und vielleicht haben Sie davon gehört.
‫Dies geschieht, wenn der
‫Angreifer so viele Anfragen an einen Server sendet, dass dieser
‫zusammenbricht und die Anwendung nicht mehr verfügbar ist.
‫Auch hier ist die Implementierung
‫einer Ratenbegrenzung eine gute Lösung dafür.
‫Außerdem sollten wir die Datenmenge begrenzen, die
‫in einem Textkörper in einem Beitrag oder einer Patch-Anfrage gesendet werden kann.
‫Außerdem sollten wir es vermeiden,
‫sogenannte böse reguläre Ausdrücke in unserem Code zu verwenden.
‫Und dies sind nur reguläre
‫Ausdrücke, deren Ausführung für nicht übereinstimmende Eingaben exponentiell dauert,
‫und sie können ausgenutzt werden, um unsere gesamte Anwendung herunterzufahren.
‫Okay, als nächstes haben wir den NoSQL-Query-Injection-Angriff.
‫Und Abfrageinjektion geschieht, wenn ein Angreifer,
‫anstatt gültige Daten einzugeben, eine Abfrage einfügt, um
‫Abfrageausdrücke zu erstellen,
‫die in wahr übersetzt werden.
‫Zum Beispiel, um sich auch
‫ohne Angabe eines gültigen Benutzernamens oder Passworts anzumelden.
‫Es ist ein bisschen
‫komplex und Sie sollten es unbedingt googeln, um mehr zu erfahren.
‫Was Sie jedoch wissen müssen, ist, dass die
‫Verwendung von Mongoose tatsächlich eine
‫ziemlich gute Strategie ist, um diese Art von
‫Angriffen zu verhindern, da ein gutes Schema erzwingt, dass
‫jeder Wert eine gut definierte Datenregisterkarte hat.
‫Was die Ausführung
‫dieser Art von Angriff dann effektiv erschwert.
‫Es ist jedoch immer eine gute
‫Idee, Eingabedaten zu bereinigen, nur um sicher zu gehen.
‫Und darum kümmern wir uns etwas später.
‫In Ordnung, und
‫jetzt zum Schluss noch ein paar Best
‫Practices und Vorschläge zur
‫Verbesserung der von uns implementierten Authentifizierungs- und Autorisierungsmechanismen.
‫Das erste, was ich
‫immer und immer wieder wiederholen
‫muss, ist, dass in einer
‫Produktionsanwendung die gesamte Kommunikation zwischen Server
‫und Client über HTTPS erfolgen muss.
‫Andernfalls kann jeder in die Unterhaltung mithören
‫und unser JSON-Webtoken stehlen.
‫Als nächstes erstellen Sie immer zufällige Passwort-Token.
‫Nicht aus Daten oder ähnlichem generiert.
‫Da es sich im Grunde genommen um
‫Passwörter handelt, sollten sie auch als solche behandelt werden.
‫Geben Sie ihnen außerdem immer Ablaufdaten an, so
‫wie wir es implementiert haben.
‫Gut?
‫Und wir haben auch implementiert, dass ein bestimmter JSON-Webtoken
‫nicht mehr gültig ist, nachdem der Benutzer sein Passwort geändert hat.
‫Wir widerrufen also grundsätzlich den
‫Token, sobald der Nutzer das Passwort ändert.
‫Das macht sehr viel Sinn, aber
‫auch hier tun viele Tutorials da draußen einfach nicht.
‫Eine andere große Sache ist, niemals
‫eine Konfigurationsdatei, wie für Umgebungsvariablen, an eine Versionskontrolle
‫wie Git zu übergeben.
‫Laden Sie sie nirgendwo hoch, da
‫diese Datei
‫die sensibelsten Daten der gesamten Anwendung enthält.
‫Wenn beispielsweise jemand Zugriff
‫auf Ihr JSON-Webtoken-Geheimnis
‫erhält, ist Ihr gesamter Authentifizierungsprozess kompromittiert.
‫Okay, und jetzt nur ein kleines Detail, um bei einem
‫Fehler nicht den
‫gesamten Fehler an den Client zu senden.
‫Dinge wie der Stack-Trace können dem Angreifer also
‫wertvolle Einblicke in Ihr System geben, und
‫das wollen wir natürlich nicht.
‫Als nächstes können wir das csurf-Paket verwenden, um
‫eine Angriffsart namens Cross-Site Request Forgery zu bekämpfen, bei der es sich um
‫einen Angriff handelt, der einen Benutzer
‫dazu zwingt, unerwünschte Aktionen in einer Webanwendung auszuführen, in der
‫er gerade angemeldet ist.
‫Das werden wir in diesem Abschnitt jedoch nicht tun.
‫Aber ich wollte es hier trotzdem erwähnen.
‫Als Nächstes könnten wir verlangen, dass
‫sich der Benutzer erneut authentifiziert, bevor er eine hochwertige Aktion ausführt.
‫Zum Beispiel eine Zahlung leisten oder etwas löschen.
‫Auch dies ist nur ein Vorschlag, den
‫Sie selbst ausprobieren können.
‫Eine weitere coole Funktion, die Sie implementieren
‫können, ist eine schwarze Liste nicht vertrauenswürdiger Token.
‫Wir wissen also bereits, dass
‫es nicht wirklich eine Möglichkeit gibt, Benutzer von der
‫Anwendung abzumelden, wenn sie böswillige Aktivitäten zeigen.
‫Was wir jedoch tun können, ist eine Liste nicht vertrauenswürdiger Token zu
‫erstellen, die dann bei jeder Anfrage validiert werden.
‫Als nächstes hätten wir eine Funktion implementieren können, die
‫die E-Mail-Adresse bestätigt, nachdem ein Konto zum ersten Mal erstellt wurde.
‫Im Grunde also, indem Sie einen Link an die E-Mail
‫des Benutzers senden, wie es viele echte Apps tatsächlich tun.
‫Aber ich wollte es hier einfach halten, deshalb
‫habe ich das hier nicht gemacht.
‫Aber setzen Sie dies gerne einfach selbst um,
‫wenn Sie Lust dazu haben.
‫Ein großes Feature, das viele
‫Apps haben, ist das Konzept der Aktualisierungstoken.
‫Welche sind im Grunde, um sich an Benutzer zu erinnern.
‫Also, um sie für immer
‫eingeloggt zu halten oder bis sie sich abmelden.
‫Unsere aktuelle Implementierung sieht
‫vor, dass sich der Benutzer nach Ablauf
‫des JSON-Webtokens grundsätzlich erneut anmelden muss.
‫Mit Aktualisierungstoken ist dies jedoch nicht mehr erforderlich.
‫Und es ist ein bisschen komplex zu implementieren und daher ist
‫es ein Feature für ein anderes Mal.
‫Als letztes hätten
‫wir schließlich die Zwei-Faktor-Authentifizierung implementieren können, mit der
‫Sie sicher vertraut sind.
‫Grundsätzlich muss der Benutzer bei der
‫Zwei-Faktor-Authentifizierung nach der Anmeldung bei der
‫Anwendung eine
‫zweite Aktion ausführen, um wirklich authentifiziert zu werden.
‫Und normalerweise ist das das Einfügen eines
‫Codes, der per SMS an ein Mobiltelefon gesendet wird.
‫Dies sind also viele Funktionen, die
‫unsere Authentifizierung haben könnte.
‫Und wenn Sie möchten, dass ich eine davon implementiere,
‫teilen Sie mir dies bitte im Abschnitt Fragen und Antworten mit.
‫Und wenn einer von ihnen stark nachgefragt wird, dann
‫zeige ich Ihnen, wie es funktioniert.
‫Okay, aber noch einmal, ich wollte diesen Node
‫nicht umdrehen. js-Kurs
‫in einen kompletten Sicherheits- und Authentifizierungskurs.
‫Und zum Schluss noch etwas, das wir im Rest
‫des Abschnitts implementieren werden,
‫um die Parameterverschmutzung zu verhindern.
‫Versuchen Sie beispielsweise, einfach zwei Feldparameter in die Abfragezeichenfolge
‫einzufügen, die nach allen Touren sucht.
‫Und wenn Sie das tun, werden Sie feststellen,
‫dass es zu einem
‫Fehler kommt, weil unsere Anwendung darauf nicht vorbereitet ist.
‫Und so versuchen Angreifer, diese Art von Schwächen auszunutzen, um Anwendungen
‫zum Absturz zu bringen, was natürlich nicht gut ist.
‫Und das müssen wir also beheben.
‫Okay, das war also viel länger als ich erwartet hatte.
‫Und es gibt ganze Kurse zum Thema Sicherheit, wenn
‫Sie sich wirklich für Sicherheit interessieren.
‫In Ordnung, aber ich belasse es dabei,
‫und so gehen wir jetzt direkt zum nächsten über.