sebap123
19.09.2009, 07:40:29
Witam
Napisałem skrytp logowania do strony wykorzystujący sesje. Jest on wykorzystywany na stronie, gdzie chcę, aby w każdej chwili urzytkownik mógł wejść do swojego panelu i zmienić w nim dane lub coś napisać na innej stronie z dokonaniem podpisu.
No i tutaj własie nie wiem czego urzyć. Mysłałem o dwóch wyjściach, a raczej opcjach bo żadna w 100% nie spełnia wymogów:
- Urzycie systemu sesji i w adresie strony przesylanie zapisanego w bazie unikatowego numeru, jednak jest to troche nieestetyczne (zaśmieca adres strony) i urzytkownik nie może sam wprowadzić adresu do jakiejść strony (np. z linku ogolnego) bo musi mieć swój nr.
- Urzycie cookie, tylko tutaj nie wiem do końca jak tą daną przesyłać miedzy stronami (np. znowu ten numer) jak to sprawdzać, który numer ma urzytkownik i co zrobić jak urzytkownik nie obsługuje cookie (czyli powrót do puntku wyrzej)
Wiem, że może troche zagmatwałem, ale proszę o pomoc bo nie wiem co zrobić.
Mysłalem też o takim pasku na ktorym będzie na każdej stronie widniał login tylko mam srednio pomysł jak tam przesyłac dane między stronami.
Chodzi o taki pasek jak jest nawet na tym forum.
Solimo
19.09.2009, 08:02:43
Sesja przekazuje w url, czyli adresie SID czyli session id lub można tez zapisać go do cookie które zostaje wysłane do użytkownika. Polecam ten drugi sposób. Aby zmienić to "ustawienie" możesz np. edytować php.ini. Jednak SID w cookie może być jakoś ukradziony. Warto wtedy zapamiętać np. w bazie danych dane z tablicy SERVER np. user agent i host. I sprawdzać czy są one takie same. Można również użyć session_regenerate_id() co zmniejszy szansę na kradzież sesji - poczytaj w manualu. W sesji trzymaj np user_id z bazy i sprawdzaj czy ktoś jest zalogowany bo ma id usera czy też nie.
Co do drugiego pytania to potnij www na header.php body.php footer.php a następnie za pomocną require/include (znowu manual) pobieraj je w odpowiedniej kolejności. Body zrób generowane dynamicznie, np. jeżeli brak sesji to strona logowania jeżeli sesja jest to cos innego. I teraz w header możesz dać taki pasek i on będzie w każdej stronie bo tylko body się zmienia - oczywiscie sprawdzaj czy pasek powinien być wyświetlony czyli czy w sesji sa odpowiednie dane o user id. To takie najbanalniejsze rozwiązanie.
sebap123
23.09.2009, 15:02:45
A który z tych dwóch systemów (sesje czy cookie) jest bezpieczniejszy. Bo jak tak sobie pocztalem to jednak łatwiej będzie operowac ciasteczkami bo jest to nieco prostsze, a sesje wymagają według mnie więcej zabawy. Pozatym wiele dużych serwisów korzysta z ciateczek tylko.
No ale jak z bezpieczeństwem bo to też ważne.
fander
23.09.2009, 15:05:22
używa się tylko sesji, ciasteczko służy do przekazywania identyfikatora sesji.
Berg
23.09.2009, 15:13:38
Ogólnie żadna z tych metod nie jest bezpieczna jeśli sesji dodatkowo nie zabezpieczysz (np. zabezpieczenie strony przed xss, dodatkowy klucz autoryzacyjny w bazie danych, skrócony czas trwania sesji odświeżany po jakiejkolwiek aktywności użytkownika). Ogólnie sesje przekazywane przez url są w moim odczuciu mniej bezpieczne (ostatecznie wystarczy użyszkodnik z snifferem w sieci i SID już jest znany). Dodatkowo przy przekazywaniu sesji przez url nie będziecie się lubić z Google
sebap123
23.09.2009, 15:27:56
Cytat
używa się tylko sesji, ciasteczko służy do przekazywania identyfikatora sesji.
To mi bardzo pomogło. Jednak teraz mam innego typu pytanie.
Rozumiem, że sejsa (a raczej jej identyfikator) przesyłany jest w ciasteczku. W sesji zalózmy jest login i jakaś dodatkowa informacja o użytkowniku. Strona sprawdza za każdym razem czy taki identyfikator został umieszczony i go "uruchamia".
Tylko teraz pytanie, skąd skrypt ma wiedzieć jaka sesja komu odpowiada bo tego jakoś jeszcze nie widze (czyli jak w cisteczku umieścić żeby zapisana była dana sesja i żeby potem skrypt sprawdzil co ma zrobić z tą sesją).
Berg
23.09.2009, 15:35:24
session-start, polecam przeczytanie
całego działu w manualu dotyczącego sesji.
sebap123
24.09.2009, 18:14:44
Przeglądam manuala, ale wydaje mi się, że wystarczy użyć session id (oczywiście oprocz session start). Jednak caly czas średnio rozumiem jedną rzecz.
Użytkownik loguje się do systemu, session id się tworzy. Potem wchodzi na jakąś inną stronę tego portalu jako zalogowany. Normalnie bez SID używałem GET i zmienna w adresie. Bo w tej zmiennej był np. login czy numer użytkownika, przy pomocy którego byla sprawdzana i pobierana z bazy danych reszta danych (taka jak uprawnienia). Teraz jednak nie wiem jak to zrobić bo wypiszę czy podepnę SID do zmiennej i jak sprawdzić co ta sesja zawiera, czyli jak z niej pobrać umieszczony np. login.
Berg
24.09.2009, 18:25:58
Ale jaki masz dokładnie problem? Sprawdzasz czy sesja istnieje, czy ustawione są poprawne dane, jeśli nie to przekierowujesz użytkownika na stronę logowania i dopisujesz odpowiednie dane.
Dane do sesji zapisujesz za pomocą
$_SESSION['zmienna'] = 'dane';
potem odczytujesz wywołując
$_SESSION['zmienna']
Jeśli sesja się przedawniła (np. czas życia ciasteczka się skończył, użytkownik się wylogował) to $_SESSION['zmienna'] nie będzie istniała, np.
if(isset($_SESSION['login'])) { echo 'sesja istnieje, użytkownik jest zalogowany'; }
else {
// Przekierowuje użytkownika do logowania gdzie po poprawnej autoryzacji zostanie ustawiona zmienna $_SESSION['login']
}
sebap123
25.09.2009, 18:19:08
No dzięki za radę sprawdzę to i dam znać.
Dobra cos tam popisałem i wyszedl mi kod:
if (isset ($_POST['submit'])) {
$login = $_POST['login'];
$query = mysql_query("SELECT * FROM Uzytkownicy WHERE login = '$login' "); $getlist="Select * from Uzytkownicy order by id ASC";
$usr = $getlist3['au_code'];
$id = $getlist3['id'];
$koniec = 'usr='.$usr;
$link = 'admin.php?'.$koniec;
if ( $fetch ) // jesli user zostanie znaleziony w bazie
{
if ( md5( $_POST['password'] ) == $fetch['haslo'] ) // jesli haslo sie zgadza {
if ($fetch['status'] == 0)
{
print "Twoje konto nie jest aktywne"; }
if ($fetch['status'] == 1)
{
$_SESSION['login'] = "$usr";
print 'logowanie normalne zakonczone sukcesem<br>'; print '<a href="sender.php">Klik</a>'; }
if ($fetch['status'] != 0 && $fetch ['status'] != 1)
{
$_SESSION['login'] = "$usr";
print 'logowanie specjalne zakonczone sukcesem<br>'; print '<a href="admin.php">link</a><br>'; }
}
else
{
print 'Przykro mi, ale podane haslo jest bledne'; }
}
else
{
print 'Podany uzytkownik nie istnieje w bazie danych'; }
}
else
{
}
?>
A na stronie na która jest broniona hasłem jest taki kod:
Kod który sprawdza:
if (isset ($_SESSION['login'])) {
$query = mysql_query("SELECT * FROM Uzytkownicy WHERE id = '$id' "); $getlist="Select * from Uzytkownicy order by id ASC";
if ( $fetch )
{
$imie = $getlist3['imie'];
$status = $getlist3['status'];
}
else
{
print "nie znaleziono usera"; }}
Wlasciwa strona:
<?php
include "includes/base.php";
if ($status != 1 && $status !=0)
{
?>
//dalej kod HTML
No i jak się loguje jako admin (czyli spełniam wszystkie wymagane warunki) to jak by nie łapie sesji i odrazu mnie wurzuca na strone błędu. Dokładniej rzecz biorąc wyświetla się hasło "logowanie specjalne zakończone sukcesem" ale potem jak używam linku do panelu admina to nie widzi już, że jestem zalogowany.
Bardzo prosze o pomoc
Berg
25.09.2009, 18:26:04
A o
session_start przed ustawieniem zmiennej sesyjnej i przed jej odczytaniem przez przypadek nie zapomniałeś?
sebap123
25.09.2009, 20:37:55
To tam gdzie uważałem, że powinno byc session_start to dodalem teraz:
if ( $fetch ) // jesli user zostanie znaleziony w bazie
{
if ( md5( $_POST['password'] ) == $fetch['haslo'] ) // jesli haslo sie zgadza {
if ($fetch['status'] == 0)
{
print "Twoje konto nie jest aktywne"; }
if ($fetch['status'] == 1)
{
$_SESSION['login'] = "$usr";
print 'logowanie normalne zakonczone sukcesem<br>'; print '<a href="sender.php">Klik</a>'; }
if ($fetch['status'] != 0 && $fetch ['status'] != 1)
{
$_SESSION['login'] = "$usr";
print 'logowanie specjalne zakonczone sukcesem<br>'; print '<a href="admin.php">link</a><br>'; }
}
else
{
print 'Przykro mi, ale podane haslo jest bledne'; }
<?
require_once "includes/connect.php";
if (isset ($_SESSION['login'])) {
$query = mysql_query("SELECT * FROM Uzytkownicy WHERE id = '$id' "); $getlist="Select * from Uzytkownicy order by id ASC";
if ( $fetch )
{
$imie = $getlist3['imie'];
$status = $getlis
Jednak cały czas nie działa:(
Berg
25.09.2009, 20:46:00
Jedno session_start na początku każdego pliku przed wysłaniem jakiegokolwiek html'a....
sebap123
25.09.2009, 21:25:56
No i nadal nic.
Umieściłem session_start na początku każdej ze stron (oprócz strony, która łączy się z bazą i tej na ktorej jest panel logowania) i nic nie chce działać. Caly czas jest tak jak by tracił w jakims momencie sesję i dane o użytkowniku ale nie mam zupełnie pojecia kiedy.
Berg
25.09.2009, 21:30:41
Odpal raportowanie wszystkich błędów bo z tego co widzę to masz je wyłączone. Pamiętaj że przy logowaniu też musi być odpalona sesja.
sebap123
25.09.2009, 22:01:06
Dobra już wszędzie uruchamiam sesje i nadal nic.
A co do tego raportowania błędów to musisz mi powiedzieć jak to zrobic bo nigdy tego nie używałem i nie weim jak to zrobić.
Berg
25.09.2009, 22:15:23
Błagam, trochę własnej inwencji...
Raportowanie błędówUstaw najlepiej E_ALL i podrzuć co Ci tam php wypluwa.
Poza tym, co to jest:
Kod
if ( $fetch )
{
Przy logowaniu sprawdź czy login i hasło się zgadza, jeśli tak, ustaw sesję np. $_SESSION['logowanieok'] na 1. A później w każdym pliku sprawdzaj czy takowa sesja istnieje, do tego ustaw czas trwania sesji na np. 20 minut
Kod
if(($_SESSION['czaslogowania']+$mozliwyczaslogowania)<time
Dodatkowo możesz do sesji dopisać IP, useragenta czy jakieś losowe liczby.
sebap123
26.09.2009, 20:45:03
Kod
Notice: A session had already been started - ignoring session_start() in /home/.../public_html/pk/includes/base.php on line 4
Notice: Undefined variable: usr in /home/.../public_html/pk/includes/base.php on line 8
Notice: Undefined variable: status in /home/.../public_html/pk/admin.php on line 6
Notice: Undefined variable: status in /home/.../public_html/pk/admin.php on line 6
No teraz mniej więcej wiem o co chodzi.
Rzeczywiście jest bląd z pobraniem zmiennej status która sprawdza czy użytkownik jest zalogowany dlatego przenosi na strone błędu logowania.
Czyli ogólnie nie chce pobrac żadnej zmiennej z sesji.
Oto fragmenty kodu:
admin:
include "includes/base.php";
if ($status != 1 && $status !=0)
{
base.php:
require_once "includes/connect.php";
if (isset ($_SESSION['login'])) {
Możecie mi teraz coś podpowiedzieć bo cały czas chyba chodzi o to samo czyt. przekazywanie danych.
Dlaczego chcesz sprawdzać czy zmienna $status ma wartość inną niż 1 i jednocześnie inną niż 0? Nie sprawdzaj czy sesja istnieje poprzez isset, tylko sprawdź czy odpowiednia jest zawartość jaką jej nadałeś.
sebap123
26.09.2009, 21:34:58
Status sprawdzam poto, aby upewnic się, że użytkownik niedość, że jest zarejestrowany ($status = 0) to sprawdza czy nie jest on normalnym użytkownikiem ($status = 1) przez co nie może wchodzić.
Zmieniłem isset na if ($usr) która jest (powinna być) przekazywana w sesji jednak nie jest. Skrypt w czasi sprawdzenia wyświetla info, że nie znalazł uzytkownika, czyli zgubił sesje.
Nie możesz nadać takich samych nazw dla zmiennych. poza tym w tej instrukcji warunkowej nic nie robisz, gdzie ustalasz dla zmiennej $usr sesję? I jak?
Berg
26.09.2009, 21:44:10
A session had already been started
W którymś z wcześniejszych plików startujesz sesję a potem starasz się ją zastartować jeszcze raz - to jest pierwszy problem.
Potem masz błędy z niezadeklarowaną zmienną $usr oraz $status. Wrzuć kod base.php oraz admin.php na jakąś wklejkę i podrzuć linki na forum, tak niestety dosyć ciężko powiedzieć w których miejscach robisz błąd.
@
!*!, w tym przypadku sprawdzenie wartości zmiennej sesyjnej nic nie da bo
sebap123 dopisuje do zmiennej wartość dynamiczną (login użytkownika). Jeśli do danej zmiennej sesyjnej programista dopisuje dane dopiero po poprawnej autoryzacji to wykrywanie zalogowania przez isset spokojnie wystarczy.
Berg - niekoniecznie, ponieważ jeśli jakoś przechwycimy sesję, to na zwykłym sprawdzaniu isset możemy się nią posłużyć. W końcu są tylko dwie możliwości, albo jesteś zalogowany, albo nie. Dlatego właśnie przydatna jest dodatkowa weryfikacja.
Berg
26.09.2009, 21:52:31
Nie mówię, że nie należny sprawdzać dodatkowo sesji (była chyba zresztą o tym mowa na początku tematu), mówię tylko że w tym konkretnym przykładzie spokojnie isset można zostawić

Na pewno nie powinno być tak jak jest teraz (tj. bez isset lub bez !empty), jeśli nie będzie zmiennej user w sesji to będzie sypać błędami notice.
sebap123
26.09.2009, 23:00:33
base.php:
<?
require_once "includes/connect.php";
if ($usr)
{
$query = mysql_query("SELECT * FROM Uzytkownicy WHERE id = '$id' "); $getlist="Select * from Uzytkownicy order by id ASC";
if ( $fetch )
{
$imie = $getlist3['imie'];
$status = $getlist3['status'];
}}
else
{
print "nie znaleziono usera"; }
?>
admin.php:
<?php
include "includes/base.php";
if ($status != 1 && $status !=0)
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Untitled Document</title>
//...
<br />
</body>
</html>
<?
}
else
{
$adres = 'http://domena.com.pl'.'/?er=1';
Header('HTTP/1.1 301 Moved Permanently'); }
?>
walidate.php (odpowiada za sprawdzenie loginu i hasła):
<?php
require_once "includes/connect.php";
if (isset ($_POST['submit'])) {
$login = $_POST['login'];
$query = mysql_query("SELECT * FROM Uzytkownicy WHERE login = '$login' "); $getlist="Select * from Uzytkownicy order by id ASC";
$usr = $getlist3['au_code'];
$id = $getlist3['id'];
$koniec = 'usr='.$usr;
$link = 'admin.php?'.$koniec;
if ( $fetch ) // jesli user zostanie znaleziony w bazie
{
if ( md5( $_POST['password'] ) == $fetch['haslo'] ) // jesli haslo sie zgadza {
//session_start();
if ($fetch['status'] == 0)
{
print "Twoje konto nie jest aktywne"; }
if ($fetch['status'] == 1)
{
//session_start();
$_SESSION['login'] = "$usr";
print 'logowanie normalne zakonczone sukcesem<br>'; print '<a href="sender.php">Klik</a>'; }
if ($fetch['status'] != 0 && $fetch ['status'] != 1)
{
//session_start();
$_SESSION['login'] = "$usr";
print 'logowanie specjalne zakonczone sukcesem<br>'; print '<a href="admin.php">link</a><br>'; }
}
else
{
print 'Przykro mi, ale podane haslo jest bledne'; }
}
else
{
print 'Podany uzytkownik nie istnieje w bazie danych'; }
}
else
{
}
?>
To to wszystko chyba co sie tyczy tego kodu.
Berg
26.09.2009, 23:30:18
No i niestety nic nie jest jasne. Wywal session_start z base.php (pierwsze wywołujesz w admin.php). Skąd bierzesz zmienną $user i $status? Nie deklarujesz ich wcześniej dlatego skrypt wypluwa Ci błędy. Na 99% właśnie to jest powodem nie działania logowania
sebap123
27.09.2009, 07:17:48
$status biore z base bo tam jest zabranie jej z bazy danych na podstawie danego loginu.
A co $usr to własie jest to do czego caly czas zmierzam. Ta zmienna przekazywana jest poprzez sesje. W walidate masz fragment gdzie zesji logowanie nadaje zmienna $usr. To jest to o co caly czas się pytam.
W ogóle zacznij od przeczytania podstaw PHP, potem weź się za sesje. Tak jak napisał Berg, wywal session_start z base.php, skoro piszesz instrukcje warunkowe to zacznij je jakoś sprawdzać, a nie tylko je umieszczać. I przeczytaj jeszcze raz to co napisałem wcześniej, robisz wszystko na opak, po co sprawdzasz coś co ma być zaprzeczeniem i jednocześnie potwierdzeniem?
if ($fetch['status'] != 0 && $fetch ['status'] != 1)
To jak jakbyś sprawdzał czy czerwony maluch może być jednocześnie i czerwony i zielony, kompletna bzdura.
sebap123
27.09.2009, 11:26:24
No rozumiem, ale jak napisze tylko $status != 0 to oznacza, że 1 może być, a chodzi o to, że nie może. Dlatego postanowilem umieścić również różne od 1. No chyba, że jest jakiś inny sposób
EDIT:
Chyba wymiślilem
if ($fetch['status'] >1)
Berg
27.09.2009, 11:48:12
A ja Ci powiem że nie używasz walidate. Czemu? Z błędów które podałeś wynika że przynajmniej zmienna $usr powinna być zainicjowana w walidate a tak się nie dzieje (wypluwa błędy o braku deklaracji zmiennej). Dodatkowo używasz session start w walidate więc ponowne użycie tej funkcji powinno zgłaszać błąd zarówno w admin.php jak i base.php. Przejrzyj dokładnie cały kod + czytaj błędy - to jest klucz do rozwiązania Twojego problemu.
sebap123
29.09.2009, 18:45:57
No przejrzałem raz jeszcze cały kod i mi się wydaje, że wszystko działa. Znalazłem tylko niespójność danych bo w pewnym momencie zaczynałem przesyłać i sprawdzać różne pola w tabeli (pozostałość po starym skrypcie). Jednak po ich naprawie nadal jest nie tak.
Czy może ktoś pomóc?
Napisaliśmy Ci co robisz źle. Wprowadź te zmiany.
sebap123
1.10.2009, 20:10:19
Może już jesteście tym znudzeni ale cały czas nie mogę nic zrobić. Poprawiłem tak jak pisaliście, umieścilem na serwerze i sie zalogowałem. Sprawdziłem czy i jakiego cookie wysyła strona. Pojawia się PHPSESSID jako cookie tak więc domniemywam, że cookie jest jednak jakos przesyłane.
posiadacz
1.10.2009, 22:12:32
spróbuj tak:
//header.php
//1.php
require('header.php');
$_SESSION['asd'] = 'asd';
echo '<a href="2.php">Dalej</a>
//2.php
echo $_SESSION['asd'];
sebap123
6.10.2009, 13:25:54
Posprawdzałem, pozmieniałem pare linijek i doszedłem do wniosku, że:
1. w sesji nie chce przejść zmienna
2. w ogóle nie wykorzystuje pliku base.php
Tak więc kod znowu wygląda tak jak gdziejś tutaj co go umieściłem. MOże ktoś wie co robię nie tak?
P.S.
usnąłem z base session-start() ale to i tak nic nie daje bo base nie działa.
Może mi ktoś coś doradzić?
MateuszS
6.10.2009, 14:41:32
nie session-start();
tylko
session_start();
sebap123
6.10.2009, 18:47:24
Wiem, tylko zobaczyłem to już w momencie kiedy nie dało się edytować. No czegoś takiego jak session-start to w skrypcie nie mam:)
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.