Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dlaczego logownie nie działa pod linuksem?
Forum PHP.pl > Forum > Przedszkole
bartek12421
Witam.
Napisałem sobie skrypt logowania, który ma się następująco:
  1. <?php
  2. function login($login, $passwd)
  3. {
  4. mysql_connect("localhost","root","");
  5. mysql_select_db("panel");
  6. $zapytanie = 'SELECT login,haslo FROM `uzytkownicy` LIMIT 0, 30 ';
  7. $wykonaj = mysql_query($zapytanie);
  8. $dane = mysql_fetch_array($wykonaj);
  9.  
  10. $login = isset($_SESSION['login']) ? $_SESSION['login'] : mysql_escape_string($_POST['login']);  //filtracja zmiennej
  11. $haslo = mysql_escape_string(md5($_POST['passwd'])); //filtracja + haszowanie hasla
  12. if($login ==''.$dane['login'].'' && $haslo ==''.$dane['haslo'].'')
  13. {
  14.    
  15.     $_SESSION["USER_AUTH"]  = True;
  16.     $_SESSION["USER_LOGIN"] = $_POST["login"];
  17.     return True;
  18.  
  19.  setcookie("log" , "log", time()+3600, "/","", 0);
  20.  header("Location: ?a=");
  21.  
  22. } else {
  23. header("Location: ?a=info_bad_log");
  24. }
  25. }
  26. ?>

Testowałem to na następującej konfiguracji:
Windows XP Professional
Apache 2
PHP 5.2.5
Wszystko działało jak należy.
Rozczarowałem się, gdy wgrałem to na właściwy serwer, gdyż tam logowanie wcale nie chce działać.
Kliknięcie buttona "zaloguj" nie powoduje ani wyświetlenia strony ?a=info_bad_log, ani zalogowania.
Konfiguracja serwera to
Linux Debian
Apache 2 oraz Lighttpd
PHP 5.2.0-8+etch13 (PHP5-CGI)


Co może być powodem tego, że skrypt nie działa na debianowym serwerze?
Pilsener
Przyczyna pewnie nie leży w tej funkcji - daj error_reporting na ALL i sprawdź, czy się wyświetlają jakieś błędy. I daj kod całego pliku, bo nie wiem, czy np. na początku dałeś session_start etc. I zakładam też, że login i hasło do bazy zmieniłeś? Może być wiele przyczyn, dlaczego działa tu a nie tam - musisz przenalizować krok po kroku, czy funckja w ogóle się wywołuje, a jeśli tak, to w którym momencie przerywa działanie.
bartek12421
Cały kod ma się tak:
logowanie_formularz.php
  1. <form action="index.php" method="post"><input type="hidden" name="page" value="login">
  2. <input type="hidden" name="<?=SESSION_NAME()?>" value="<?=SESSION_ID()?>">
  3. Login<br><input type="text" name="login" value="<?=$_POST["login"]?>"><br>
  4. Hasło<br><input type="password" name="passwd" value=""><br>
  5. <input type="submit" name="submit" value="Loguj"></form>

index.php
  1. <?
  2. include "session.php";
  3. include "admin/config.php";
  4. mysql_connect("localhost","root","");
  5. mysql_select_db("panel");
  6. ?>
  7. <html>
  8. <head>
  9. <link rel="stylesheet" type="text/css" href="style.css">
  10. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  11. <META NAME="Language" CONTENT="pl">
  12. <META name="description" content="<? echo $opis; ?>">
  13. <META name="keywords" content="<? echo $slowa; ?>">
  14. <title><? echo $tytul; ?></title>
  15. </head>
  16. <body>
  17. <table class="glowna" width="<? echo $szerokosc_panelu; ?>">
  18. <tr><td width="<? echo $szerokosc_menu; ?>" valign="top">
  19. <?
  20. include "menu.php";
  21. ?>
  22. </td>
  23. <td valign=top>
  24. <?
  25. if($a=="") $a="wiadomosci";
  26. if(!file_exists("pages/".$a.".php"))
  27.    {
  28.    include "default.php";
  29.    }
  30.    else
  31.    {
  32.    include_once "pages/".$a.".php";
  33.    }
  34.    ?>
  35. </td></tr>
  36. </table>
  37. </body>
  38. </html>

