2011-12-17 13 views
6

Stworzyłem system logowania za pomocą sesji PHP.Czy ta sesja logowania jest bezpieczna?

Oto jak to działa:

1.), gdy użytkownik loguje się (z ważną informacją Login): Ich informacji (username i password) są przechowywane w sesji, wraz z kilkoma innymi kawałkami info: The Expire time: To tylko 5 minut dodane do bieżącego czasu (więc jeśli użytkownik zaloguje się o godzinie 22:30, czas wygaśnięcia wyniesie 22:35).

2.) Na każdym widoku strony zalogowanego użytkownika: Sesja jest sprawdzana, aby sprawdzić, czy istnieje. Jeśli nie, użytkownik jest przekierowywany na stronę logowania. Jeśli sesja istnieje, sprawdza ona expire time i porównuje ją z current time. Jeśli numer expire time jest większy niż current time (użytkownik był nieaktywny przez 5 minut), to jego dane użytkownika (w sesji) są sprawdzane (w porównaniu do tych w bazie danych), a sesja Expiretime jest aktualizowana, ale jeśli wartośćjest mniejsza następnie current time, nie sprawdzi żadnych szczegółów, zaktualizuje sesję expire time i pozwoli użytkownikowi na kontynuowanie. Zrobiłem to, aby zapobiec ciągłemu wysyłaniu zapytań do DB, aby oszczędzić przepustowość.

Zasadniczo po pomyślnym zalogowaniu użytkownika ich nazwa użytkownika i hasło nie będą ponownie sprawdzane na DB, dopóki nie staną się nieaktywne (pozostaną na jednej stronie) przez 5+ minut lub się wylogują.

zapomniałem wspomnieć coś chłopaki: upływa czas sesji jest faktycznie nazywa expire_time_unique_characters ($_SESSION['expire_time_'.$unique_nu]) co oznacza, że ​​zły człowiek będzie miał również znaleźć $unique_nu kiedy udaje sesję ...

mam tylko to uczucie, że nie jest bardzo bezpieczne.

Ponadto, projekt ten jest dla open source (ludzie mogą zobaczyć kod źródłowy), dzięki czemu stwarza jeszcze większe ryzyko tutaj ...

może wy mi dać pewne informacje zwrotne?

Dzięki

+0

Dlaczego przechowywać kombinację użytkownik/hasło na serwerze w trybie zwykłego tekstu? Jak to powinno poprawić bezpieczeństwo? Jeśli użytkownik/hasło jest błędne, sesja nie zostałaby ustalona w pierwszej kolejności, prawda? –

+0

@Niklas Sesja zostanie utworzona dopiero po pomyślnym zalogowaniu. –

+0

Następnie nie trzeba ponownie sprawdzać kombinacji logowania co kilka minut. Po prostu nie przechowuj nazwy użytkownika/hasła na serwerze. Ponadto nie przechowuj ich w bazie danych! Użyj do tego silnego algorytmu haszowania (najlepiej z rozciąganiem klucza). –

Odpowiedz

0

$_SESSION jest stosunkowo bezpieczne, pod warunkiem, że jest używany w prawo. Na przykład, jeśli pliki sesji znajdują się poniżej katalogu głównego, nie można uzyskać do nich dostępu, chyba że ktoś ma bezpośredni dostęp do systemu plików serwera. Z tego powodu nadal chcesz zachować hasło zaszyfrowane, ale nazwa użytkownika w postaci zwykłego tekstu jest idealnie w porządku.

Zachowaj identyfikator sesji w pliku cookie, a nie za pomocą metody łańcucha zapytania, w przeciwnym razie każdy, kto skopiuje adres URL, nieumyślnie udostępni sesję i pominie logowanie.

To powinno zrobić. Oczywiście, jeśli ktoś hakuje sieć użytkownika i uzyskuje dane z plików cookie, może go użyć do udawania użytkownika, ale prawie nic nie da się z tym zrobić. Możesz sprawić, że będzie to trudniejsze (wymagać na przykład, aby ciąg agenta użytkownika był taki sam), ale ostatecznie nie można wiele zrobić, jeśli sieć użytkownika została naruszona. To nie twoja odpowiedzialność, aby chronić swoją sieć, tylko ich dane na serwerze.

+0

Warto zauważyć, że https naprawiłby sytuację z ciasteczkami (chociaż nie mieści się w zakresie pytania, i https nadal będą miały problemy). – Corbin

+0

Zapomniałem również wspomnieć o czymś w pytaniu. Czy możesz sprawdzić moją edycję? –

+0

Nie ma znaczenia. Dostęp do '$ _SESSION' jest wzmocniony przez plik cookie" PHPSESSID "(nazwa domyślna) podany przez przeglądarkę. –

2

Przechowywanie ID użytkownika w sesji jest więcej niż wystarczające.

Nadal powinieneś zaimplementować jakąś ochronę przed utrwalaniem/przejmowaniem sesji.

Powiązane problemy