ďťż

[php/cookie]Problem z logowaniem

       

Podstrony


telcocafe

Cześć
Na stronie kożystam z przerobionego przez siebie skryptu z PC Formata. Problem pojawił się przy cookies. Strona do logowania miała taki skrypt:
<? $inc = './inc/'; error_reporting(ALL); require_once($inc.'mysql.php'); require_once($inc.'error.php'); require_once($inc.'news.php'); require_once($inc.'user.php'); require_once('system/Strona.php'); class Strona1 extends Strona { var $baza, $info, $user; function tresc(){ baza::polacz(); $act = $_GET['act']; if(!$act){ user::loginForm(); } elseif($act == 'login'){ $log = $_POST['login']; $pass = $_POST['pass']; user::login($log, $pass); } elseif($act == 'logout'){ user::logout(); } } } $strona=new Strona1("Logowanie"); $strona->pokaz(); ?>

Funkcje wywoływane to:
function loginForm(){ echo '<form action="login.php?act=login" method="POST">'; echo '<table cellspacing="0" cellpadding="0" width="100%">'; echo '<tr><td width="100%" class="tytul">'; echo 'Logowanie'; echo '</td></tr><tr><td width="100%" class="tresc" align="justify">'; echo 'Login: <input type="text" name="login" class="login"><br />'; echo 'Has�o: <input type="password" name="pass" class="login" value=""></br>'; echo '<input type="hidden" name="act" value="login">'; echo ' <input type="submit" value="Loguj!" class="login">'; echo '</td></tr></table>'; echo '</form>'; } function login($login, $pass){ $zapytanie = 'SELECT * FROM user WHERE login="'.$login.'" AND pass="'.$pass.'";'; $query = mysql_query($zapytanie); $ilosc = mysql_num_rows($query); $wiersz = mysql_fetch_array($query); $id = $wiersz['id']; if($ilosc != '1'){ echo '<table cellspacing="0" cellpadding="0" width="100%">'; echo '<tr><td width="100%" class="tytul">'; echo ' Logowanie'; echo '</td></tr><tr><td width="100%" class="tresc" align="justify">'; $a = 'B��d'; echo $a; } else{ setcookie("login",$login,time()+30); setcookie('pass',$pass,time()+30); setcookie('id',$id,time()+30); setcookie('log_in','1',time()+30); echo '<table cellspacing="0" cellpadding="0" width="100%">'; echo '<tr><td width="100%" class="tytul">'; echo ' Logowanie'; echo '</td></tr><tr><td width="100%" class="tresc" align="justify">'; echo 'Jeste� zalogowany jako <B>'.$login.'</B><br />'; echo '<a href="login.php?act=logout">Wloguj</a> | '; echo '<a href="member.php">Menu U�ytkownika<a/> |'; echo '<a href="login.php">Powr�t<a/> '; } echo '</td></tr></table>'; } function logout(){ setcookie('login',''); setcookie('pass',''); setcookie('id',''); setcookie('log_in',''); echo '<table cellspacing="0" cellpadding="0" width="100%">'; echo '<tr><td width="100%" class="tytul">'; echo ' Wylogowywanie'; echo '</td></tr><tr><td width="100%" class="tresc" align="justify">'; echo 'Zosta�e� wylogowany <a href="login.php">Zaloguj si� ponownie</a>'; echo '</td></tr></table>'; }

I pozostaje plik members.php
<? $inc = './inc/'; error_reporting(ALL); require_once($inc.'mysql.php'); require_once($inc.'error.php'); require_once($inc.'news.php'); require_once($inc.'user.php'); require_once('system/Strona.php'); class Strona1 extends Strona { var $baza, $info, $user, $news; function tresc(){ baza::polacz(); $a = $_COOKIE['login']; $b = $_COOKIE['pass']; $c = $_COOKIE['id']; $d = $_COOKIE['log_in']; echo 'login='.$a.', pass='.$b.', id='.$c.'<br />'; if ($d == '1'){ echo ' Użytkownik zalogowany'; } else{ echo ' Użytkownik nie zalogowany'; } echo '<br /> <a href="./login.php">Wróć</a> '; } } $strona=new Strona1("Użytkownicy"); $strona->pokaz(); ?>
Problemem jest to, że użytkownik się zaloguje po podaniu poprawnych danych, ale nie zostaną wysłane ciasteczka i plik members nie wczytuje danych. Wygląda mi na to, że nie są wysłane ciastka, ale skrypt do samych ciastek jak testowałem w czystych plikach to działał. Mam problem bo został mi tydzień do skończenia strony. POMOCY!!!



Ojojoj, ojojoj, co za brzydki skrypt. Niebezpieczny i chyba nie ma struktury dokumentu HTML. Oczywiście żadne dane nie są wysyłane przed funkcją tworzącą ciastka? Żadnego błędu nie wyświetla?
Che-che! 30 sekund? Długo strasznie :-D
Użytkownik andrzej_aa edytował ten post 20 styczeń 2008, 16:29
To jest dopiero szablon, więc na bezpieczeństwo nie patrz. Co do czasu to u mnie tak długo się nie wykonuje. Mam włączone wypisywanie błędów , ale wypisuje mi tylko dane podane przeze mnie, tj. login=, itd, ale nie podaje wartości.