sesion.php
  1. <?
  2. include "funkcje.php";
  3. switch ($page)
  4. {
  5.  case "login"  :
  6.                  $login  = htmlentities(substr($_POST["login"], 0, 255));
  7.                  $passwd = htmlentities(substr($_POST["passwd"], 0, 255));
  8.                  login($login, md5($passwd));
  9.                  break;
  10. }
  11. switch ($a)
  12. {
  13.  case "logout" : logout();
  14.                  break;
  15. }
  16. ?>

funkcje.php
  1. <?
  2. define("SESID", SESSION_NAME() . "=" . SESSION_ID());
  3. function login($login, $passwd)
  4. {
  5. mysql_connect("localhost","root","");
  6. mysql_select_db("panel");
  7. $zapytanie = 'SELECT login,haslo FROM `uzytkownicy` LIMIT 0, 30 ';
  8. $wykonaj = mysql_query($zapytanie);
  9. $dane = mysql_fetch_array($wykonaj);
  10.  
  11. $login = isset($_SESSION['login']) ? $_SESSION['login'] : mysql_escape_string($_POST['login']);  //filtracja zmiennej
  12. $haslo = mysql_escape_string(md5($_POST['passwd'])); //filtracja + haszowanie hasla
  13. if($login ==''.$dane['login'].'' && $haslo ==''.$dane['haslo'].'')
  14. {
  15.    
  16.    //$_SESSION['admin']='ok';  //sesja przyjmuje wartosc 'ok' gdy dane z formularza zgadzaja sie z danymi z bazy
  17.    //$_SESSION['login']=''.$dane['login'].'';
  18.      $_SESSION["USER_AUTH"]  = True;
  19.      $_SESSION["USER_LOGIN"] = $_POST["login"];
  20.      return True;
  21.  
  22.  setcookie("log" , "log", time()+3600, "/","", 0);  //tworzymy ciastko
  23.  header("Location: ?a="); //przenosimy na strone
  24.  
  25. } else {
  26. header("Location: ?a=info_bad_log"); //przenosimy na strone
  27. }
  28. }
  29. function logout()
  30. {
  31.  $_SESSION["USER_AUTH"]  = False;
  32.  $_SESSION["USER_LOGIN"] = Null;
  33. }
  34. function auth()
  35. {
  36.  return ($_SESSION["USER_AUTH"] == True);
  37. }
  38.  
  39. ?>

Dane do bazy są poprawne.
Raportowanie błędów dało taki rezultat:
Kod
[b]Notice[/b]:  Undefined index:  USER_AUTH in [b]/var/www/panel/funkcje.php[/b] on line [b]40[/b]
erix
A masz cokolwiek w tablicy $_SESSION? Nie zmienił Ci się przez przypadek identyfikator sesji?
bartek12421
Jak pokazuje phpinfo() to ja nawet tablicy SESSION tutaj nie mam: http://91.205.75.61/www/php.php
Podam jeszcze konfig PHP, może w nim coś nie tak:
Kod
[Session]
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /tmp
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.save_path = "/tmp"
session.hash_bits_per_character = 4
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
erix
To nie ma być pod tym URL, co podałeś, tylko w Twoim skrypcie. winksmiley.jpg

Daj w którymś miejscu var_dump" title="Zobacz w manualu PHP" target="_manual z tablicą sesyjną i sprawdź, czy tam cokolwiek jest.
bartek12421
  1. <?php
  2. var_dump($_SESSION);
  3. ?>

