[PHP] Jak poprawić niedziałający skrypt logowania?


(Kszymon0) #1

(Góral105) #2

Pokaż jeszcze jak wygląda twoja baza danych, może tam jest coś źle, bo jeśli chociaż jeden użytkownik działa, to reszta też teoretycznie powinna.

PS Zmień temat na konkretny, bo się moderator "przyczepi" np. na

Problem ze skryptem umożliwiającym logowanie.

(Kszymon0) #3

Jest tabela "nick" a w niej:

20080809133506dr5.th.png


(Tom 85) #4
while($row = mysql_fetch_array($info))

{

extract($row);

if (($_SESSION['us'] == $nick_name) and

    ($_SESSION['pass'] == $nick_pass)) {

    $_SESSION['authuser'] = 1;


    } else {

    echo "Nie masz dostepu do tej strony";

     }

}

pobieraszś tylko pierwszy wiersz funkcją mysql_fetch_array() i niezależnie od wyniku drugiego wiersza już nie pobierasz....

jeszcze nie tak... zaraz poprawie :smiley:

loool nie lubie tak.... jak wiem o co chodzi ale mam pustke w głowie... może ty wymyślisz chodzi o to że u Ciebie funkcja mysql_fetch_array() pobierała pierwszy wiersz i jeśli dane się zgadzały to się logowałeś... jesli nie to wyświetlany był komunikat i funkcją exit wychodziłes ze skryptu więc dalsze wiersze już nie były sprawdzane :slight_smile:


(Kszymon0) #5

a co dac w zamiast exit(); bo nie moge wymyślić


(Tom 85) #6

bo w ogóle źle to robisz.... nie pobieraj wszystkiego z bazy danych tylko wyślij zapytanie czy taki użytkownik jest i czy się hasło zgadza... i odrazu z bazy dostaniesz informacje a nie będziesz musiał tu kombinować z pętlami i tracić nie potrzebnie mocy obliczeniowej serwera :slight_smile:


(Tom 85) #7

(Airborn) #8

w tym Twoim 'skrypcie' jest więcej genialnych pomysłów... oczywiście o czymś takim jak sql injection nigdy nie słyszałeś, prawda?


(Tom 85) #9

pewnie się zdziwisz ale..... słyszałem

$pobierz = "SELECT nick_name FROM nazwa_tabeli WHERE nick_pass = ". addslashes($_POST["eee"]);

(L337 Crew) #10

Też nie do końca:

:arrow: http://shiflett.org/blog/2006/jan/addsl ... ape-string

o stosowaniu słyszałeś?


(Tom 85) #11

ehhh chyba nie myślę dziś co pisze :confused:

o tej funkcji co dałeś linka to nie słyszałem... ale jeśli dobrze zrozumiałem to atak XSS jest możliwy przy zastosowaniu addslashes tylko przy kodowaniu znaków GBK (nie wiem czy są jakieś inne kodowania dwubajtowe) no ale my tu chińskiego kodowania używać nie będziemy, co nie zmienia faktu że strasznie głupi ten kod wcześniej napisałem :smiley:

czyli to zapytanie wyglądało by tak:

$pobierz = "SELECT nick_name FROM nazwa_tabeli WHERE nick_name = '{$_POST['eee']}' AND nick_pass = '{$_POST['www']}'";

mam nadzieje że teraz jest już lepiej...


(Kszymon0) #12

(Tom 85) #13
  1. nie możesz bezpośrednio przesyłać do bazy danych tego co wpisał użytkownik, musisz zastosować funkcję np. addslashes() przed wysłaniem zapytania

  2. w pliku login.php niepotrzebnie zmuszasz interpreter php do przetwarzania tylu informacji. Przecież chcesz wyświetlić zwykły html więc proponuje zrobić tak jak w tym pliku wyżej czyli

    <?php

    instrukcje;

    ?>

    a tu ten formularz html


(L337 Crew) #14

Podstawowa zasada - oprócz dobrego działania kodu,

musi być wydajny, elastyczny, bezpieczny i jak najkrótszy.

Spójrz na plik login.php i powiedz mi ile razy puszczasz do parsera funkcję ... echo :?:

zbadaj czas wykonania takiego skryptu... (już pomijam, że lepiej stosować ' ' zamiast " ")

Nazewnictwo elementów bazy danych jest okropne, nie mówiąc o stosowanych zmiennych, gdzie w ogóle brak logiki...

rejestrowanie sesji wyszło dawno z mody...

http://pl2.php.net/manual/pl/function.m ... string.php

$pobierz = "select * FROM nick WHERE nick_name='$user' AND nick_pass='$passw'";

SELECT * FROM tabela WHERE pole


(Kszymon0) #15

z addslashes() chodzi ci o to?

$pobierz = "select * FROM nick WHERE nick_name='{$user}' AND nick_pass='{$passw}' ";


(L337 Crew) #16

Ojj zerknij w link który podałem, są tam fajne przykłady, analogiczne do Twojego problemu :wink:


(Kszymon0) #17

(Airborn) #18

śmiem przypuszczać, że o UTF-8 kolega również nie słyszał zbyt wiele...