diff --git a/css/navbar.css b/css/navbar.css
index c68e94f..9d9b208 100644
--- a/css/navbar.css
+++ b/css/navbar.css
@@ -285,6 +285,32 @@ CSS für die navbar
border-bottom: 1px solid #333d43;
}
+ .nav__logout-form {
+ display: contents;
+ margin: 0;
+ }
+
+ .nav__logout-form .nav__button {
+ width: 100%;
+ height: 100%;
+ }
+
+ .nav__mobile-logout-button {
+ color: #fff;
+ text-decoration: none;
+ font-size: 1.2rem;
+ font-weight: 600;
+ display: block;
+ width: 100%;
+ text-align: left;
+ padding: 0.5rem 1rem;
+ border: none;
+ border-bottom: 1px solid #333d43;
+ background: none;
+ cursor: pointer;
+ font-family: inherit;
+ }
+
.nav__mobile-submenu {
display: block;
list-style: none;
diff --git a/includes/alertMessages.php b/includes/alertMessages.php
index 645f532..2c42d14 100644
--- a/includes/alertMessages.php
+++ b/includes/alertMessages.php
@@ -89,6 +89,12 @@
Es ist ein Datenbankfehler aufgetreten. Bitte versuche es erneut.
+
+
+ Deine Sitzung ist abgelaufen oder die Anfrage konnte nicht überprüft werden.
+ Bitte lade die Seite neu und versuche es erneut.
+
+
+?>
\ No newline at end of file
diff --git a/includes/csrf.php b/includes/csrf.php
new file mode 100644
index 0000000..db0575e
--- /dev/null
+++ b/includes/csrf.php
@@ -0,0 +1,88 @@
+';
+}
+
+/**
+ * Prüft, ob das per POST gesendete CSRF-Token zum Session-Token passt.
+ *
+ * Der Vergleich erfolgt zeitkonstant über hash_equals(), um
+ * Timing-Angriffe auf den Vergleich selbst auszuschließen.
+ *
+ * @return bool true, wenn das Token gültig ist
+ */
+function csrf_verify(): bool
+{
+ $sentToken = $_POST["csrf_token"] ?? "";
+ $sessionToken = $_SESSION["csrf_token"] ?? "";
+
+ if (!is_string($sentToken) || $sentToken === "" || $sessionToken === "") {
+ return false;
+ }
+
+ return hash_equals($sessionToken, $sentToken);
+}
+
+/**
+ * Bricht die Anfrage ab und leitet mit einer Fehlermeldung um,
+ * wenn das mitgesendete CSRF-Token ungültig oder nicht vorhanden ist.
+ *
+ * Muss am Anfang jeder zustandsändernden POST-Aktion aufgerufen werden,
+ * bevor irgendeine Änderung an Daten vorgenommen wird.
+ *
+ * @param string $redirectTo Ziel-URL, zu der bei ungültigem Token
+ * weitergeleitet wird
+ * @return void
+ */
+function csrf_require_valid(string $redirectTo = "index.php"): void
+{
+ if (!csrf_verify()) {
+ http_response_code(403);
+ $_SESSION["message"] = "invalid_csrf_token";
+ header("Location: " . $redirectTo);
+ exit();
+ }
+}
\ No newline at end of file
diff --git a/includes/navbar.php b/includes/navbar.php
index c62204e..b16bf03 100644
--- a/includes/navbar.php
+++ b/includes/navbar.php
@@ -179,4 +179,4 @@ Globales Menü, wird via PHP später in alle Seiten eingebunden