Próbuję od jakiegoś czasu napisać skrypt logowania, ale tak, aby był jak najbardziej bezpieczny. Jakiekolwiek włamanie na konto użytkownika jest w moim przypadku niedopuszczalne. W internecie dużo jest "poradników" czy też "kursów" na ten temat. A pisząc poradniki, jeszcze w cudzysłowu mam na myśli to, że w 95% przypadków jest to zwykły system oparty na sesjach, bez jakichkolwiek zabezpieczeń. W większości przypadków nie jest to też to, czego szukam.
Docelowo muszę napisać system logowania z możliwością zapamiętania użytkownika na danym komputerze - jedynym słusznym rozwiązaniem jest użycie sesji i cookies.
I teraz jak to ugryźć?
1) Czy wystarczy samo session_regenerate_id(), czy coś jeszcze można by było dorzucić do kodu?
2) Czy warto stworzyć osobną tabelę w bazie danych specjalnie dla sesji? Jeśli tak, to na jakiej zasadzie by to działało i jakie pola powinny się w niej znaleźć? Dla przykładu, oto tabele z phpBB3, niestety nie wiem w jaki sposób rozwiązano tam ten problem, gdyż cały kod tegoż forum jest za długi i nie da się go jednocześnie przeczytać i zrozumieć.
CREATE TABLE `sessions` ( `session_id` varchar(32) BINARY NOT NULL DEFAULT '', `session_user_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0', `session_forum_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0', `session_last_visit` int(11) UNSIGNED NOT NULL DEFAULT '0', `session_start` int(11) UNSIGNED NOT NULL DEFAULT '0', `session_time` int(11) UNSIGNED NOT NULL DEFAULT '0', `session_ip` varchar(40) BINARY NOT NULL DEFAULT '', `session_browser` varchar(150) BINARY NOT NULL DEFAULT '', `session_forwarded_for` varchar(255) BINARY NOT NULL DEFAULT '', `session_page` blob NOT NULL, `session_viewonline` tinyint(1) UNSIGNED NOT NULL DEFAULT '1', `session_autologin` tinyint(1) UNSIGNED NOT NULL DEFAULT '0', `session_admin` tinyint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`session_id`), KEY `session_time` (`session_time`), KEY `session_user_id` (`session_user_id`), KEY `session_fid` (`session_forum_id`) ) TYPE=MyISAM; CREATE TABLE `sessions_keys` ( `key_id` varchar(32) BINARY NOT NULL DEFAULT '', `user_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0', `last_ip` varchar(40) BINARY NOT NULL DEFAULT '', `last_login` int(11) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`key_id`,`user_id`), KEY `last_login` (`last_login`) ) TYPE=MyISAM;
3) W jaki sposób rozwiązać problem z zapamiętaniem użytkownika, co wysyłać w ciastkach aby było w miarę bezpiecznie?
Nie przyjmuję gotowców! (choć chyba i tak nikt mi go dawać nie zamierzał
