• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP - problem z systemem logowania.

42 Warsaw Coding Academy
0 głosów
562 wizyt
pytanie zadane 30 grudnia 2016 w PHP przez nielotweb Bywalec (2,240 p.)
edycja 30 grudnia 2016 przez nielotweb

Zacząłem edukować się w PHP'ie, więc zacząłem robić system logowania i mam mały problem.. otóż wszystko działa ładnie tylko gdy pole login i password jest puste (czyli nie ma uzupełnionych pól) i nacisnę na button to się tak jakby loguje i przekierowuje na plik serwis.php. I nie wiem gdzie popełniłem błąd, byłbym wdzięczny jakby mi ktoś mi pomógł i wytłumaczył. 

Oraz jeśli ma ktoś czas i chęci sprawdził cały kod, czy się w ogóle nadaje i jest 'dobrze' napisany.. z góry dziękuję!

 

Plik index.php

<?php

session_start();

if((isset($_SESSION['logged'])) && ($_SESSION['logged']==true)) {
    header('Location: serwis.php');
}


?>
<!DOCTYPE HTML>
<html lang="pl">
<head>
  <title>Strona www...</title>
  <meta charset="utf-8" />
  <style>
  #errorlogin {
    background: #A61212;
    color: #fff;
    padding: 12px;
    box-shadow: 1px 4px 7px #000;
    width: 300px;
    max-width: 300px;
    border-radius: 5px;
    margin-top: 15px;
  }
  </style>

</head>
<body>

   <form action="login.php" method="post">
     <input type="text" name="user" /><br />

     <input type="password" name="pass" /><br />

     <input type="submit" value="Zaloguj" name="submit" />
   </form>

   <?php

    if(isset($_SESSION['Error_1'])) {
     echo $_SESSION['Error_1'];
    }

    ?>

</body>
</html>

Plik Login.php

<?php

session_start();

if ((!isset($_POST['user'])) || (!isset($_POST['pass'])))
{
  header('Location: index.php');
  exit();
}

  require_once "connect.php";

  $baza = @new mysqli($host, $db_user, $db_password, $db_name);

if(isset($_POST['submit'])) {

  $user = mysqli_real_escape_string($baza, $_POST['user']);
  $pass = mysqli_real_escape_string($baza, $_POST['pass']);
  $user = htmlentities($user, ENT_QUOTES, "UTF-8");
  $pass = htmlentities($pass, ENT_QUOTES, "UTF-8");

    if ( $baza->connect_error ) {
      die( 'Connect error: ' . $baza->connect_errno . ' : ' . $baza->connect_error );
    } else {

        $sql = "SELECT * FROM users WHERE user='$user' AND pass='$pass'";
        $result = @$baza->query($sql);
        $row = mysqli_fetch_array($result);

        if($row['user'] == $user && $row['pass'] == $pass){

          $_SESSION['logged'] = true;
          $_SESSION['user'] = $row['user'];
          $_SESSION['pass'] = $row['pass'];
          $_SESSION['id'] = $row['id'];
          $_SESSION['email'] = $row['email'];
          $_SESSION['adminid'] = $row['adminid'];

          if((empty($user)) || (empty($pass))) {
            header('Location: index.php');
          } else {
            header('Location: serwis.php');
          }


          unset($_SESSION['Error_1']);


        }
        else {
          $_SESSION['Error_1'] = "<div id='errorlogin'>Error_1: Błędne dane logowania!</div>";
          header('Location: index.php');
        }

   }

$baza->close();
}



?>

PLIK serwis.php

<?php

session_start();

if (!isset($_SESSION['logged']))
{
  header('Location: index.php');
  exit();
}

if((isset($_SESSION['user'])) || (isset($_SESSION['pass'])) ) {
  if($_SESSION['adminid'] == 1) {
    header('Location: admin-profil.php');
  }
}

echo "Witaj drogi graczu! ".$_SESSION['user']. " ";
echo $_SESSION['id'];
echo $_SESSION['email'];
echo "<a href='logout.php'>Wyloguj się</a>";

?>

PLIK admin-profil.php

<?php

session_start();

if((isset($_SESSION['user'])) || (isset($_SESSION['pass'])) ) {
  if($_SESSION['adminid'] == 0) {
    header('Location: serwis.php');
  }
}

if (!isset($_SESSION['logged']))
{
  header('Location: index.php');
}

echo "Witaj Adminie ".$_SESSION['user']. " !<br />";
echo "Twoj email: ".$_SESSION['email']. "<br />";
echo "Klik i sie wylogowujesz! <a href='logout.php'>Wyloguj się</a>";

?>


 

1
komentarz 30 grudnia 2016 przez Arkadiusz Waluk Ekspert (290,090 p.)

Oraz jeśli ma ktoś czas i chęci sprawdził cały kod, czy się w ogóle nadaje i jest 'dobrze' napisany..

Szczerze mówiąc powiedziałbym, że skrypt ten jest niestety kiepski. 

$sql = "SELECT * FROM users WHERE user='$user' AND pass='$pass'";

Takie wstawianie danych do zapytania jest niebezpieczne - nie ma zabezpieczenia przed sql injection. Co prawda używasz wcześniej jakichś funkcji do zabezpieczenia, ale całkowitą pewność miałbyś przy użyciu bindowania - wtedy zapytanie do bazy oraz dane idą osobno i nie ma możliwości wykonania takiego ataku.

$result = @$baza->query($sql);

@ ukrywają błędy, czyli są złe - zamiast błędy ukrywać lepiej je zobaczyć i obsłużyć, nie wyciszyć i zignorować.

