Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#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.435

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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

Zudem ist dies

deprecated und sollte besser

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.435

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  monkey


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.017
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.435

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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

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.435

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 sad
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.435

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 monkey
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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

echo __DIR__ gibt dir aber den Systempfad aus wink ... 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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

geotek schrieb:

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  ops ...

geotek schrieb:

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?

big_smile cool big_smile

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

cyberman schrieb:

ist das recht ungewöhnlich, dass eine Session mehr als 40 Zeichen hat  ops ...

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.435

Re: [GELÖST] Logged-in UserID in UDT herausfinden

cyberman schrieb:

echo __DIR__ gibt dir aber den Systempfad aus wink ... 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.017
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 monkey ?

Offline

#18 31. August 2015 12:31

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: [GELÖST] Logged-in UserID in UDT herausfinden

cyberman schrieb:

ist das recht ungewöhnlich, dass eine Session mehr als 40 Zeichen hat  ops ...

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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

NaN schrieb:

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

http://www.simplemachines.org/community … c=517279.0

Offline

#20 16. März 2016 15:23

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

NaN schrieb:

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.435

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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

geotek schrieb:

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 big_smile).

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.017
Webseite

Re: [GELÖST] Logged-in UserID in UDT herausfinden

NaN schrieb:

Ist die Frage, ob's das wert ist. (Performance und so)

Naja, zumindest wäre mit dieser Abfrage der Fehler bei Geotek nicht aufgetreten hmm.

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 big_smile.

NaN schrieb:

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