ďťż
Podstrony
|
telcocafePrzerabiam ten system logowania:http://www.compzone....sesjach-48.html Chce by login i haslo pobierał z bazy danych. To jest efekt: http://unix.b7.pl/1/sesje.php a tu jest kod: http://unix.b7.pl/1/sesje.phps Niestety nie umiem tego zrobić i nie mam pojęcia gdzie kryją się błędy i jak to poprawić. Może ktoś umiałby mi pomóc. Błędy wskazują na to, że nie masz tabeli uzytkownik w bazie. Nie masz również funkcji check_usrdata(), która najprawdopodobniej sprawdzała login i hasło usera. Użytkownik mmatheww edytował ten post 22 maj 2006, 20:52 Błędy wskazują na to, że nie masz tabeli uzytkownik w bazie. Nie masz również funkcji check_usrdata(), która najprawdopodobniej sprawdzała login i hasło usera. <? session_start(); function ReLoad(){ echo "<script> location.href='index.php'; </script>"; } include('../configuration.php'); $link = mysql_connect("$localhost", "$user", "$password") or die ("Nie można się połączyć"); mysql_select_db ("$data_base") or die ("Nie mozna wybrać bazy danych"); echo mysql_error(); function Check_UsrData($_login,$_pass){ $_p = fopen("dane.txt","r"); $query = "SELECT * FROM dz_users WHERE uzytkownik = '".$_login."' AND haslo = '".md5($_pass)."'"; $result = mysql_query ($query); if (mysql_num_rows($result)>0) Â return TRUE; //przerwij i zwroc informacje o zgodnosci :) else return FALSE; } //funkcja do wylogowywania :) function LogOut(){ $_SESSION["usrname"] = ""; $_SESSION["usrpass"] = ""; ReLoad(); } //jesli nie jestes zalogowany - wyswietl formularz if (!Check_UsrData($_SESSION["usrname"], $_SESSION["usrpass"])) { echo "<form method='post' action='$PHP_SELF?a=login'>n"; echo "Login: <input name='f_login'><br>n"; echo "Hasło: <input name='f_passwd' type='password'><br>n"; echo "<input type='submit' value=ok><br>n"; echo "</form>n"; } else { echo "ZALOGOWANO :)<br><a href=$PHP_SELF?a=logout>wyloguj</a>"; } //sprawdzaj akcje :) if (isset($_GET["a"])){ $act = $_GET["a"]; if ($act == "login") { if (($_POST["f_login"] == "") || ($_POST["f_passwd"]=="")) { echo "podaj dane";} $_SESSION["usrname"] = $_POST["f_login"]; $_SESSION["usrpass"] = md5($_POST["f_passwd"]); ReLoad(); } else if ($act == "logout") { LogOut(); } } ?> Są pewnie błędy aczkolwiek looknij na funkcję Check_UsrData() Użytkownik mmatheww edytował ten post 22 maj 2006, 21:13 (...) $_p = fopen("dane.txt","r");Nie rozumiem przedewszystkim tego fragmentu... gdyż wogóle nie posiadam takiego pliku Więc pozwoliłem sobie usunąć... Błąd jednak występuje tu: if (mysql_num_rows($result)>0) return TRUE; A trudno mi powiedzieć jak to zmienić... Nawet ignorując ten błąd... nie działa sam system... nie da się zalogować... http://unix.b7.pl/1/index.php http://unix.b7.pl/1/index.phps Bo coś jest z zapytaniem chyba function Check_UsrData($_login,$_pass){ $query = "SELECT * FROM dz_users WHERE uzytkownik = '$_login' AND haslo = 'md5($_pass)'"; $result = mysql_query ($query); if(!$result) {echo 'Błąd wykonania zapytania.'; return FALSE; } else{ if (mysql_num_rows($result)>0) return TRUE; //przerwij i zwroc informacje o zgodnosci smile.gif else return FALSE; } } Rzuć sobie zapytanie w phpmyadmin i zobacz czy ma jakieś błędy. Oblookaj może tego posta: http://www.compzone....php?p=2376#2376 <?php session_start(); function ReLoad(){ echo "<script> location.href='index.php'; </script>"; } include('../configuration.php'); $link = mysql_connect("$localhost", "$user", "$password") or die ("Nie można się połączyć"); mysql_select_db ("$data_base") or die ("Nie mozna wybrać bazy danych"); echo mysql_error(); function Check_UsrData($_login,$_pass){ $query = "SELECT * FROM dz_users WHERE nazwa = '".$_login."' AND haslo = '".md5($_pass)."'"; $result = mysql_query ($query); if(!$result) {echo 'Błąd wykonania zapytania.'; return FALSE; } else{ if (mysql_num_rows($result)>0) return TRUE; //przerwij i zwroc informacje o zgodnosci smile.gif else return FALSE; } } function LogOut(){ $_SESSION["usrname"] = ""; $_SESSION["usrpass"] = ""; ReLoad(); } if (!Check_UsrData($_SESSION["usrname"], $_SESSION["usrpass"])) { echo "<form method=\"post\" action=\"$PHP_SELF?a=login\">"; echo "Login: <input name=\"f_login\"><br>"; echo "Hasło: <input name=\"f_passwd\" type=\"password\"><br>"; echo "<input type=\"submit\" value=\"ok\"><br>"; echo "</form>"; } else { echo "ZALOGOWANO :)<br><a href=\"$PHP_SELF?a=logout\">wyloguj</a>"; } if (isset($_GET["a"])){ $act = $_GET["a"]; if ($act == "login") { if (($_POST["f_login"] == "") || ($_POST["f_passwd"]=="")) { echo "podaj dane";} $_SESSION["usrname"] = $_POST["f_login"]; $_SESSION["usrpass"] = md5($_POST["f_passwd"]); ReLoad(); } else if ($act == "logout") { LogOut(); } } ?> Działa - teoretycznie //Zapytanie poprawiłem Ale nie da się zalogować... Poprawne nick i haslo to: unix qwert Użytkownik Marcin edytował ten post 22 maj 2006, 21:35 Jak masz frazę w cudzysłowach (") to nie musisz stosowac kropek dla zmiennych w zapytaniu, bo i tak parser zamieni je na tekst. Spróbuj gdzieś w funkcji Check_UsrData wyświetlić za pomocą echo wartości zmiennych $_login i $_pass, może coś z nimi jest, wtedy coś się wykimini:D Hasło w sesji jeśli jest zahaszowanie, nie potrzeba go haszować drugi raz w zapytaniu w funkcji Check_UsrData(). BTW: lepiej odzwyczaj się pisać $PHP_SELF i np. $act, a zamień na $_SERVER['PHP_SELF'] i $_GET['act'], bo mało serwerów pozwala na takie rzeczy... Jak masz frazę w cudzysłowach (") to nie musisz stosowac kropek dla zmiennych w zapytaniu, bo i tak parser zamieni je na tekst. Spróbuj gdzieś w funkcji Check_UsrData wyświetlić za pomocą echo wartości zmiennych $_login i $_pass, może coś z nimi jest, wtedy coś się wykimini:D Daj tak jak Coldpeer pisał function Check_UsrData($_login,$_pass){ $query = "SELECT * FROM dz_users WHERE nazwa = '$_login' AND haslo = '$_pass'"; $result = mysql_query ($query); if(!$result) {echo 'Błąd wykonania zapytania.'; return FALSE; } else{ if (mysql_num_rows($result)>0) return TRUE; //przerwij i zwroc informacje o zgodnosci smile.gif else return FALSE; } } (...) Poprawiłem wcześniej ;) (post przeczytałem jak wysłałem swój) Wkleiłem jednak twój kod... i bez zmian http://unix.b7.pl/1/index.php Użytkownik Marcin edytował ten post 22 maj 2006, 21:54 A może hasło w bazie masz niezahashowane? Czyli qwert? Podaje kod i zrzut bazy danych dla ktorej kod dziala bez problemu powinines dostosowac do swojej bazy. kod PHP <?php session_start(); function ReLoad(){ echo '<script> location.href='.$_SERVER['PHP_SELF'].'</script>'; } $link = mysql_connect('localhost', 'xx', 'xx') or die ('Nie można się połączyć'); mysql_select_db ('login') or die ('Nie mozna wybrać bazy danych'); echo mysql_error(); function Check_UsrData($_login,$_pass){ $query = 'SELECT * FROM users WHERE login="'.$_login.'" AND pass="'.$_pass.'"'; $result = mysql_query ($query); if(!$result) {echo 'Błąd wykonania zapytania.'; return FALSE; } else{ if (mysql_num_rows($result)>0) return TRUE; else return FALSE; } } function LogOut(){ unset($_SESSION["usrname"]); unset($_SESSION["usrpass"]); session_destroy(); ReLoad(); } if (isset($_GET["a"])){ if ($_GET['a'] == 'login') { if (($_POST['f_login'] == '') || ($_POST['f_passwd']=='')) echo 'Podaj dane'; $_SESSION['usrname'] = $_POST['f_login']; $_SESSION['usrpass'] = $_POST['f_passwd']; ReLoad(); } else if ($_GET['a'] == "logout") LogOut(); } if (!Check_UsrData($_SESSION["usrname"], $_SESSION["usrpass"])) { echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'?a=login"> Login: <input name="f_login"><br> Hasło: <input name="f_passwd" type="password"><br> <input type="submit" value="ok"><br> </form>'; } else { echo 'ZALOGOWANO :)<br><a href="'.$_SERVER['PHP_SELF'].'?a=logout">Wyloguj</a>' ; } ?> Kod SQL -- phpMyAdmin SQL Dump -- version 2.6.0-pl3 -- [url="http://www.phpmyadmin.net"]http://www.phpmyadmin.net[/url] -- -- Host: localhost -- Czas wygenerowania: 19 Maj 2006, 15:11 -- Wersja serwera: 4.0.23 -- Wersja PHP: 5.0.3 -- -- Baza danych: `login` -- -- -------------------------------------------------------- -- -- Struktura tabeli dla `users` -- CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `login` varchar(99) NOT NULL default '', `pass` varchar(32) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=5 ; -- -- Zrzut danych tabeli `users` -- INSERT INTO `users` VALUES (1, 'user1', 'user1'); INSERT INTO `users` VALUES (2, 'user2', 'user2'); INSERT INTO `users` VALUES (3, 'user3', 'user3'); INSERT INTO `users` VALUES (4, 'user4', 'user4'); A może hasło w bazie masz niezahashowane? Czyli qwert? No nie jest zahaschowane... bo coś nie umiem stworzyć zapytania :( to daj w php $query="insert into dz_users values ('user', 'md5('haslo')')"; to daj w php albo w MySQL: insert into dz_users values('user', md5('haslo')); Użytkownik Coldpeer edytował ten post 22 maj 2006, 22:16 Zrobiłem po boryssek'owemu :) i dziala... Ogólnie to Tobie boryssek i mmatheww dziękuje za poświęcenie tyle czasu :) wielkie dzięki... Mam jeszcze jedno pytanie... w efekcie nie mam danych zahashowanych w bazie danych... a jak widać (po tym, że działa) skrypt nie wymaga by w bazie było to hasło zahashowane... 1. Czy jest to bezpieczne? 2. Jak zmienić skrypt, i polecenie do bazy (bo mi cosik nie chce działać to podane przez mmatheww) jesli nie jest to bezpieczne? if (($_POST['f_login'] == '') || ($_POST['f_passwd']=='')) Â echo 'Podaj dane'; $_SESSION['usrname'] = $_POST['f_login']; $_SESSION['usrpass'] = $_POST['f_passwd']; zamień naif (($_POST['f_login'] == '') || ($_POST['f_passwd']=='')) Â echo 'Podaj dane'; $_SESSION["usrname"] = $_POST["f_login"]; $_SESSION["usrpass"] = md5($_POST["f_passwd"]); A SQL zrób tak jak Coldpeer dał, choć moje też winno działać. Apropo bezpieczeństwa. Jeżeli masz hashowane hasła, to osoba która jakimś cudem dostanie się do bazy będzie miała wielkie problemy z odczytaniem hasła. Użytkownik mmatheww edytował ten post 22 maj 2006, 22:29 1) nie jest bezpieczne :P 2) wykonaj zapytanie takie jak napisałem powyżej. A co do kodu to: $_SESSION['usrpass'] = $_POST['f_passwd']; zamień na: $_SESSION['usrpass'] = md5($_POST['f_passwd']); Myślę, że wystarczy :) Apropo bezpieczeństwa. Jeżeli masz hashowane hasła, to osoba która jakimś cudem dostanie się do bazy będzie miała wielkie problemy z odczytaniem hasła. Jeśli nie jest to Kevin Mitnick, to raczej tego nie zrobi :P MD5 jest algorytmem jednostronnym, więc nie ma się co przejmować. Ew. można jeszcze bardziej popracować nad bezpieczeństwem i hashować hash hasła (np. zahaszowane hasło algorytmem md5 zahaszować poprzez sha1) :) Użytkownik Coldpeer edytował ten post 22 maj 2006, 22:31 if (($_POST['f_login'] == '') || ($_POST['f_passwd']=='')) echo 'Podaj dane'; $_SESSION['usrname'] = $_POST['f_login']; $_SESSION['usrpass'] = $_POST['f_passwd']; zamień naif (($_POST['f_login'] == '') || ($_POST['f_passwd']=='')) echo 'Podaj dane'; $_SESSION["usrname"] = $_POST["f_login"]; $_SESSION["usrpass"] = md5($_POST["f_passwd"]); Jeżeli masz hashowane hasła, to osoba która jakimś cudem dostanie się do bazy będzie miała wielkie problemy z odczytaniem hasła. jak chcesz dodac haslo do tabeli, to zamiast "zwyklego" hasla wstaw tam wynik funkcji md5($haslo) :) Thx... tylko jak je zahashowac? :) update dz_users set pass = md5(pass); Takie rozwiązanie nie działa... próbowałem też pokrewanie zmienić... bez rezultatów Po prostu jak miałeś zapytania: INSERT INTO `users` VALUES (1, 'user1', 'user1'); INSERT INTO `users` VALUES (2, 'user2', 'user2'); INSERT INTO `users` VALUES (3, 'user3', 'user3'); INSERT INTO `users` VALUES (4, 'user4', 'user4'); to rób tak: INSERT INTO `users` VALUES (1, 'user1', md5('user1')); INSERT INTO `users` VALUES (2, 'user2', md5('user2')); INSERT INTO `users` VALUES (3, 'user3', md5('user3')); INSERT INTO `users` VALUES (4, 'user4',md5('user4')); A jak już wcześniej dodałeś, to możesz zahaszować hasła (pola 'haslo') zapytaniem, które dałem wyżej: update tabela set haslo = md5(haslo); |
|||
Sitedesign by AltusUmbrae. |