Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.
Seiten: 1
#1 27. August 2015 12:46
- geotek
- probiert CMS/ms aus
- Registriert: 22. April 2015
- Beiträge: 20
- Webseite
[GELÖST] Logged-in UserID in UDT herausfinden
Ich möchte in einem User Defined Tag die UserID des im Backend gerade eingeloggten Benutzers herausfinden. Habe dazu drei verschiedene Wege ausprobiert, aber alle drei erzeugen nur "false" oder einen leeren String:
global $gCms;
var_dump ($gCms->variables['user_id']);
var_dump (get_userid(FALSE));
var_dump (isset($_SESSION['login_user_username']) ? $_SESSION['login_user_username'] : '');
Ich verwende CMSMS 1.12 und das Backend Login funktioniert einwandfrei, CMSMS merkt sich auch meinen Login-Status im Backend, z.B. wenn ich einen Backend-Tab im Browser dupliziere. Wie kann denn das sein? Es sieht mir fast so aus, als würde CMSMS bei mir gar keine Session-Variablen verwenden sondern eine Cookie-Authentifizierung?? Oder habe ich etwas Offensichtliches übersehen?
Offline
#2 27. August 2015 14:00
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Hab den Code 1:1 kopiert.
Bei mir funktioniert es.
Sowohl im Backend als auch im Frontend.
Um die User-ID zu ermitteln, ist "get_userid(FALSE);" der empfohlene Weg.
Es sieht mir fast so aus, als würde CMSMS bei mir gar keine Session-Variablen verwenden sondern eine Cookie-Authentifizierung?
Wie sonst funktionieren Sessions bei Dir üblicherweise, wenn nicht mit einem Session-Cookie?
Damit Sessions funktionieren, bedarf es nunmal einer Session-ID. Und diese Session-ID muss irgendwie dem Client mitgeteilt werden, damit er es bei jeder Anfrage wiederum dem Server zur Authentifizierung mitgeben kann. Üblicherweise verwendet man dazu nunmal Cookies. Und solange der Browser nicht geschlossen wird, gilt dieses Cookie für alle Tabs dieses Browsers. Völlig normal also. Mag sein, dass man Server/Browser auch anders konfigurieren kann oder dass es Web-Seiten gibt, die den Zugriff mit verschiedenen Techniken nur auf einen Tab/Browser beschränken können, aber das Standardverhalten ist für mich eigentlich genau so wie Du es gerade beschrieben hast.
Wie genau bist Du denn mit Deinem UDT vorgegangen?
Wann wird er denn ausgeführt?
UDTs werden im Backend seit CMSms 1.11 nicht mehr geladen/ausgeführt. Stehen die in einem Backend-Template, werden die ignoriert. Im Backend lassen sich UDTs nur noch per Knopfdruck unter "Erweiterungen » Benutzerdefinierte Tags"ausführen.
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#3 27. August 2015 14:34
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Zudem ist dies
global $gCms;
deprecated und sollte besser
$gCms = cmsms();
lauten ...
Offline
#4 27. August 2015 16:52
- geotek
- probiert CMS/ms aus
- Registriert: 22. April 2015
- Beiträge: 20
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Danke, NaN. Mir ist schon klar, dass die beiden ersten Varianten depreciated sind, ich habe sie nur zur Fehlersuche als Vergleich herangezogen.
Das UDT wird sowohl auf einem Test-Template als auch auf einer Testseite eingebunden. Dort bekomme ich an beiden Stellen die Ergebnisse dieses UDT auf der Website angezeigt. Um zu sehen, ob es vielleicht ein generelles Problem mit der Übergabe von Variablen gibt, habe ich dort am Ende auch noch die Zeile
var_dump (cms_utils::get_current_pageid());
drin, die funktioniert einwandfrei. Das Ganze habe ich übrigens auf einem zweiten CMSMS-Server mit unterschiedlichen LAMP-Versionen nachgestellt - mit völlig gleichem Effekt!
Was mich stutzig macht ist die PHP-Abfrage nach $_SESSION['login_user_username'], die bei mir ebenfalls einen leeren String zurückgibt. Wenn der UDT-Interpreter das nicht komplett abfängt, scheint ja mit meinem Session Handling etwas nicht zu stimmen. PHPInfo zeigt mit aber ein funktionierendes Session-Handling, das Session-Verzeichnis /var/lib/php5 ist voll von aktuellen Session Files und das CMSMS-Admin-Login funktioniert ja auch einwandfrei, ich kann an mehreren Tabs im gleichen Browser angemeldet im Backend arbeiten und bekomme nie einen unerwarteten Anmeldeschirm.
Kommt denn bei Euch etwas bei der $_SESSION['login_user_username']-Abfrage im UDT?
Beitrag geändert von geotek (27. August 2015 16:53)
Offline
#5 27. August 2015 18:32
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Kommt denn bei Euch etwas bei der $_SESSION['login_user_username']-Abfrage im UDT?
Verrückt.
Im Büro auf dem Windows-Rechner hat es funktioniert.
Jetzt zu Hause auf dem Mac erhalte ich im Frontend dasselbe Ergebnis wie Du
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#6 28. August 2015 07:52
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ist das jetzt ein Mac Problem???
Hab hier (Win7)
string(3) "xxx"
im Output (wobei xxx für den Usernamen steht).
Offline
#7 28. August 2015 09:43
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ist das jetzt ein Mac Problem???
Nein, liegt am session.cookie_path.
Kann man in der php.ini einstellen.
Auf meinem Windows-Rechner steht da session.cookie_path = /
D.h. das Session-Cookie gilt für die gesamte Domain.
Wenn da nichts steht (also nur session.cookie_path = ), dann gilt das Session-Cookie nur relativ zur aktuellen URL.
D.h. für Frontend und Backend werden unterschiedliche Sessions gestartet.
Hab es gerade mal mit einem leeren Wert auf dem Windows-Rechner probiert.
Gleiches Problem wie bei Geotek.
Im Firebug sieht man dann auch im Front- und Backend unterschiedliche Pfade für das Session-Cookie (und somit auch unterschiedliche Session-IDs).
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#8 28. August 2015 10:24
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Sollte doch lösbar sein, oder?!
Offline
#9 28. August 2015 16:50
- geotek
- probiert CMS/ms aus
- Registriert: 22. April 2015
- Beiträge: 20
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
interessante Beobachtung, NaN.
Meiner Meinung nach sollte der Session_Cookie_Path aber auf dem Default-Wert "/" stehen bleiben, das ist auch üblich so und mit einem leeren Wert käme man in Teufels Küche.
Bei mir ist in Firebug zu sehen, dass Server und Client zwar den gleichen Session-Cookie-Namen verwenden, aber der Server vergibt nach jeder Anfrage einen neuen Wert. Genau genommen setzt er nacheinander sogar zwei Werte, überschreibt damit also den ersten. Das dürfte schon mal auf jeden Fall falsch sein.
Beim jedem folgenden Request sendet der Browser das Session-ID/Wertepaar aus der letzten Server-Antwort, er hat sich also das Cookie korrekt gemerkt, aber der Server überschreibt es jedes Mal mit einem neuen Wert.
Auf der deutschen und englischen CMSMS-Website ist das nicht so, dort bleibt das Session-ID Wertepaar bei jedem Aufruf gleich und der Server überschreibt nicht jedes Mal einen neuen Wert. Aber warum machen meine beiden Server das? Fast könnte man meinen, der Server bekäme die Cookies des Clients gar nicht richtig mit...
Offline
#10 28. August 2015 19:48
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Aber warum machen meine beiden Server das?
Das machen nicht nur Deine Server so.
Mein Mac macht das genauso
Obwohl session.cookie_path auf "/" eingestellt ist.
Ich hab da momentan leider noch keine Erklärung dafür.
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#11 28. August 2015 21:06
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ich glaube, ich habe ein Puzzle-Teil gefunden.
Wenn ich mir in der include.php den Pfad zur Datei ausgeben lasse (echo __DIR__), dann erhalte ich im Frontend einen anderen Wert als im Backend
Im Backend ist er korrekt, aber im Frontend ist er in Kleinbuchstaben.
Backend: /Applications/MAMP/htdocs/CMSms-1.x-SVN
Frontend: /Applications/MAMP/htdocs/Cmsms-1.x-svn
Dadurch entstehen dann für Front- und Backend unterschiedliche Sessions.
Bei beiden Tabs (admin/frontend) war der Pfad in der URL kleingeschrieben.
Aber nur im Backend wurde er korrekt angezeigt.
Selbst realpath() hat mir den Pfad im Frontend so angezeigt, wie er in der Adressleiste angegeben wurde.
Bei Windows ist das egal, weil da Groß- und Kleinschreibung irrelevant ist.
Aber auf *NIX Systemen wird's problematisch.
Wie kann die Eingabe in der Adressleiste Einfluss auf Dateisystemfunktionen haben?
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#12 29. August 2015 13:38
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
echo __DIR__ gibt dir aber den Systempfad aus ... nix Adressleiste.
Könnte das ein Bug sein?
Zumal ja im System nicht durchgängig __DIR__, sondern andere (abenteuerlichen) Funktionen verwendet werden.
Oder anders gefragt - wer oder was verändert die Schreibweise?
Offline
#13 29. August 2015 15:42
- geotek
- probiert CMS/ms aus
- Registriert: 22. April 2015
- Beiträge: 20
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ich habe den Fehler gefunden. In der Datei include.php steht:
if( isset($_COOKIE[$session_name]) ) {
if (!preg_match('/^[a-zA-Z0-9,\-]{22,40}$/', $_COOKIE[$session_name]) ) {
session_id( uniqid() );
session_start();
session_regenerate_id();
}
}
Hier wird geprüft, ob bereits ein gültiges Session-Cookie existiert, andernfalls mit "session_regenerate_id" neu erzeugt. In meiner PHP-Umgebung hat der erzeugte Session-Cookie eine Länge von 64 Zeichen, was aber beim nächsten Aufruf der Seite als ungültig erkannt wird, weil der reguläre Ausdruck eine maximal 40 Zeichen akzeptiert. Es wird daher bei jedem Aufruf ein neuer Session-Cookie erzeugt und alle vorherigen Session-Variablen gehen verloren.
Workaround: im obigen RegEx {22,40} gegen {22,64} austauschen.
Eine sauber programmierte Lösung müsste natürlich sicherstellen, dass entweder von PHP keine längeren Session-IDs als 64 Zeichen erstellt, oder dass auch längere Session-IDs akzeptiert werden.
Meiner Meinung nach sollte darüber hinaus auch session_regenerate_id() durch session_regenerate_id(true) ersetzt werden, damit die alte ID nicht noch weiterhin für potentielle Angriffe zur Verfügung steht, aber das ist ein anderes Thema.
Offline
#14 29. August 2015 16:47
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
In meiner PHP-Umgebung hat der erzeugte Session-Cookie eine Länge von 64 Zeichen
Ähmm, was hast du denn für eine PHP-Umgebung?
Wenn ich dies so lese
https://stackoverflow.com/questions/122 … -id-string
http://forums.devnetwork.net/viewtopic.php?f=34&t=88685
ist das recht ungewöhnlich, dass eine Session mehr als 40 Zeichen hat ...
Meiner Meinung nach sollte darüber hinaus auch session_regenerate_id() durch session_regenerate_id(true) ersetzt werden
Wie war das doch gleich? Du hättest weder Zeit noch die Fahigkeiten zu helfen?
Danke für den Hinweis!!
Offline
#15 29. August 2015 18:28
- geotek
- probiert CMS/ms aus
- Registriert: 22. April 2015
- Beiträge: 20
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
ist das recht ungewöhnlich, dass eine Session mehr als 40 Zeichen hat ...
Meine beiden Server haben
PHP 5.3.17 (SLES 11 SP3) und
PHP 5.6.1 (OpenSuse 13.2)
Alles aus den Suse/Novell-Repositories, nichts separat kompiliert, die meisten PHP-Einstellungen auf Default. Genau deshalb wundert es mich ja, dass nicht Tausende das gleiche Problem haben wie ich. Obwohl - im normalen Betrieb merkt man's ja nicht, denn es scheint ja alles zu funktionieren, nur wenn man mit Session-Variablen arbeiten möchte, geht es schief.
Für die Diagnose hatte ich übrigens vorhin eine vollständig neue CMSMS-Instanz von V.1.12 installiert um eine Referenz zu haben - der gleiche Effekt. Es lag also definitiv nicht an den beiden CMSMS-Installationen, die schon viele Versions-Updates hinter sich haben.
Beitrag geändert von geotek (29. August 2015 18:32)
Offline
#16 30. August 2015 00:09
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
echo __DIR__ gibt dir aber den Systempfad aus ... nix Adressleiste.
Ja eben, das macht mich ja stutzig.
Getestet hab ich das unter Mac OS X 10.6.8 und PHP 5.6.7.
Eine sauber programmierte Lösung müsste natürlich sicherstellen, dass entweder von PHP keine längeren Session-IDs als 64 Zeichen erstellt, oder dass auch längere Session-IDs akzeptiert werden.
Oder einfach beim Suchmuster als Länge den entsprechenden Wert aus session.hash_bits_per_character verwenden.
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#17 30. August 2015 14:52
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Müsste man preg_match dafür erweitern, um tatsächlich die 40 Zeichen verwenden zu können?
Denn nach dieser Aussage
https://secure.php.net/manual/de/sessio … -character
4 - 40 character string (0-9, a-f)
5 - 32 character string (0-9, a-v)
6 - 27 character string (0-9, a-z, A-Z, "-", ",")
verwendet CMSMS den Wert 6 und somit 27 Zeichen.
Zumindest sollte doch die Abfrage auf {22,40} richtig sein, da mehr als 40 mit sha1 nicht geht, oder?!
Oder narrt mich gerade wieder meine Unwissenheit ?
Offline
#18 31. August 2015 12:31
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
ist das recht ungewöhnlich, dass eine Session mehr als 40 Zeichen hat ...
Eigentlich nicht.
Es kommt auf den verwendeten Algorithmus an (siehe z.B. hier)
Ich weiß jetzt nicht, was da in den Repositories von SLES / OpenSuse bei PHP als default eingestellt ist, aber es scheint etwas anderes als sha1 und bit length 4 zu sein. (Es könnte sha256 mit bit length 4 sein, weil sha1 ja nicht mehr sonderlich sicher ist)
Wenn CMSms also unbedingt die Session-ID validieren will, sollte es vorher überprüfen, wie lang die Session-ID gemäß PHP-Einstellungen wird. Die Antwort "Das seien schließlich keine default Einstellungen" kann keine ernst gemeinte sein.
CMSms ist da übrigens nicht das einzige System. Bei Contao gab's das Problem auch schonmal.
Allerdings wundert es mich, dass der Login bei Geotek überhaupt funktioniert hat...
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#19 01. September 2015 23:22
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ich weiß jetzt nicht, was da in den Repositories von SLES / OpenSuse bei PHP als default eingestellt ist, aber es scheint etwas anderes als sha1 und bit length 4 zu sein. (Es könnte sha256 mit bit length 4 sein, weil sha1 ja nicht mehr sonderlich sicher ist)
Damit dürftest du recht haben
Offline
#20 16. März 2016 15:23
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Oder einfach beim Suchmuster als Länge den entsprechenden Wert aus session.hash_bits_per_character verwenden.
Hmm, wie komme ich damit aber auf 64, wie Geotek vorgeschlagen hat?
Der Wert 6 ist doch bereits das Maximum?!
Offline
#21 16. März 2016 17:09
- NaN
- Moderator
- Ort: Halle (Saale)
- Registriert: 09. November 2010
- Beiträge: 4.436
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Die Zahl hash_bits_per_character alleine reicht da nicht aus. Man muss zusätzlich ermitteln, welcher Algorithmus für das Generieren der Session-ID verwendet wird. Und dann muss man anhand der hash_bits_per_character und der Länge eines generierten Hashs die Länge der Session-ID ermitteln.
(wie z.B. in dem bereits verlinkten stackoverflow-beitrag beschrieben)
Ist die Frage, ob's das wert ist. (Performance und so)
Könnte man vielleicht beim Installieren ermitteln und als config-Variable spreichern.
Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)
Offline
#22 17. März 2016 13:55
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Kommt denn bei Euch etwas bei der $_SESSION['login_user_username']-Abfrage im UDT?
Gerade noch mal mit CMSMS 1.12.1 (PHP 5.6.18 / Linux-Ubuntu) auf einem Kundenserver geprüft - sowohl $_SESSION['login_user_username'] als auch $_SESSION['cms_admin_username'] in einem UDT liefern den korrekten Benutzernamen.
Alternativ funktioniert auch $_SESSION['cms_admin_user_id'] (um auf das Thema zurück zu kommen ).
Beitrag geändert von Andynium (17. März 2016 14:13)
Offline
#23 19. März 2016 21:59
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: [GELÖST] Logged-in UserID in UDT herausfinden
Ist die Frage, ob's das wert ist. (Performance und so)
Naja, zumindest wäre mit dieser Abfrage der Fehler bei Geotek nicht aufgetreten .
Und so komplex ist das Script nicht, weshalb ich an dieser Stelle das Thema Performance für vernachlässigbar halte. Da gibt's ganz andere Baustellen .
Könnte man vielleicht beim Installieren ermitteln und als config-Variable spreichern.
Hmm, gefällt mir nicht so richtig - die Variable ändert sich mit einem Umzug. Da gibt's (IMHO) zu viel Problempotential. Nur die wenigsten lassen ja in diesem Fall noch mal die komplette Installationsprozedur durchlaufen...
Da wäre vllt ein Eintrag in der Datenbank (Länge der Session-ID + IP des geprüften Servers) besser.
Wobei - ist auch Quatsch. Da bekommt der Server ein Update, und schon kann sich die Länge der Session-ID ändern.
Ich glaub, an dieser Stelle kommt man um eine dynamische Prüfung nicht drumherum ...
Offline
Seiten: 1