array(0) { }
erix
Czyli problem wynika z tego, że nie jest prawidłowo przekazywany identyfikator sesji.

Spróbuj to wywalić:
  1. <input type="hidden" name="<?=SESSION_NAME()?>" value="<?=SESSION_ID()?>">

Z tego, co pamiętam, to PHP automatycznie dopisuje identyfikator do action formularza.
bartek12421
Usunięcie tego nic nie zmieniło.
Dlaczego tu nie pojawia się nawet komunikat o złym loginie/haśle?
Po kliknięciu "zaloguj" pomimo tego że formularzu jest
  1. <input type="hidden" name="page" value="login">
wyrzuca mnie na index.php
login.php jest taki:
  1. <?
  2. if(!auth())
  3. {
  4.  print "<p class=error align=center>Podano nieprawidłowy login lub hasło!</p>";
  5. }
  6. else
  7. {
  8. include "wiadomosci.php";
  9. }
  10. ?>


Spróbowałem jeszcze sprawdzić co jest w tablicy sesyjnej na Windowsie.
Na linuxie nie było nic.
Na windzie nawet bez zalogowania jest
Kod
array(2) { ["USER_AUTH"]=>  &bool(false) ["USER_LOGIN"]=>  &NULL }
erix
Cytat
Po kliknięciu "zaloguj" pomimo tego że formularzu jest
  1. <input type="hidden" name="page" value="login">

wyrzuca mnie na index.php
login.php jest taki:

Sory, ale troszkę nie kumam: przecież URL, pod który jest wysyłany formularz, to action...

Otwórz sobie menedżer ciasteczek w przeglądarce i sprawdź, czy masz ten sam identyfikator sesji przy każdym żądaniu.
bartek12421
Za każdym żądaniem jest inny.
erix
To już masz winowajcę.

Kod
session.cookie_path = /tmp

Nie pasuje mi ta ścieżka. Daj:
  1. <?php
  2. ?>

zaraz po session_start" title="Zobacz w manualu PHP" target="_manual.
bartek12421
I to też nic nie daje, pomimo tego, że teraz ID jest taki sam.
erix
A var_dump" title="Zobacz w manualu PHP" target="_manual($_SESSION)?
bartek12421
Tak jak pisałem wyżej - cały czasz jest to pusta tablica.
Zyx
Jeśli kliknięcie "Zaloguj" nic nie powoduje, zostawiłbym raczej ciastka w spokoju i przyjrzał się kodowi/serwerowi. Będzie to trochę uciążliwe, ale możesz faszerować kolejne kawałki kodu poleceniem die('foo'); - dopóki się wyświetla, oznacza to, że wykonanie skryptu tam dociera. Gdy przestanie, znaczy, że w ostatnim kawałku jest coś nie tak. FastCGI i Lighttpd tak czasem ma, że czasem z powodu błędów wykonania uwali się proces obsługujący skrypt i wtedy są takie kwiatki. Sam mam to u siebie na lokalnym komputerze i wiem, jakie jaja się czasem dzieją smile.gif.

Ponadto miałem też w sumie podobny problem pierwszego stycznia. Próbowałem się zalogować do właśnie pisanego skryptu, a tu zupełnie nic nie wchodzi - objawy były podobne do tych, jakie Ty masz. Ale co ciekawe, gdy użyłem innej przeglądarki (Konqueror zamiast Opery), tam wszystko chodziło. Następnego dnia skrypt magicznie naprawił się sam.
erix
Cytat
Tak jak pisałem wyżej - cały czasz jest to pusta tablica.

Sprawdź, na wszelki wypadek, czy serwer ma uprawnienia do zapisu w katalogu z danymi sesyjnymi.
bartek12421
Ma i nawet zapisuje sobie tutaj dane z innych skryptów.

Nie mam zamiaru się z tym męczyć, wykorzystałem znalezionego w Internecie gotowca.
Dzięki za pomoc
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.