ďťż
Podstrony
|
telcocafeHej,mam problem. mam takie oto zapytanie, które działa w konsoli poprawnie. SELECT login, pass FROM userzy WHERE login = 'admin' and pass = 'admin' Mam w tabeli własnie taki rekord i znajduje go. Ale chcę zastosować cos takiego w prowizorycznym skrypcie logowania. $connection = mysql_connect('localhost', 'root', '') or die ('Nie można połączyć z db'); $db = mysql_select_db('users', $connection); $zapytanie = "SELECT login, pass FROM userzy WHERE login = " .$login. " and pass = " .$pass; $wynik = mysql_query($zapytanie); if (!$wynik) { echo 'Nie można wykonać zapytania' ; exit; } $wiersz = mysql_fetch_row($zapytanie); $ile = $wiersz[0]; if ($ile>0) { echo 'Zalogowano pomyślnie'; } else { echo 'Podano złe dane'; } Ciągle wyswietla mi błąd, że nie można wykonać zapytania. Jaki powinien byc prawidłowy zapis tego zapytania? Czy cudzysłowy mają jakieś znaczenie? Powiedzmy, że wprowadzam login1 or 1=1-- x lub admin or 1=1-- xMam teraz pewne uprawnienia (jestem adminem?). SQL, PHP jak i wiele innych języków programistycznych wymaga obejmowania ciągów znaków w znaki takie jak cudzysłowy czy apostrofy. Twój przykład jest nieoptymalny, jednak można go przerobić tak:$zapytanie = "SELECT login, pass FROM userzy WHERE login = $login and pass = $pass";Jednak wciąż nie działa, prawda? Przerabiamy go tak:$zapytanie = "SELECT login, pass FROM userzy WHERE login = '$login' and pass = '$pass'";Teraz kod działa, ale jest nieoptymalny. Używamy apostrofów zamiast cudzysłowów:$zapytanie = 'SELECT login, pass FROM userzy WHERE login = "'.$login.'" and pass = "'.$pass.'"';Mamy teraz optymalne i działające rozwiązanie. Powiedzmy, że serwer ma wyłączone magiczne cudzysłowy (magic quotes) i loguję się jakoadmin" or 1=1-- xCo się dzieje? Jestem adminem! Brakuje pewnej funkcji, która poprawia bezpieczeństwo - mysql_real_escape_string lub addslashes. Przed sprawdzeniem, czy dane są prawidłowe przetwarzamy je:if (!ini_get('magic_quotes_gpc')) { $login = addslashes($login); $haslo = addslashes($haslo); }Zastanawia mnie jednak to skąd się biorą zmienne $login i $haslo. Używasz register globals czy może wcześniej pobrałeś je z tablicy POST? Dodatkowo w bazie przechowujesz hasła w sposób jawny, więc jeśli ktoś by przechwycił Twoją bazę, to nie miałby problemów z odczytaniem haseł. Hasła w bazie musisz kodować, np.:$zapytanie = 'SELECT login, pass FROM userzy WHERE login = "'.$login.'" and pass = password("'.$pass.'")';Mam nadzieję, że się nie przestraszyłeś, ale jeśli się zabierasz do takich rzeczy, to powinieneś wiedzieć, że są użytkownicy sieci, którzy nie są mili i lubią testować. zminne oczywiscie przekazane metodą POST z formularza, nie wkleiłem całego kodu, za szyfrowanie haseł dopiero będe się zabierał, najpierw muszę opanować zapytania. mimo wszystko skrypt nie działa: Podano złe dane Wkleję ci całość, zerknij okiem: <?php $login = $_POST['login']; $pass = $_POST['pass']; if (!get_magic_quotes_gpc()) { $login = addslashes($login); $pass = addslashes($pass); } if(!isset($_POST['login']) && !isset($_POST['pass'])) { ?> <h1> Zaloguj się !!! </h1> <p>Ta strona jest zastrzeżona</p> <br /> <form name="zaloguj" action="login.php" method="post"> <table border="1"> <tr> <td><p>Login: </p> <input name="pass" type="text" value="" /></td> </tr> <tr> <td> <p>Hasło: </p> <input type="password" name="pass" value="" /> </td> </tr> <tr> <td> <input type="submit" value="Zaloguj" /> </td> </tr> </table> </form> <?php } else { $connection = mysql_connect('localhost', 'root', '') or die ('Nie można połączyć z db'); $db = mysql_select_db('users', $connection); $zapytanie = 'SELECT login, pass FROM userzy WHERE login = "'.$login.'" and pass = "'.$pass.'"'; $wynik = mysql_query($zapytanie); if (!$wynik) { echo 'Nie można wykonać zapytania' ; exit; } $wiersz = mysql_fetch_row($wynik); $ile = $wiersz[0]; if ($ile>0) { echo 'Zalogowano pomyślnie'; } else { echo 'Podano złe dane'; } } ?> Użytkownik wyatt edytował ten post 21 maj 2010, 19:17 $zapytanie = 'SELECT CONT(*) AS ile FROM userzy WHERE login = "'.$login.'" and pass = "'.$pass.'"'; I później coś takiego $wiersz = mysql_fetch_row($wynik); if (isset($wiersz[0]) and $wiersz[0]['ile'] > 0) { print 'ok'; } Pisane z palca ;) literówka, powinno być COUNT :-) ale dzięki, działa ^_^ no to będe miał co dłubac na nocce w pracy. |
|||
Sitedesign by AltusUmbrae. |