Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $_SESSION nie działa
Forum PHP.pl > Forum > Przedszkole
Lord17
Robię sobie logowanie z wykorzystaniem Cookies. Działa to tak, że jeżeli nie istnieje $_COOKIE['login'] skrypt wyświetla panel logowania, jednak jeżeli to ciacho istnieje wyświetlone zostają dane "zalogowany jako" itd. Jednocześnie chcę zrobić, aby jeżeli istnieje to ciasteczko powstały dwie nowe zmienne sesji. $_SESSION['zalogowano'], oraz $_SESSION['login']. Kod wygląda tak:

Kod
if(isset($_COOKIE['login']))
{
$_SESSION['zalogowano'] = True;
$_SESSION['login'] = $_COOKIE['login'];


Teoretycznie wszystko jest ok, gdy na stronie wyechuję te dwie zmienne wszystko działa. Jednak gdy wyłączę przeglądarkę, a po włączeniu wejdę na stronę to jestem zalogowany, te dwie zmienne istnieją, jednak gdy wejdę do innego pliku skrypt gubi te zmienne. Zaczynają działać dopiero, gdy "przepuszczę" skrypt przez jakiś inny plik. Np wchodzę do pliku home.php, tutaj te zmienne działają, wchodzę do skomentuj.php - zmienne nie działają. Lecz jeżeli przed wejściem do skomentuj.php "przejdę" przez plik news.php, a dopiero stąd do skomentuj.php obie zmienne działają. Co może być przyczyną ?
nospor
Ja troche na inny temat ale dla Twojego dobra.
Podaj mi adres tej strony i uwierz mi szybko będe zalogowany bez znajomosci danych logujących.

Nie mozna w ciachu trzymac info o tym czy ktos zalogowany czy nie, bo ciacho mozna baaaardzoooo latwo spreparowac.
Lord17
Strona na localu. Nie bój się, wszystko jest zabezpieczone na tyle, żeby nikomu nie chciało się włamywać. Zresztą nie jest to strona banku, żebym musiał się szczególnie obawiać włamania smile.gif  Ot, zwykłe logowanie do systemu komentarzy. W ciachu mam przechowane login i hasło, potem sprawdzam, czy w bazie istnieje konto z takim loginem i hasłem, a dopiero potem loguję. Nie jest to zbyt bezpieczne, ale jak już mówiłem strona jest z gatunku tych, na którą nikomu nie chciałoby się włamywać. Pomóżcie mi lepiej rozwiązać problem z tą sesją winksmiley.jpg
pyro
Cytat(Lord17 @ 23.06.2008, 17:19:10 ) *
Strona na localu. Nie bój się, wszystko jest zabezpieczone na tyle, żeby nikomu nie chciało się włamywać. Zresztą nie jest to strona banku, żebym musiał się szczególnie obawiać włamania smile.gif Ot, zwykłe logowanie do systemu komentarzy. W ciachu mam przechowane login i hasło (wiem, wiem, nie jest to bezpieczne, bo wystarczy wykraść ciastko, a rozszyfrowanie md5() to łatwizna), potem sprawdzam, czy w bazie istnieje konto z takim loginem i hasłem, a dopiero potem loguję. Nie jest to zbyt bezpieczne, ale jak już mówiłem strona jest z gatunku tych, na którą nikomu nie chciałoby się włamywać. Pomóżcie mi lepiej rozwiązać problem z tą sesją winksmiley.jpg



co ty pier*****

  1. <?php
  2. #exploit na twoje strone by pyro :)
  3. $a = curl_init('www.twojastrona.pl/logowanie.php');
  4. $cookie = 'login='.urlencode('admin');
  5. curl_setopt($a, CURLOPT_COOKIE, $cookie);
  6. curl_setopt($a, CURLOPT_COOKIEJAR, 'cookies.txt');
  7. curl_exec($a);
  8. curl_close($a);
  9. ?>


co ty gadasz o jakimś łamaniu md5 i wogóle... wyżej napisałem exploita w niecałą minutę... chyba o czymś to świadczy dry.gif

co do twojego problemu to pewnie w tych innych plikach nie dałeś session_start" title="Zobacz w manualu PHP" target="_manual


--edit (@ociu)
Jeszcze raz zobaczę takie wygwiazdkowane słowa w Twoich postach, a dostaniesz warna. Nie posiadasz innych słów w swoim słowniku ?
Lord17
session_start powiadasz ? no tak się składa, że jest wszędzie, gdzie być powinno. 
wlamywacz
Wróżkami nie jesteśmy bo ja nie widzę tego w kodzie który podałeś.
Lord17
Cytat(wlamywacz @ 23.06.2008, 18:11:37 ) *
Wróżkami nie jesteśmy bo ja nie widzę tego w kodzie który podałeś.


No ok, rozumiem. Podałem fragment kodu, który powinien pomóc zrozumieć w jaki sposób te $_SESSION są tworzone. Jednak jakby ktoś miał jakiś pomysł, dlaczego to nie trybi to byłbym bardzo wdzięczny za jakieś sugestie
pyro
Cytat(wlamywacz @ 23.06.2008, 18:11:37 ) *
Wróżkami nie jesteśmy bo ja nie widzę tego w kodzie który podałeś.


sam sie domysl dlaczego cytuję włamywacza
Lord17
KLIK

Cała funkcja odpowiedzialna za logowanie
mike
Cytat(Lord17 @ 23.06.2008, 17:34:14 ) *
session_start powiadasz ? no tak się składa, że jest wszędzie, gdzie być powinno.
session_start() a być zawsze wykonywane. A nie przy określonych warunkach.
Zawsze to zawsze. Za każdym razem.
pyro
no a w skrypcie co podales tego nie widac... poza tym albo wkleiles kawalek kodu z czegos albo nie objales kawalka kodu w znaczniki php
Lord17
czego nie widać? Bo już się pogubiłem.

To jest funkcja odpowiedzialna za logowanie, z pliku funkcje.php. Jest objęta w zniaczniki PHP, tylko jest to jedynie fragment pliku
pyro
napewno dałeś wszedzie session_start? Zobacz co daje print_r($_SESSION);
Lord17
session_start() na pewno jest wszędzie. 

a co do print_r($_SESSION);

w pliku, w którym się zalogowuje wyświetla

Kod
Array ( [zalogowano] => 1 [login] => Lord [haslo] => 7130095d311fc4d850cff4e82a36de9b )


jednak po wejściu w plik skomentuj.php wyświetla

Kod
Array ( )
czyli tak jakby gubi tą sesję
Ma znaczenie, czy session_start() wpiszę przed, czy po wywołaniu funkcji?
pest
Ma znaczenie, że session_start() dajesz na początku skryptu, albo tuż po załadowaniu plików z klasami.
Lord17
session_start() jest na początku każdego pliku. Najbardziej dziwne jest, że po przejściu do jakiegokolwiek pliku "gubi" sesję, dopiero po przejściu do jeszcze innego pliku tą sesję odnajduje. Dzieje się tak tylko przy wywoływaniu $_SESSION z $_COOKIE
dragonsokol
ja mam tak:
poczatek pliku:
Kod
session_start();
ob_start();


koinec:
Kod
ob_flush();


stronke masz u siebie w domu czy jakis hosting darmowy? mi na paru hostingach gubilo $_SESSION i $_COOKIE
Lord17
Strona stoi na localhoście.
dragonsokol
windows czy linux? jezeli windows to xampp czy czysty apache? sprawdz folder z sesjami folder "/tmp" czy masz prawa zapisywania
Lord17
Tam wszystko jest ok. Sesje gubi tylko przy wywoływaniu jej ze $_COOKIE. Przy normalnym logowaniu przez formularz jest wszystko ok

Edit: Zauważyłem jeszcze jedną ciekawą rzecz. Mianowicie przy wpisaniu adresu pliku do paska adresu nie gubi sesji. Gubi ją tylko przy korzystaniu z odnośników.
jml
Cytat(Lord17 @ 23.06.2008, 22:01:42 ) *
KLIK

Cała funkcja odpowiedzialna za logowanie

Cytat(Lord17 @ 23.06.2008, 23:24:54 ) *
session_start() jest na początku każdego pliku. Najbardziej dziwne jest, że po przejściu do jakiegokolwiek pliku "gubi" sesję, dopiero po przejściu do jeszcze innego pliku tą sesję odnajduje. Dzieje się tak tylko przy wywoływaniu $_SESSION z $_COOKIE

Mam nadzieję, że wywaliłeś wszystkie session_start() z tej funkcji logującej? Jak wywołujesz tą funkcję w pliku x, ważne aby w nim na początku było session_start() wywołane.

U mnie generalnie zawsze wszystko kręci się w index.php, wystarczy mi więc wywołać session_start() tylko na początku skryptu index.php. Nie ważne ile plików z klasami/funkcjami itd dołączam tam, dopóki wszystko robi się w indexie będzie ok smile.gif Nie wiem jak to jest rozwiązane u Ciebie, ale zachęcam do takiego podejścia.


Cytat(dragonsokol @ 24.06.2008, 00:12:27 ) *
ja mam tak:
poczatek pliku:
Kod
session_start();
ob_start();


koinec:
Kod
ob_flush();


stronke masz u siebie w domu czy jakis hosting darmowy? mi na paru hostingach gubilo $_SESSION i $_COOKIE

Z tego co pamiętam miałem kiedyś problem z sesjami przez ob_start - zmieniało mi SIDy, po wywaleniu obów było już ok, nie wiem jakie jest rozwiązanie na to bo nie miałem czasu szukać wtedy - może ktoś wie czemu sesje i oby się kłucą? I jak to obejść.
Lord17
Możliwe, że gubi tą sesję przez to, że za dużo razy powtarza się session_start() ?  Bo przyznam się, że w przeciętnym pliku session_start() znajduje się aż trzy razy.
mike
Cytat(Lord17 @ 24.06.2008, 10:24:03 ) *
Możliwe, że gubi tą sesję przez to, że za dużo razy powtarza się session_start() ?  Bo przyznam się, że w przeciętnym pliku session_start() znajduje się aż trzy razy.
Jak bardzo niedomyślnym trzeba być żeby nie zrozumieć czegoś co Ci piszą już kilka razy.

Masz mieć tylko raz session_start() i masz je wykonać zanim wykonasz jakąkolwiek inną instrukcję.
Lord17
Cytat(mike @ 24.06.2008, 10:34:26 ) *
Jak bardzo niedomyślnym trzeba być żeby nie zrozumieć czegoś co Ci piszą już kilka razy.

Masz mieć tylko raz session_start() i masz je wykonać zanim wykonasz jakąkolwiek inną instrukcję.


Wolałem się upewnić. Teraz jest już tylko 1 raz, ale to nie zmienia faktu, że problemu to nie rozwiązuje. Sesję gubi nadal.
batman
Dwie strony o niczym.
Przenoszę na przedszkole i jestem bliski zamknięcia tematu. Odpowiedzi dostałeś już wystarczająco dużo, by znaleźć rozwiązanie problemu.
Lord17
Cytat(batman @ 24.06.2008, 10:44:16 ) *
Dwie strony o niczym.
Przenoszę na przedszkole i jestem bliski zamknięcia tematu. Odpowiedzi dostałeś już wystarczająco dużo, by znaleźć rozwiązanie problemu.


Ta, to ja dziękuję za odpowiedzi, które w żaden sposób nie nakierowały mnie co jest nie tak i dlaczego sesję gubi tylko przy korzystaniu z linków, a przy wpisywaniu adresu do paska przeglądarki nie.
batman
1. session_start() - 1 raz na plik.
2. setcookie - ustawia ciasteczko po zalogowaniu użytkownika.
3. ciasteczko będzie widoczne dopiero po odświeżeniu strony.
Lord17
Te wszystkie warunki są spełnione. Dobra, może jeszcze raz.

index.php - odpowiada za includowanie odpowiednich plików

funkcja - funkcja odpowiadająca za logowanie, wywoływana w pliku logo.php

naglowek.php - plik includeowany w każdym innym pliku. To w nim tworzone są ciacha

logo.php - również includeowany w każdym pliku. Tutaj wywołuję funkcję.

Przypominam tylko, że logowanie działa dobrze, gdy korzystam z formularza. Ciacho się tworzy, po wyjściu z przeglądarki i wejściu na stronę po 10 minutach nadal jestem zalogowany. Właśnie wtedy tworzę $_SESSION z ciacha (linia 80 w funkcji). print_r($_SESSION); wywala wartości sesji, czyli niby wszystko jest ok. Problemy zaczynają się przy przechodzeniu do innej podstrony i wykorzystaniu do tego celu odnośników (przy wpisaniu adresu w pasek adresu przeglądarki sesja działa), wtedy właśnie sesja jest gubiona i skrypt odnajduje ją dopiero po przejściu do jeszcze innego pliku. Mam nadzieję, że teraz ktoś będzie w stanie znaleźć jakieś lekarstwo na ten problem. Bo jak do tej pory wszystkie wskazówki wykorzystałem, jednak nic to nie daje.
batman
1. session_start musi być na każdej stronie na samej górze pliku.
2. Usuń @, który znajduje się przed session_start
Lord17
Cytat(batman @ 24.06.2008, 13:17:18 ) *
1. session_start musi być na każdej stronie na samej górze pliku.
2. Usuń @, który znajduje się przed session_start

1. jak jest w index.php to jest jednocześnie na górze każdego pliku, skoro includuję, nie? A jeżeli się mylę to wiedz, że sprawdziłem również sposób z wywaleniem session_start() z index.php i wklejenie do każdego pliku. Nie ma żadnej różnicy.


2. Jak usunę @ wywala mi błąd.
mike
Cytat(Lord17 @ 24.06.2008, 13:32:41 ) *
2. Jak usunę @ wywala mi błąd.
I nie pomyślałeś, że może coś jest nie tak?
Może byś nam go pokazał? Nie wpadłeś na to?
Lord17
Cytat(mike @ 24.06.2008, 13:34:12 ) *
I nie pomyślałeś, że może coś jest nie tak?
Może byś nam go pokazał? Nie wpadłeś na to?

Proszę Cię bardzo


Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\p24\includes\naglowek.php:27) in C:\wamp\www\p24\cms\funkcje.php on line 91
mike
Koleś jest niepoważny. Zamknijcie ten wątek.
batman
Wybacz zwłokę w odpowiedzi, ale musiałem się pozbierać z podłogi i zmienić pieluchę. Skoro jest błąd, to się go poprawia, a nie ukrywa. tyle czasu poszło na marne.
A błąd mówi sam za siebie. Nie można używać session_start w środku, ponieważ jakiś output się wysłał do przeglądarki.

edit
Zgadzam się z przedmówcą.

Zamykam.
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.