Wykorzystaj sesje które są o wiele lepsze, szybsze i bezpieczniejsze. Na początku pliku robisz
session_start(); session_register('test');

I w skrypcie zmienna test masz dostępną tak $_SESSION["test"];
Wpisujesz do niej strone i na każdej stronie w której znajdzie sie kod który podałem ci na poczatku bedzie dostepna ta dana.



Myślałem nad sesjami, ale to rozwiązanie mi nie odpowiada. Ciastka są dla mnie tutaj bardziej optymalne.

Optymalne ze względu na? I co takiego nie odpowiada w sesjach?

Wydłuż czas ważnosci ciasteczek do 2 h i zobacz czy to coś da.

I chyba teraz bedzie działac raportowania błędów.
error_reporting(E_ALL);
Użytkownik polasek edytował ten post 20 styczeń 2008, 16:52
Co do sesji: chodzi mi o ich wygasanie po określonym czasie. Do logowania są wg mnie lepsze ciastka.

odp.:To nic nie daje. nawet po wydłużeniu nic się nie wyświetla

edit:
W pliku login.php:
Undefined index: act in (.......) on line 13
Undefined index: log_in (.......) on line 14
Undefined index: login in (.......) on line 15

login.php po zalogowaniu:
Notice: Undefined index: log_in in c:\usr\apache\httpd\html\szkola\login.php on line 14

Notice: Undefined index: login in c:\usr\apache\httpd\html\szkola\login.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at c:\usr\apache\httpd\html\szkola\system\WzorStrony.php:33) in c:\usr\apache\httpd\html\szkola\inc\user.php on line 115

Warning: Cannot modify header information - headers already sent by (output started at c:\usr\apache\httpd\html\szkola\system\WzorStrony.php:33) in c:\usr\apache\httpd\html\szkola\inc\user.php on line 116

Warning: Cannot modify header information - headers already sent by (output started at c:\usr\apache\httpd\html\szkola\system\WzorStrony.php:33) in c:\usr\apache\httpd\html\szkola\inc\user.php on line 117

Warning: Cannot modify header information - headers already sent by (output started at c:\usr\apache\httpd\html\szkola\system\WzorStrony.php:33) in c:\usr\apache\httpd\html\szkola\inc\user.php on line 118

members.php

Notice: Undefined index: login in c:\usr\apache\httpd\html\szkola\member.php on line 13

Notice: Undefined index: pass in c:\usr\apache\httpd\html\szkola\member.php on line 14

Notice: Undefined index: id in c:\usr\apache\httpd\html\szkola\member.php on line 15

Notice: Undefined index: log_in in c:\usr\apache\httpd\html\szkola\member.php on line 16

Wszystko odnosi się do ciastek
Użytkownik rakiop edytował ten post 20 styczeń 2008, 17:00
Czas wygaśnięcia sesji można zmienić, po drugie twoje ciesteczka mają zerowe bezpieczeństwo. Bo przechowujesz w nich hasło, login, i stan zalogowania co można z łatwością podejrzeć i ewentualnie dostać się na stronę nawet bez znajomości hasła bo nie masz zabezpieczeń przed SQL injection. Sesje są o wiele lepszym rozwiązaniem i bardziej optymalnym i nie wmówisz mi, że do logowania lepsze są ciasteczka do gbyby tak było to jakoś tak wiele osób nie korzystałoby z sesji. Popraw błąd z error_reportingiem który ci podałem powyżej.

EDIT //
Czyli już widzisz jaki błąd. Przed wywołaniem setcookie nie mogą być wysłane żadne dane do przeglądarki. Musisz wstawić setcookie ZANIM wyślesz cokolwiek do przeglądarki. (przypominam o sesjach)

Po 2.
Zanim dopiszesz do zmiennej $act zawartość $_GET['act'] to sprawdz czy taki klucz w tablicy istnieje
if(isset($_GET['act'])) $act = $_GET['act'];
Użytkownik polasek edytował ten post 20 styczeń 2008, 17:05
Znalazłem ciekawe rozwiązanie. Podam je za chwilę jak się sprawdzi.
jak na razie to posłuchałem rady polaska co do zmiennej:
if(isset($_GET['act'])) $act = $_GET['act'] if(!$act){ $a = user::loginForm(); }

i wyrzuca mi taki błąd odnośnie linijki if(isset(...)):
Undefined variable: act in (....) on line 11

O co chodzi??

$act=null; if(isset($_GET['act'])) $act = $_GET['act'];

Dzięki wszystkim. Podam niżej skrypt jakby ktoś potrzebował. Przypominam jednak że jest bez zabezpieczeń.
Plik login.php

