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

PHP - problem z systemem logowania.

Object Storage Arubacloud
0 głosów
388 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 (287,950 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 (287,950 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 (287,950 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 (287,950 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 203 wizyt
pytanie zadane 27 października 2015 w SQL, bazy danych przez cookie Nowicjusz (120 p.)
0 głosów
1 odpowiedź 606 wizyt
0 głosów
1 odpowiedź 311 wizyt
pytanie zadane 2 października 2016 w SQL, bazy danych przez rejzer Użytkownik (680 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

61,950 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...