tag:forum.selfhtml.org,2005:/self Remember-Me-Funktion einrichten (CSRF-Token erstellen) – SELFHTML-Forum 2022-11-24T22:37:10Z https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803837#m1803837 borisbaer http://54598532.swh.strato-hosting.eu/ 2022-11-17T13:20:33Z 2022-11-17T13:49:07Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo!</p> <p>Ich versuche gerade, das Konzept der Remember-Me-Funktion nachzuvollziehen.</p> <p>Im Moment ist es so, dass ich beim Login einfach nur die Session-Variable für die UserID speichere:</p> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">signIn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span> <span class="token function">session_regenerate_id</span><span class="token punctuation">(</span> <span class="token constant boolean">true</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword static-context">parent</span><span class="token operator">::</span><span class="token function">read</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'username'</span> <span class="token operator">=></span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token property">username</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'obj'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$user</span> <span class="token operator">-></span> <span class="token property">id</span><span class="token punctuation">;</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$user</span> <span class="token operator">-></span> <span class="token property">username</span><span class="token punctuation">;</span> <span class="token function">header</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Location:'</span> <span class="token operator">.</span> <span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'HTTP_REFERER'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">,</span> <span class="token number">303</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn ich den Browser schließe, dann bleiben beide Variablen erhalten. Wie ich gelesen habe, ist in der PHP-Config eingestellt, wie lange die Session-Variablen bzw. Cookies „überleben“.</p> <p>Gerne würde ich es so programmieren, dass im Normalfall die Cookies nach dem Schließen des Browsers gelöscht werden, es sei denn man aktiviert das Häkchen bei „eingeloggt bleiben“.</p> <p><strong>EDIT:</strong> Okay, eine Frage konnte ich mir mittlerweile selbst beantworten. Das Normalverhalten ist das Löschen der SESSID, doch dies wird verhindert, wenn man beim Browser einstellt, die Tabs der letzten Sitzung beim Start wiederherzustellen. Deswegen wurde nichts bei mir gelöscht.</p> <p>Nun habe ich aber auch gehört, dass es so einfach nicht ist mit dieser Angelegenheit, weil es <strong>Cross-Site Request Forgery</strong> gibt. Wenn ich bei meinem Firefox-Browser unter Web-Speicher den Reiter <em>Cookies</em> öffne, dann sehe je einen Eintrag für phpMyAdmin, PHPSESSID und pma_lang. Daneben befindet sich ein Wert. Ist das die Gefahrenquelle? Ich muss sagen, ich verstehe das ganze Konzept von CSRF nicht, nur dass man da vorbeugen sollte. Wo wird der CSRF-Token übergeben? Bei Datenbank-Interaktionen? Mir stellen sich da zig Fragen.</p> <p>Zudem wollte ich noch fragen, ob ein <code>session_unset()</code> beim Sign-off reicht oder ein <code>session_destroy()</code> her sollte.</p> <p>Grüße<br> Boris</p> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803838#m1803838 Robert B. 2022-11-17T13:50:28Z 2022-11-17T13:50:28Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo Boris,</p> <p>ich habe deinen Code als PHP ausgezeichnet – <a href="https://wiki.selfhtml.org/wiki/Hilfe:Forum/Bedienung#Code" rel="nofollow noopener noreferrer">das kannst du</a> in Zukunft auch selbst tun </p> <p>Viele Grüße<br> Robert</p> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803842#m1803842 Rolf B 2022-11-17T15:27:02Z 2022-11-17T15:31:04Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo borisbaer,</p> <p>der PHP Sessioncookie sollte immer temporär sein.</p> <p>Ein RememberMe-Token ist dagegen ein persistenter Cookie, heißt: Unter der "Remember Me" Checkbox muss ein DSGVO-Hinweis stehen („Wenn Sie diesen Schalter aktivieren, gestatten Sie, dass auf Ihrem Computer ein Cookie gespeichert wird“ - oder so). Inhalt des RememberMe-Tokens ist beispielsweise ein langer Zufallswert, den Du auch in der User-DB speicherst. Kommt ein Webrequest herein, für den die Session leer ist, aber für den ein RememberMe Cookie vorliegt, kannst Du den zugehörigen User automatisch anmelden.</p> <p>Problem 1: Was machst Du, wenn sich ein User auf Gerät 1 mit "Remember Me" anmeldet und dann von Gerät 2 kommt. Er meldet sich dort auch an und aktiviert "Remember Me". Speicherst Du nun auf beiden Geräten das gleiche Token?</p> <p>Wenn ja, wird sich dieses Token im Lauf der Zeit auf diverse Geräte verbreiten. Ist das sicher? Hm. Weiß nicht. Aber vermutlich unvermeidbar, denn:</p> <p>Wenn nein, überschreibst Du das Token in der DB durch ein anderes und machst damit den "Remember Me" vom ersten Gerät kaputt.</p> <p>Problem 2: Wenn es irgendwie gelingt, das Token zu "klauen" (keine Ahnung welche boshaften Leaks es dafür gibt) und auf ein anderes Gerät zu implantieren, ist damit auch der Login geklaut. Eigentlich sollen die Browser ja dafür mittlerweile die nötigen Schutzschirme aufrichten, und bei https-Transport und einer HttpOnly Kennung am Cookie sollte das auch vor JavaScript und Drahthaien versteckt sein, aber HTTPS lässt sich aufbrechen, wenn Du auf einem Fremd-PC unterwegs bist, dem man geeignete Zertifikate untergeschoben hat (wie z.B. der, auf dem ich meine Brötchen verdiene. Mein Arbeitgeber bricht https auf und signiert den Traffic mit dem eigenen Zertifikat neu. Der PC ist in der Firmen-Domäne, bekommt das Zertifikat per Policy aufgezwungen und schon ist https für den Eimer).</p> <p>Eine Alternative zu einem Remember-Me Zufallstoken, das im Userprofil gespeichert ist, ist ein <a href="https://de.wikipedia.org/wiki/JSON_Web_Token" rel="nofollow noopener noreferrer">JWT (JSON Web Token)</a>. Das ist ein vorgeschlagener Internetstandard für die Vermittlung einer Authentication durch Identitätsprovider. Ein JWT ist letztlich ein JSON-Objekt mit geeigneten Inhalten, dass Du zum String machst, base64-codierst, mit einem Server-Key signierst und beispielsweise als Cookie übermittelst. Im JWT kannst Du z.B. den Usernamen ablegen. Wenn Du magst, kannst Du den JSON-String auch noch aufwändig verschlüsseln, bevor Du ihn signierst.</p> <p>Kommt ein Request ohne Login, aber mit korrekt signiertem JWT herein, akzeptierst Du das als gültigen Login. In regelmäßigen Abständen musst Du den Key erneuern, und JWTs, die mit der vorigen Keyversion hereinkommen, signierst Du neu. Wieviele vorherige Keyversionen du akzeptierst, musst Du von der gewünschten Lebensdauer des JWT-Cookie abhängig machen. Aber es gilt das gleiche wie beim Zufallstoken: Wird das JWT geklaut, hast Du ein Security-Loch.</p> <p>Was für mich bedeutet: RememberMe sollte für Anwendungen, bei denen gebrochene Security ein Problem darstellt, NICHT verwendet werden.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803844#m1803844 borisbaer http://54598532.swh.strato-hosting.eu/ 2022-11-17T18:25:43Z 2022-11-17T18:25:43Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo Rolf,</p> <blockquote> <p>Ein RememberMe-Token ist dagegen ein persistenter Cookie, heißt: Unter der "Remember Me" Checkbox muss ein DSGVO-Hinweis stehen („Wenn Sie diesen Schalter aktivieren, gestatten Sie, dass auf Ihrem Computer ein Cookie gespeichert wird“ - oder so).</p> </blockquote> <p>das kennt man ja. </p> <blockquote> <p>Inhalt des RememberMe-Tokens ist beispielsweise ein langer Zufallswert, den Du auch in der User-DB speicherst. Kommt ein Webrequest herein, für den die Session leer ist, aber für den ein RememberMe Cookie vorliegt, kannst Du den zugehörigen User automatisch anmelden.</p> <p>Problem 1: Was machst Du, wenn sich ein User auf Gerät 1 mit "Remember Me" anmeldet und dann von Gerät 2 kommt. Er meldet sich dort auch an und aktiviert "Remember Me". Speicherst Du nun auf beiden Geräten das gleiche Token?</p> <p>Wenn ja, wird sich dieses Token im Lauf der Zeit auf diverse Geräte verbreiten. Ist das sicher? Hm. Weiß nicht. Aber vermutlich unvermeidbar, denn:</p> <p>Wenn nein, überschreibst Du das Token in der DB durch ein anderes und machst damit den "Remember Me" vom ersten Gerät kaputt.</p> </blockquote> <p>Ja, das stimmt. Daran hatte ich gar nicht gedacht.</p> <blockquote> <p>Problem 2: Wenn es irgendwie gelingt, das Token zu "klauen" (keine Ahnung welche boshaften Leaks es dafür gibt) und auf ein anderes Gerät zu implantieren, ist damit auch der Login geklaut. Eigentlich sollen die Browser ja dafür mittlerweile die nötigen Schutzschirme aufrichten, und bei https-Transport und einer HttpOnly Kennung am Cookie sollte das auch vor JavaScript und Drahthaien versteckt sein, aber HTTPS lässt sich aufbrechen, wenn Du auf einem Fremd-PC unterwegs bist, dem man geeignete Zertifikate untergeschoben hat (wie z.B. der, auf dem ich meine Brötchen verdiene. Mein Arbeitgeber bricht https auf und signiert den Traffic mit dem eigenen Zertifikat neu. Der PC ist in der Firmen-Domäne, bekommt das Zertifikat per Policy aufgezwungen und schon ist https für den Eimer).</p> </blockquote> <p>Also sollte man immer secure und httponly aktivieren?</p> <blockquote> <p>Eine Alternative zu einem Remember-Me Zufallstoken, das im Userprofil gespeichert ist, ist ein <a href="https://de.wikipedia.org/wiki/JSON_Web_Token" rel="nofollow noopener noreferrer">JWT (JSON Web Token)</a>. Das ist ein vorgeschlagener Internetstandard für die Vermittlung einer Authentication durch Identitätsprovider. Ein JWT ist letztlich ein JSON-Objekt mit geeigneten Inhalten, dass Du zum String machst, base64-codierst, mit einem Server-Key signierst und beispielsweise als Cookie übermittelst. Im JWT kannst Du z.B. den Usernamen ablegen. Wenn Du magst, kannst Du den JSON-String auch noch aufwändig verschlüsseln, bevor Du ihn signierst.</p> </blockquote> <p>Was ein JWT habe ich zwar verstanden, aber keine Ahnung, wie man ihn im PHP-Code verwendet. Kennst du da eine erste Anlaufstelle?</p> <blockquote> <p>Kommt ein Request ohne Login, aber mit korrekt signiertem JWT herein, akzeptierst Du das als gültigen Login. In regelmäßigen Abständen musst Du den Key erneuern, und JWTs, die mit der vorigen Keyversion hereinkommen, signierst Du neu. Wieviele vorherige Keyversionen du akzeptierst, musst Du von der gewünschten Lebensdauer des JWT-Cookie abhängig machen. Aber es gilt das gleiche wie beim Zufallstoken: Wird das JWT geklaut, hast Du ein Security-Loch.</p> <p>Was für mich bedeutet: RememberMe sollte für Anwendungen, bei denen gebrochene Security ein Problem darstellt, NICHT verwendet werden.</p> </blockquote> <p>Das trifft bei mir nicht zu.</p> <p>Vielen Dank für deine Hilfe!</p> <p>Grüße<br> Boris</p> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803845#m1803845 Rolf B 2022-11-17T19:49:58Z 2022-11-17T19:49:58Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo borisbaer,</p> <blockquote> <p>Kennst du da eine erste Anlaufstelle?</p> </blockquote> <p>Naja, den Wikipedia-Artikel. Es gibt natürlich auch Libs, die das für Dich tun wollen (kannst Du selbst googlen), aber letztlich steckt nicht viel dahinter.</p> <p>Du musst Dich auch nicht zwingend an JWT halten. Der Username, signiert mit einem SHA256 Key und base64-codiert, kann auch schon reichen.</p> <p>Aber JWT wäre schick - wer Dich hacken will, kriegt einen Wow-Effekt und traut Dir gleich Fort-Knox Security zu .</p> <p>Ich musste jetzt auch mal kurz lesen. Ein JWT ist entweder ein JWS (ein signiertes Token) oder ein JWE (ein verschlüsseltes Token). Für beide gibt's einen Internet-Standard (RfC): <a href="https://www.rfc-editor.org/rfc/rfc7515.html" rel="nofollow noopener noreferrer">RFC7515</a> für JWS und <a href="https://www.rfc-editor.org/rfc/rfc7516.html" rel="nofollow noopener noreferrer">RFC7516</a> für JWE. Wenn Du signieren UND verschlüsseln willst, sollst Du erst signieren und das Ergebnis in ein JWE-Token verpacken. Sagt <a href="https://www.rfc-editor.org/rfc/rfc7519.html" rel="nofollow noopener noreferrer">RFC7519</a>. Aber ich glaube, Dir reicht das Signieren </p> <p>JWS geht so: du baust zwei assoziative Arrays auf. Das eine, der Header, ist immer gleich, das andere, den Inhalt kannst Du frei gestalten, solange Du das JWS keinem übermitteln musst, der eine Norm einfordert. Aber Du kannst Dich ja an RFC7515 orientieren und iss (Issuer), sub (Subject), iat (Ausstellzeitpunkt) und exp (Expiration) belegen.</p> <pre><code class="block language-php"><span class="token variable">$header</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"typ"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"JWT"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"alg"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"HS256"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$payload</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"iss"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"https://example.org"</span><span class="token punctuation">,</span> <span class="token comment">// Deine URL</span> <span class="token string double-quoted-string">"sub"</span> <span class="token operator">=></span> <span class="token string double-quoted-string">"borisbaer"</span><span class="token punctuation">,</span> <span class="token comment">// User-ID für Autologon</span> <span class="token string double-quoted-string">"iat"</span> <span class="token operator">=></span> <span class="token number">123456789</span><span class="token punctuation">,</span> <span class="token comment">// Unix-Timestamp der Ausstellung</span> <span class="token string double-quoted-string">"exp"</span> <span class="token operator">=></span> <span class="token number">234567890</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Unix-Timestamp für Ablauf</span> </code></pre> <p>Die beiden Unix-Timestamps musst Du natürlich mit PHP korrekt ermitteln.</p> <p>Die beiden Arrays musst Du jetzt - einzeln - als JSON-String formatieren, base64-codieren und danach nochmal URL-codieren (wegen des potenziellen = am Ende eines base64-Strings). Das Ganze hängst Du durch einen Punkt getrennt zusammen:</p> <pre><code class="block language-php"><span class="token variable">$code</span> <span class="token operator">=</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$header</span><span class="token punctuation">,</span> <span class="token constant">JSON_FORCE_OBJECT</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"."</span> <span class="token operator">.</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$payload</span><span class="token punctuation">,</span> <span class="token constant">JSON_FORCE_OBJECT</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Diesen Code musst Du jetzt signieren. Dazu verwendest Du, weil "HS256" als Algorithmus angegeben ist, die <a href="https://www.php.net/manual/de/function.hash-hmac.php" rel="nofollow noopener noreferrer">hash_hmac</a>-Funktion im PHP Deines Vertrauens und sagst ihr, sie soll "sha256" verwenden. Die zulässigen JSW-Algorithmen definiert übrigens <a href="https://www.rfc-editor.org/rfc/rfc7518.html#section-3.1" rel="nofollow noopener noreferrer">RFC7518</a> und ich habe keine Ahnung, ob PHP die alle kennt. HMAC geht jedenfalls, und wenn Du mehr Bits nehmen willst, verwende den entsprechenden Code und den entsprechenden Parameter für hash_hmac.</p> <p>Die Signatur codierst Du ebenfalls mit base64 und url_encode und hängst sie mit einem weiteren Punkt hintendran.</p> <pre><code class="block language-php"><span class="token variable">$signature</span> <span class="token operator">=</span> <span class="token function">hash_hmac</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"sha256"</span><span class="token punctuation">,</span> <span class="token variable">$code</span><span class="token punctuation">,</span> <span class="token variable">$aktueller_schluessel</span><span class="token punctuation">,</span> <span class="token comment">// den musst Du irgendwo sicher ablegen</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$code</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"."</span> <span class="token operator">.</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token variable">$signature</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Fertig. Das Ding steckst Du in einen Cookie. Der muss secure und HttpOnly sein, und deine Seite natürlich über https laufen.</p> <p>Wenn Du das JWS nutzen willst, liest Du den Cookie-Inhalt aus und trennst alles in $header, $payload und $signature auf. Im Header schaust Du nach dem Signaturalgorithmus, dann signierst Du $header.".".$payload nochmal neu und vergleichst das mit der mitgelieferten Signatur. Wenn's passt, ist es dein Token und Du kannst die User-ID aus dem Inhaltsteil holen.</p> <pre><code class="block language-php"><span class="token variable">$tokenParts</span> <span class="token operator">=</span> <span class="token function">explode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"."</span><span class="token punctuation">,</span> <span class="token variable">$jwsToken</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token variable">$tokenParts</span> <span class="token operator">!=</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// ungültiges Token</span> <span class="token punctuation">}</span> <span class="token variable">$header</span> <span class="token operator">=</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">urldecode</span><span class="token punctuation">(</span><span class="token variable">$tokenParts</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ggf Header prüfen: Ists ein Array, ist typ=="JWT" und "alg"=="HS256"</span> <span class="token variable">$payload</span> <span class="token operator">=</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">urldecode</span><span class="token punctuation">(</span><span class="token variable">$tokenParts</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ist's ein Array, stimmt iss, ist exp noch nicht erreicht</span> <span class="token comment">// Jetzt den Schlüssel passend zum iat Zeitpunkt heraussuchen! Wenn Du exp ein</span> <span class="token comment">// Jahr nach iat setzt und bspw. 4x im Jahr den Schlüssel wechselt, brauchst Du</span> <span class="token comment">// eine Historie von 5 Schlüsseln. </span> <span class="token variable">$tokensignature</span> <span class="token operator">=</span> <span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token function">urldecode</span><span class="token punctuation">(</span><span class="token variable">$tokenParts</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$realsignature</span> <span class="token operator">=</span> <span class="token function">hash_hmac</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"sha256"</span><span class="token punctuation">,</span> <span class="token variable">$tokenParts</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string double-quoted-string">"."</span><span class="token operator">.</span><span class="token variable">$tokenParts</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$genutzter_schluessel</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">hash_equals</span><span class="token punctuation">(</span><span class="token variable">$tokensignature</span><span class="token punctuation">,</span> <span class="token variable">$realsignature</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// falsche Signatur</span> <span class="token punctuation">}</span> <span class="token comment">// Wenn der Schlüssel ein älterer, aber noch gültiger Schlüssel war, das</span> <span class="token comment">// Token neu signieren, damit es künftig mit dem aktuellen Schlüssel kommt</span> <span class="token comment">// Jetzt kann der Autologin erfolgen.</span> <span class="token class-name static-context">User</span><span class="token operator">::</span><span class="token function">AutoLogin</span><span class="token punctuation">(</span><span class="token variable">$payload</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"sub"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das hat mir jetzt Spaß gemacht, das rauszusuchen. Ausprobiert habe ich es nicht, also viel Glück damit . Und ich versichere Dir: damit gewinnst Du den Over-Engineering Orden dritter Klasse </p> <p>Bin gespannt, welche Backpfeifen ich jetzt für mein Amateur-Gestümpere ernte. Bis vor einer Stunde wusste ich auch noch nicht, wie das alles geht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1803905#m1803905 Auge 2022-11-21T10:02:15Z 2022-11-21T10:02:43Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo</p> <blockquote> <p>Bin gespannt, welche Backpfeifen ich jetzt für mein Amateur-Gestümpere ernte. Bis vor einer Stunde wusste ich auch noch nicht, wie das alles geht.</p> </blockquote> <p>Falls es Verbesserungspotential gibt, dass von anderen erkannt wird, gibt es hoffentlich Ergänzungen und Korrekturen zu deinen Ausführungen. Aber selbst, wenn dabei Fehler von dir offenbart werden, sind sie, zumindest für mich, eine Einführung in dieses, mir bislang unbekannt gewesene, Thema. Danke dafür.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> 200 ist das neue 35. </div> https://forum.selfhtml.org/self/2022/nov/17/remember-me-funktion-einrichten-csrf-token-erstellen/1804090#m1804090 borisbaer http://54598532.swh.strato-hosting.eu/ 2022-11-24T22:37:10Z 2022-11-24T22:37:10Z Remember-Me-Funktion einrichten (CSRF-Token erstellen) <p>Hallo Rolf,</p> <p>wow, das muss ich erst mal sacken lassen und ausprobieren. Sobald ich die Zeit finde, versuche ich mich mal an deinem Vorschlag und melde zurück, wie es funktioniert hat! </p> <p>Grüße<br> Boris</p> <p>P.S.: Entschuldige die späte Antwort!</p>