<? $inc = './inc/'; error_reporting(E_ALL); require_once($inc.'mysql.php'); require_once($inc.'error.php'); require_once($inc.'user.php'); require_once('system/Strona.php'); baza::polacz(); $act = null; $cookie_login = null; $cookie_log_in = null; if(isset($_GET['act']))$act=$_GET['act']; if(isset($_COOKIE['login']))$cookie_login=$_COOKIE['login' ]; if(isset($_COOKIE['log_in']))$cookie_log_in=$_COOKIE['log_in' ]; if($act == ''){ if($cookie_log_in == ''){ $a = user::loginForm(); } elseif($cookie_log_in == '1'){ header('Location: member.php'); } } elseif($act == 'login'){ if(isset($_GET['login'])) $login = $_GET['login']; if(isset($_GET['pass'])) $pass = $_GET['pass']; user::login($login, $pass); } elseif($act == 'login_ok'){ if($cookie_log_in == '1'){ $b = 'zalogowałeś się '.$cookie_login; } else{ $b = 'zaloguj się'; } } elseif($act == 'logout'){ user::logout(); } elseif($act == 'logout_ok'){ $b = 'Wylogowałeś się'; } class Strona1 extends Strona { var $baza, $info, $user; function tresc(){ global $a; global $b; if($a != ''){ echo $a; } else{ echo' <table cellspacing="0" cellpadding="0" width="100%"> <tr><td width="100%" class="tytul"> Logowanie </td></tr><tr><td width="100%" class="tresc" align="justify">'; echo $b; echo '</td></tr></table>'; } } } $strona=new Strona1("Logowanie"); $strona->pokaz(); ?>

skrypty -> user.php
<? class user{ function loginForm(){ $a = '<form action="login.php?act=login" method="POST"> <table cellspacing="0" cellpadding="0" width="100%"> <tr><td width="100%" class="tytul"> Logowanie </td></tr><tr><td width="100%" class="tresc" align="justify"> Login: <input type="text" name="login" class="login"><br /> Hasło: <input type="password" name="pass" class="login" value=""></br> <input type="hidden" name="act" value="login"> <input type="submit" value="Loguj!" class="login"> </td></tr></table> </form>'; return $a; } function login($login, $pass){ $zapytanie = 'SELECT * FROM user WHERE login="'.$login.'" AND pass="'.$pass.'";'; $query = mysql_query($zapytanie); $ilosc = mysql_num_rows($query); $wiersz = mysql_fetch_array($query); $id = $wiersz['id']; if($ilosc != '1'){ $a = 'Błąd'; return $a; } else{ setcookie("login",$login,time()+30); setcookie('pass',$pass,time()+30); setcookie('id',$id,time()+30); setcookie('log_in','1',time()+30); header('Location: ./member.php'); } } function logout(){ setcookie('login',''); setcookie('pass',''); setcookie('id',''); setcookie('log_in','0'); header('Location: ./login.php?act=logout_ok'); } } ?>

plik dla użytkowników member.php
<? $inc = './inc/'; error_reporting(E_ALL); require_once($inc.'mysql.php'); require_once($inc.'error.php'); require_once($inc.'news.php'); require_once($inc.'user.php'); require_once('system/Strona.php'); $a = null; $b = null; $c = null; $d = null; $e = null; if(isset($_COOKIE['login'])) $a = $_COOKIE['login']; if(isset($_COOKIE['login'])) $b = $_COOKIE['pass']; if(isset($_COOKIE['login'])) $c = $_COOKIE['id']; if(isset($_COOKIE['login'])) $d = $_COOKIE['log_in']; if(isset($e)) $e=''; if($d == ''){ $a = ''; $b = ''; $c = ''; $e = ''; } elseif($d == '1'){ $e = 'Witaj.'; } class Strona1 extends Strona { var $baza, $info, $user, $news; function tresc(){ baza::polacz(); global $a, $b, $c, $d, $e; if($a != ''){ echo 'login='.$a.', pass='.$b.', id='.$c.'<br />'.$e.'<br />'; } echo '<a href="./login.php">Wróć</a> '; } } $strona=new Strona1("Użytkownicy"); $strona->pokaz(); ?>

Przypomnienie: Moja strona działa na zasadzie skryptu z CHIPA, ale nie pamiętam, który numer. Cały skrypt jest u nich na stronie. To dzięki wszytkim i Pozdro.
Temat do zamknięcia :P


Cześć
Na stronie kożystam z przerobionego przez siebie skryptu z PC Formata.



Przypomnienie: Moja strona działa na zasadzie skryptu z CHIPA, ale nie pamiętam, który numer. Cały skrypt jest u nich na stronie. To dzięki wszytkim i Pozdro.

Ekhem...
A ty nadal z tymi ciasteczkami... Może powiesz jakie dasz zabezpieczenia na dane wysyłane w ciasteczkach?

md5 na login, nie wyśle hasła i id.
Poza tym więcej jak na razie nie zamierzam wysyłać w ciasteczkach, może później.
Zastosuje też sprawdzanie autentyczności ciasteczka. Wyśle wygenerowany identyfikator przy logowaniu zapisywany też do bazy i przy każdym nowym logowaniu wygeneruje nowy. Będę go sprawdzał przy sprawdzaniu cookie. Na razie mam tyle pomysłów.
Aaaa... sorki za błąd z gazetą w opisie problemu :D

Edit:
Można już zamknąć temat.
Użytkownik rakiop edytował ten post 22 styczeń 2008, 20:27
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.