Kierowanie ruchem za pomocą header(location). Kilka pytań

0

Cześć!

Napisałem skrypt do logowania oraz kontroli sesji na każdej podstronie. Ale mam kilka pytań, skrypt wygląda mniej więcej tak:

logowanie.html > loguj.php( tutaj użytkownik jest autoryzowany oraz zmienna superglobalna $_SESSION zostaje ustawiona na login usera, następnie user zostanie przekierowany za pomocą header location na inną stronę a jeżeli błędnie wprowadził dane to wysyłamy go opcją header location do logowanie.html) > glowna.php (tutaj następuję kontrola sesji, jeżeli zmienna $_SESSION nie jest ustawiona do leci user na logowanie.html za pomocą header location).

A moje pytanie:

1) Czy używanie header(loation:) do kierowania userów jest bezpieczne? I czy tak powinno się kierować userów? Chciałbym możliwie najbardziej oddzielić html od php i w skryptach nie umieszczać wyników bez wcześniejszej autoryzacji za pomocą pliku przejściowego takiego jak loguj.php, który służy tylko do tego, żeby kierować ruchem
2) Czy kontrolę sesji na podstronach bezpieczniej byłoby sprawdzać w taki sposob:

if(isset($_Session[login]) && isset($_Session[id_w_bazie])){
$sql= select id,login from jakas_tabela where id=$id_w_bazie and login=$ogin
$wynik=db->query($sql)
if($_SESSION[login]==$wynik[1] && $SESSION[id]==$wynik[0])
return true;
else
return false
}
else return false;

Czy wystarczy samo if(isset($_Session[login]) && isset($_Session[id_w_bazie])) ?

0

Tak ogólniej, bo ten kod się nie trzyma kupy:

$_Session[id_w_bazie]

To coś jak już powinno być wartością, nie kluczem tablicy, poza tym $_SESSION dużymi i indeksy tablicy powinny być jako stringi. W tym miejscu masz stałe, które nie mogą zostać rozwiązane (bo nie istnieją, więc są zmieniane w stringi, ale to nie jest zalecana praktyka pisania).

http://php.net/string
http://php.net/array
Dosyć obszerne artykuły o składni.

http://php.net/pdo
Dosyć sensowna jak na PHP biblioteka do preparowania zapytań ze zmiennymi. Nie klej zapytań SQL ręcznie, bo tylko dołożysz sobie roboty i ew. narobisz luk bezpieczeństwa.

0

To było coś w stylu pseudokodu, przecież wiem jak pisać... Chodziło o ogólną koncepcję logowania i sprawdzanie sesji oraz o tym czy to sensowne sprawdzać na każdej podstronie wartość w zmiennej $_SESSION logując się do bazy i wykonując zapytania tylko po to, żeby porównać czy id i login zawarte w sesji zgadzają się z loginem i id w bazie.

0

To nie ma sensu, umiałbyś sam odpowiedzieć sobie na pytanie gdybyś znał mechanikę sesji.

http://php.net/session

Sesje, jak i wpisie w bazie danych są przechowywane po stronie serwera, użytkownik nie może bezpośrednio podmienić żadnej z tych wartości, więc nie ma sensu wprowadzać takiej ochrony. Możesz natomiast wywoływać zapytanie by sprawdzić, czy np. nie został w trakcie swojej sesji zbanowany.

Propos pseudokodu - podchodziłbym do tego ostrożnie, warto zachowywać podstawowe zasady składni języka, bo czasem z ich olewania wynikają nieścisłości.

0

poza tym może się user zalogować z dwóch komputerów i na jednym zmienić hasło - wtedy na drugim powinien zostać wylogowany...

0

Sugerujesz, żeby również przenosić w zmiennej sesji hasło między stronami i sprawdzać czy czasem się nie zmieniło?

0

Nie tyle hasło, co hash hasła. I wcale nie trzeba tego robić jeśli zaimplementujesz mechanizm sesji u siebie w bazie danych (będziesz nadawał po prostu użytkownikom ciasteczka z ich identyfikatorami sesji, a dane dotyczące samych sesji przechowywał w tabeli w bazie zamiast w $_SESSION). Wtedy po zmianie hasła możesz po prostu wyczyścić aktywne sesje danego użytkownika z bazy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0