Poza tym przechowujesz w bazie normalnie zapisane hasło. Tak się nie powinno robić (powiedziałbym nawet że absolutnie nie wolno), hasło powinno być zahaszowane (patrz password_hash i password_verify).

if ((!isset($_POST['user'])) || (!isset($_POST['pass'])))

Kosmetycznie: nie potrzebujesz tutaj aż tylu nawiasów, wystarczyłoby spokojnie zrobić tak: (albo nawet możesz spróbować połączyć to w jedno użycie isset)

if (!isset($_POST['user']) || !isset($_POST['pass']))

Ogólnie znów kosmetycznie: raz stosujesz polskie nazewnictwo a raz angielskie - proponowałbym trzymać się jednego, oczywiście angielskiego.

komentarz 30 grudnia 2016 przez nielotweb Bywalec (2,240 p.)
Jeśli chodzi o zapytanie z bazy, to wiem - będę musiał to zmienić, tak jak zrobiłem niby działa bo sam próbowałem 'się włamać', ale na pewno poprawię.

Jeśli chodzi o hashowanie haseł to wiem że należy i powinno hashować hasła ale dopiero się uczę PHP i zrobię to jak do tego momentu cały skrypt będzie działać dobrze, potem ogarnę rozdziałek z hashowaniem haseł :P

Od teraz będę się starał kosmetycznie poprawiać te kody, no i masz racje z nazewnictwem, sam jestem świadom że połowę po angielsku nadaje a połowę po polsku.

Dzięki za spostrzeżenia!

2 odpowiedzi

+1 głos
odpowiedź 30 grudnia 2016 przez Assasz Nałogowiec (30,460 p.)
wybrane 30 grudnia 2016 przez nielotweb
 
Najlepsza

Spróbuj zmienić warunek ifa z pliku login.php na taki:

if ((!isset($_POST['user']) || $_POST['user']==null) || (!isset($_POST['pass'])  || $_POST['pass']==null))

 

komentarz 30 grudnia 2016 przez nielotweb Bywalec (2,240 p.)
Działa świetnie! A tyle nad tym myślałem, a o tym nie pomyślałem! :P Dzięki wielkie!

Mam jeszcze pytanko. Co twoim zdaniem mógłbym w tym skrypcie zmienić? Lub co jest źle zrobione?
komentarz 30 grudnia 2016 przez Assasz Nałogowiec (30,460 p.)
Na pewno można wiele zmienić w tym skrypcie aby był lepszy, lecz jak sam napisałeś, dopiero zaczynasz swoją przygodę z PHP więc jest jak najbardziej w porządku (w końcu to skrypt od Zelenta o ile się nie mylę). W miarę postępów sam będziesz wiedzieć, jak to udoskonalić. W każdym razie istotnych błędów nie widzę.
komentarz 30 grudnia 2016 przez HaKIM Szeryf (87,590 p.)

Na pewno można wiele zmienić w tym skrypcie aby był lepszy, [...] dopiero zaczynasz swoją przygodę z PHP więc jest jak najbardziej w porządku (w końcu to skrypt od Zelenta o ile się nie mylę).

Aż tak to bym nie przesadzał z kunsztem Zelenta co do tego skryptu. wink

0 głosów
odpowiedź 30 grudnia 2016 przez bartek7910 Obywatel (1,980 p.)

W warunku z pliku login.php brakuje nawiasów

Zamiast 

if($row['user'] == $user && $row['pass'] == $pass)

powinno być 

if(($row['user'] == $user) && ($row['pass'] == $pass))

 

komentarz 30 grudnia 2016 przez Arkadiusz Waluk Ekspert (290,090 p.)
Dlaczego? Jaka jest w tym różnica?
komentarz 30 grudnia 2016 przez bartek7910 Obywatel (1,980 p.)
Kiedyś też tak miałem zrobiony warunek i wyrzuciło mi błąd. Możliwe że to było jeszcze w jakiejś starej wersji php, ale generalnie od tamtej pory stosuje zapis tak jak podałem. Jeśli wprowadziłem w błąd to przepraszam.
komentarz 30 grudnia 2016 przez Arkadiusz Waluk Ekspert (290,090 p.)
Zasadniczo nie jest to żaden błąd, ale nie jest to też rozwiązanie problemu kolegi - obydwa zapisy zadziałają tak samo w tym przypadku: https://3v4l.org/4DNJ2

Nawiasy mogłyby być potrzebne w przypadku np. użycia AND i OR w jednym ifie, wtedy przez ich brak kod może zostać różnie zinterpretowany, ale w podanym wyżej przypadku nie widzę sensu ich użycia i uważam, że to tylko dodatkowe niepotrzebne znaki.
komentarz 31 grudnia 2016 przez bartek7910 Obywatel (1,980 p.)
Czyli w przypadku gdy używam tylko and lub tylko or to dodatkowe nawiasy są zbędne tak?
komentarz 31 grudnia 2016 przez Arkadiusz Waluk Ekspert (290,090 p.)
Nie chciałbym odpowiedzieć jednoznacznie, że "tak i tylko wtedy" bo mogę teraz nie mieć w głowie jakichś sytuacji (albo po prostu nie wiedzieć że takie są), ale ogólnie przy bardziej zaawansowanym warunku i mieszaniu operatorów zdarzało mi się używać nawiasów.

Podobne pytania

0 głosów
3 odpowiedzi 290 wizyt
pytanie zadane 27 października 2015 w SQL, bazy danych przez cookie Nowicjusz (120 p.)
0 głosów
1 odpowiedź 738 wizyt
0 głosów
1 odpowiedź 390 wizyt
pytanie zadane 2 października 2016 w SQL, bazy danych przez rejzer Użytkownik (680 p.)

93,381 zapytań

142,381 odpowiedzi

322,536 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...