Hallo Community!
Mit Hilfe Eurer Hinweise, einigen Tipps eines Kollegen und etwas Glück habe ich jetzt eine Ursache gefunden und bitte gleich mal drei Lösungsvarianten an.
"Schuld" ist die Session-ID!
Genauer: Für jede Session wird eine Session-ID in der Tabelle tl_session im Feld sessionID gespeichert. Diese ist während einer Session das einzige Merkmal zur eindeutigen Zuordnung zwischen Handlung im Browserfenster und dem Contao-Server. Dieses Feld kann maximal Werte bis zu einer Länge von 40 Byte aufnehmen. Die Session-ID wird durch die PHP-Funktion hash_algos() generiert und sollte innerhalb einer ("unendlich") langen Zeit eineindeutig sein. Diese Funktion wird über einen Parameter gesteuert, nach welchem Algorithmus die Session-ID gebildet werden soll. Der dafür zuständige Parameter session.hash_function steht in der php.ini. Im Standard von PHP ist dort der MD5-Algorithmus vorgegeben. Die verschiedenen unterstützten Algorithmen werden entweder in Form einer Zahl oder als Textbezeichner an die Funktion hash_algos() übergeben. Im Laufe der Zeit hat sich wahrscheinlich auch noch die Zuordnung zwischen der Zahl und dem Textbezeichner verändert. In meinem openSUSE 12.1 mit PHP 5.3.8 gilt augenblicklich folgende Zuordnungstabelle:
[0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha224 [5] => sha256
[6] => sha384 [7] => sha512 [8] => ripemd128 [9] => ripemd160 [10] => ripemd256 [11] => ripemd320
[12] => whirlpool [13] => tiger128,3 [14] => tiger160,3 [15] => tiger192,3 [16] => tiger128,4 [17] => tiger160,4
[18] => tiger192,4 [19] => snefru [20] => snefru256 [21] => gost [22] => adler32 [23] => crc32
[24] => crc32b [25] => salsa10 [26] => salsa20 [27] => haval128,3 [28] => haval160,3 [29] => haval192,3
[30] => haval224,3 [31] => haval256,3 [32] => haval128,4 [33] => haval160,4 [34] => haval192,4 [35] => haval224,4
[36] => haval256,4 [37] => haval128,5 [38] => haval160,5 [39] => haval192,5 [40] => haval224,5 [41] => haval256,5
Mindestens seit irgendeinem Patch zum openSUSE 11.4 ist aber von openSUSE in der php.ini ein sicherer Algorithmus vorgegeben:
- 11.4: 2 --> MD5 = 128 bit: es werden 32 Bytes zur Speicherung benötigt ==> alles i.O.
- 11.4: 3 --> sha1 = 160 bit: es werden 40 Bytes zur Speicherung benötigt ==> alles i.O.
- 12.1: sha256 --> sha256 = 256 bit: es werden 64 Bytes zur Speicherung benötigt ==> bei einer Länge des Feldes sessionID von 40 Bytes führt dies unweigerlich zum Fehler!
Um den Fehler vermeiden zu können, muss also die Länge der SessionID und die Länge des Feldes sessionID wieder passend gemacht werden.
Folgende drei Varianten bieten sich zur Lösung des Problemes an.
- Anpassung in der php.ini
- Anpassung der Feldlänge des Feldes sessionID vor der Installation
- Anpassung der Feldlänge des Feldes sessionID in einer bestehenden Installation
Zu 1.: Anpassung in der php.ini
Die für den Apache-Webserver zuständige php.ini steht in:
/etc/php5/apache2/. In dieser steht in openSUSE 12.1 folgender Inhalt:
Code:
; Select a hash function for use in generating session ids.
; Possible Values
; 0 (MD5 128 bits)
; 1 (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function = sha256
Damit CONTAO ohne weitere Änderungen funktioniert, muss der Wert
sha256 auf
md5 oder auf
sha1 umgestellt werden.
Danach ist ein Restart des Apache-Webservers notwendig.
Einziger Nachteil: Es geht etwas Sicherheit verloren. Der MD5-Algorithmus gilt als nicht mehr sicher. SHA1 ist schon noch sicher genug. Dennoch hat sich openSUSE (bzw. die SUSE Linux GmbH) für eine höhere Sicherheit (sha256) als Standard entschieden.
Zu 2.: Anpassung der Feldlänge des Feldes sessionID vor der Installation
Um den von openSUSE vorgegebenen Standard-Algorithmus
sha256 nutzen zu können, bietet sich bei einer Neuinstallation von CONTAO die Anpassung der Feldlänge des Feldes
sessionID in der Tabelle
tl_session an. Dazu muss nach dem Entpacken der Datei
contao-x.xx.x.tar.gz die Datei
database.sql im Verzeichnis
/srv/www/htdocs/contao/system/modules/backend/config/ angepaßt werden.
Ursprünglicher Inhalt:
Code:
--
-- Table `tl_session`
--
CREATE TABLE `tl_session` (
`id` int(10) unsigned NOT NULL auto_increment,
`pid` int(10) unsigned NOT NULL default '0',
`tstamp` int(10) unsigned NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`sessionID` varchar(40) NOT NULL default '',
`hash` varchar(40) NOT NULL default '',
`ip` varchar(64) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
In der Definition für das Feld
sessionID muss der Wert
40 durch
64 ersetzt werden.
Das sieht dann so aus:
Code:
--
-- Table `tl_session`
--
CREATE TABLE `tl_session` (
`id` int(10) unsigned NOT NULL auto_increment,
`pid` int(10) unsigned NOT NULL default '0',
`tstamp` int(10) unsigned NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
`sessionID` varchar(64) NOT NULL default '',
`hash` varchar(40) NOT NULL default '',
`ip` varchar(64) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `pid` (`pid`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Danach ist der Installationsvorgang wie gewohnt durchzuführen.
Im Schritt
Tabellen aktualisieren kann man sich dann nochmals vergewissern, dass die Änderung auch angekommen ist:
Bildschirmfoto1.png
Das Importieren eines Templates, wie z.Bsp. der Music Academy, sollte keinen Einfluss auf die Struktur dieser Tabelle haben, da dort nur für die Verwaltung aktueller Sitzungen notwendige Informationen abgelegt werden wird diese Tabelle nicht mit ins Template übernommen.
Zu 3.: Anpassung der Feldlänge des Feldes sessionID in einer bestehenden Installation
Um nach einer (automatischen) Anpassung der
php.ini auf einen für CONTAO ungünstigen Wert das Login wieder zu ermöglichen, bietet sich außer der Lösung 1 auch noch die Anpassung der Tabelle
tl_session an. Dazu kann man das Werkzeug seiner Wahl anwenden: Konsolenmanager
mysql, Web-Werkzeug
phpMyAdmin, MySQL-Administrator-Anwendung
mysql-workbench oder womit man sich sonst gut auskennt.
Es ist folgende SQL-Anweisung auszuführen:
Code:
ALTER TABLE `contao`.`tl_session` CHANGE COLUMN `sessionID` `sessionID` VARCHAR(64) NOT NULL DEFAULT '' ;
Danach sollte wieder ein fehlerfreies Login möglich sein.
Ich hoffe ich habe mit diesem etwas längeren Beitrag Ursache und Bereinigungsmöglichkeiten des Login-Problems allen helfen können.
thozu
Lesezeichen