Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przechowywanie uprawnień
Forum PHP.pl > Forum > Przedszkole
Mrozie
Mam zamiar napisać własny system rejestracji/logowania wraz z blokadą dostępu do niektórych części serwisu. Wiadomo, całość polegałaby na tym, żeby skrypt sprawdzał czy dany user ma uprawnienia np. typu 1 czy typu 2.

Tu jednak nasuwa się problem: gdzie przechowywać informację o uprawnieniach usera, gdy ten przechodzi pomiędzy podstronami serwisu? Ciastka oczywiście odpadają, sesje też chyba nie są zbyt bezpieczne, więc co z tym fantem zrobić?

Wszelkie sugestie mile widziane. smile.gif

Pozdrawiam, Mrozie
skowron-line
Wszystkie uprawnienia trzymaj w bazie a w nagłówku strony odwołuj sie do bazy z odpowiednim oznaczeniem danego uprawnienia i id użytkownika.
  1. <?php
  2. $UPR = '1_1'; // taki numer może np oznaczać spis użytkowników
  3. // zapytanie;
  4. // Jeśli ma za niskie uprawnienia to moze tylko oglądać liste użytkowników a w im większe to edycja, usuwanie
  5. ?>

Na stronie głównej może też być oznaczenie i wyciągając uprawnienia na ich podstawie możesz tworzyć linki do pozostałych podstron
qba10
Czemu sesje nie są bezpieczne?
Za pomocą sesji zrobisz to bezproblemu...
Mrozie
Poczytałem przez ostatni tydzień o sesjach, nie wiem jednak, czy dobrze wszystko pojąłem. Ostatecznie obrałem taką koncepcję:

1. Po zwalidowaniu danych wysyłanych przez formularz logowania, zapisuje w bazie danych ID sesji i nazwę hosta (która jak mniemam nie powinna się zmienić w czasie sesji).

2. Podczas przechodzenia pomiędzy podstronami wyciągam ID sesji i adres hosta i sprawdzam, czy nie zmieniły się od ostatniego czasu (to na wypadek przejęcia przez osoby trzecie ID sesji w trakcie jej trwania; gdyby te wartości były różne, wywoływane jest session_regenerate_id() ).

3. W newralgicznych miejscach, gdzie wymagane jest sprawdzanie przywilejów, oprócz hosta wyciągam z bazy danych także zahashowany id grupy, do której należy użytkownik, wg klucza WHERE = ID sesji.

4. Przy wylogowaniu pola host i sessid w bazie danych przyjmują wartość NULL.

Na razie jest to sam koncept, nie testowałem go. Jak to wygląda od strony bezpieczeństwa? Wydaje mi się, że przekazywanie ID sesji z bazy danych jest bezpieczniejsze od ciastek lub dopisywania SID-a do adresu URL, jednak wydaje mi się, że gdzieś tu musi być haczyk. winksmiley.jpg

Czekam na sugestie i pozdrawiam.
zulus
session_set_save_handler - użyj tego żeby zamienić domyślny sposób obsługi sesji dla PHP. Możesz wtedy zapisywać wszystko w bazie (a nie w plikach w katalogu np /tmp servera), masz pełna kontrolę nad danymi, sprawdzasz host/ip i co tam tylko chcesz winksmiley.jpg

System zaś napisz na zwykłych sesjach. Czyli masz $_SESSION['idGroup'] winksmiley.jpg

Dzięki temu po pierwsze ograniczysz liczbę zapytań, po drugie będziesz chronił całą sesję, po trzecie kod bedziesz mógł użyć w przyszłości winksmiley.jpg
Mrozie
Dzięki za tą funkcję, nie wiedzałem o jej istnieniu. smile.gif

Nie rozumiem tylko tej części manuala:

CODE
/*********************************************

* UWAGA: Musisz sam zaimplementować obsługę *

* zbierania śmieci (gc) *

*********************************************/

function gc ($maxlifetime)

{

return true;

}


Co powinna robić funkcja gc?

Przepraszam, ze dwa posty pod sobą, ale wiem, że inaczej IPB nie wyświetli tego w aktywnych tematach.

Poczytałem o tej funkcji, jednak nie wszystko zrozumiałem. Troche kodu:
CODE

mysql_connect("localhost", "login", "pass");

mysql_select_db("dbname");



function sess_open($sess_path, $sess_name) {

return true;

}



function sess_close() {

return true;

}



function sess_read($sess_id) {

$result = mysql_query("SELECT `Data` FROM sessions WHERE SessionID = '$sess_id';");

if (!mysql_num_rows($result)) {

$CurrentTime = time();

$sess_id = session_regenerate_id();

mysql_query("INSERT INTO sessions (SessionID, DateTouched) VALUES ('$sess_id', $CurrentTime);");

return '';

} else {

$content = mysql_fetch_assoc($result);

mysql_query("UPDATE sessions SET DateTouched = $CurrentTime WHERE SessionID = '$sess_id';");

return $content['Data'];

}

}



function sess_write($sess_id, $data) {

$CurrentTime = time();

mysql_query("UPDATE sessions SET Data = '$data', DateTouched = $CurrentTime WHERE SessionID = '$sess_id';");

return true;

}



function sess_destroy($sess_id) {

mysql_query("DELETE FROM sessions WHERE SessionID = '$sess_id';");

return true;

}



function sess_gc($sess_maxlifetime) {

$CurrentTime = time();

mysql_query("DELETE FROM sessions WHERE DateTouched + $sess_maxlifetime < $CurrentTime;");

return true;

}



session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");

session_start();

?>


Pisałem (a właściwie kopiowałem) w oparciu o jeden ze znalezionych w sieci artykułów. Teraz moje pytania brzmi:

Czy sprawdzanie grupy powinno odbywać się wewnątrz funkcji sess_read() czy powinienem po session_start() zarejestrować tą zmienną i dopiero wtedy sprawdzić z bazą danych uprawnienia tejże grupy?
zulus
Fajny opis tej funkcji i przykład zastosowania znajdziesz na stronie php.pl winksmiley.jpg : http://wortal.php.pl/wortal/artykuly/php/a...handler_czesc_i

Tam znajdziesz odpowiedzi tongue.gif
bełdzio
1. jesli czesto sprawdzane sa przywileje trzymaj dane w sesji
2. co do bezpieczenstwa sesji http://www.beldzio.com/bezpieczenstwo-mechanizmu-sesji.freez

Cytat(Mrozie @ 9.08.2008, 19:49:10 ) *
1. Po zwalidowaniu danych wysyłanych przez formularz logowania, zapisuje w bazie danych ID sesji i nazwę hosta (która jak mniemam nie powinna się zmienić w czasie sesji).

powinien sie zmieniac zeby uchronic przed przejeciem sesji :-)
Mrozie
Huh, chyba to zrozumiałem. Cała klasa opisana na wortalu.php.pl ma za zadanie jedynie zmienić spposób zapisu sesji (z folderu tmp na serwerze na moją baże danych), natomiast wszystkie inne rzeczy, takie jak rejestrowanie sesji odbywają się "normalnie", w dalszej części kodu, bez ingerencji w metody session_set_save_handler. Zgadza się?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.