dynamiczne wyświetlenie błędu logowania

0

Witam
Mam taki formularz logowania w pliku logowanie.tpl:

    
<form action="logowanie.php" method="post">
          <p style="color: red;" id="label">{$etykieta}</p><br/><br/>
          Login: <input type="text" name="input_login" /><br /><br /><br/>
          Hasło: <input type="password" name="input_password" /><br /><br /><br/>
          <input type="submit" value="Zaloguj" />
</form>

i obsługa w logowanie.php

   
if(isset($_POST['input_login']) && isset($_POST['input_password'])){
       
       $login = $_POST['input_login'];
       $haslo = $_POST['input_password'];
       //połączenie do bazy, zapytanie itp...   
       
       while ($row = mysqli_fetch_assoc ($sql)){
          if($row['Login'] == $login && $row['Haslo'] == $haslo){
             $_SESSION['logged'] = 1;
             header ("Location: index.php");
          }
          else{
          
             $smarty->assign("etykieta", "Nie poporawny login i/lub hasło");

                            /*
                           echo "
                 <script language='javascript'>
                       document.getElementById('label').style.visibility = 'visible';
             </script>";
                           */
          }
       }
    }

i teraz chciałbym aby napis o niepoprawnym loginie/haśle pojawiał się tylko wtedy gdy hasło jest źle wpisane a nie aby pojawiał się zawsze jak do tej pory. Chciałbym aby to odbywało się też dynamicznie np tak jak próbowałem umieścić w else skryptu JS i wtedy w formularzu podawałem napis - ale to nie działało. Więc podpowiedzcie jak mam to zrobić.

0

Na wstępie uwaga: po co pobierasz wszystkie dane o loginach i hasłach z bazy i przetwarzasz je w pętli? Przynajmniej tak to wygłąda. Procedura sql powinna zwrócić ci true jeśli znalazła dopasowanie i false jeśli nie.
I zdaje się, że to jest problem. Bo załóżmy ze dla pierwszego wiersza zgadza się login i hasło, więc logujesz usera, ale dla kolejnych wierszy (login-pass) warunek nie jest spełniony, dlatego wykonuje się else.

0

Zrobiłam tak:

if(isset($_POST['input_login']) && isset($_POST['input_password'])){
	
	$login = $_POST['input_login'];
	$haslo = $_POST['input_password'];

	$sql = $db->query("select * from user where Login = '$login' and Haslo = '$haslo'");	
	if (mysqli_num_rows($sql) > 0){

		$row = mysqli_fetch_assoc($sql);

		$_SESSION['logged'] = 1;
		header ("Location: index.php");
	}else{
		$smarty->assign("etykieta", "Nieprawidłowy login i/lub hasło");
	}
}

i powiedzmy, że działa ;) Ale jeszcze tylko takie pytanie. Ta metoda jest bezpieczniejsza od poprzedniej czy tak? (login i hasło sa spr. w zapytaniu) o to chodziło? Bo przetwarzanie loginów i haseł w pętli nie jest chyba bezpieczne - nie wiem czy dobrze myślę?

0

Przetwarzając dane w php w pętli najpierw musiałaś je dostać z bazy, więc komunikacja między aplikacją a bazą jest miejscem gdzie potencjalnie narażasz się na podsłuchanie. Poza tym w aplikacji masz w czystej postaci wrażliwe dane, które na dodatek nie są ci tam do niczego potrzebne. I jeszcze kwestia wydajności, jeśli masz kilka tysięcy użytkowników to przesyłanie takiego dużego zbioru danych do aplikacji jest tylko zapychaniem łącza oraz pamięci.

Tak taka metoda jest bezpieczniejsza i wydajniejsza.

Ale... robisz to w nie do końca poprawny sposób. Nie zwracaj wszystkich kolumn. Wystarczy ci informacja że jest ok, czyli wystarczy select 1 as UserExist from ...

0

No dobra tylko jak zrobię tak jak mówisz czyli select 1 as .... (zwraca mi 1) to jak mam potem pobrać np login (jego wartość), potrzebne jest mi to do sesji, bo w ten sposób nie działa:

$_SESSION['who'] = $row['Login'];

natomiast tak:

 $_SESSION['who'] = $row['UserExist'];

wyświetla mi tylko 1, a ja chce nazwę loginu.

0

aneta, nie rób takich zapytań, bo zastanów się co się stanie jak podam nazwę użytkownika: '; drop table user;--

0

no co zwróciło błąd w postaci: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:...

a zapytanie zrobiam tak:

$sql = $db->query("select '$login' as UserExist from user where Login = '$login' and Haslo = '$haslo'");	 

a żeby wyciągnąć login do sesji to zrobiłam tak:

$_SESSION['who'] = $row['UserExist'];

A więc jak mam zrobić to zapytanie bo raz jest ok a raz nie?

0

hmm no tak, skorzystałam z addslashes(); i po sprawie ;)

0

Mi generalnie chodziło o to żebyś nie zwracała zbędnych kolumn, czyli m.in. hasła do aplikacji.
Tak jak sobie poradziłaś jest prawie dobrze :) tzn. po pierwsze faktycznie to na co zrwócił uwagę krwq, nigdy nie ufaj danym wprowadzanym przez użytkownika i nie należy ich używać do klejenia query. Jest to prosta droga do zrobienia sobie kuku
Login i hasło przekazujesz jako parametr (po uwzględnieniu informacji kwrq mam nadziję że tak będziesz robiła), ale zwrócić powinnać kolumnę, a nie znowu wartość zmiennej, czyli

 $sql = $db->query("select Login from user where Login = '$login' and Haslo = '$haslo'"); 

lub tak jak ci napisałem, a następnie:

if (mysqli_num_rows($sql) > 0){
  $row = mysqli_fetch_assoc($sql);
  if ($row['UserExist'] == 1)
    $_SESSION['who'] = $login; // bo skoro login i pass się w bazie zgadzają, tzn. że w zmiennej login mamy poprawną wartość, taką jak w bazie
  else
    // error, błędny login lub hasło
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1