Nadpisanie sesji?

0

Witam. Mam pewien problem, zrobiłem system logowania dodałem konto root. Po zalogowaniu stworzyłem panel gdzie można dodawać nowych użytkowników i w momencie kiedy stworze nowego usera to mnie automatycznie na niego przelogowuje. Tak mam tylko na hostingu bo na serwerze lokalnym jestem nadal na koncie na którym byłem wczesniej zalogowany. Niżej pokaże fragmenty tego kodu.

  1. Strona logowania, sprawdza wpisane dane z danymi z bazy danych, jeżeli konto istnieje to tworze sesje tego uzytkownika i przekierowuje do panelu admina.
    $result = $mysqli->query('SELECT * FROM users ORDER BY id');
    while( $check_login = mysqli_fetch_array($result) ) // przypisanie do $check_login pojedyńczego wiersza tabeli users
    {
      if( $_POST['login']==$check_login['login'] && $_POST['password']==$check_login['password'] ) // sprawdzenie wpisnych danych z danymi z tabeli users
      {
        $_SESSION['logged']=true;
        $_SESSION['user_id']=$check_login['id'];
        $_SESSION['login']=$check_login['login'];
        $_SESSION['permissions']=$check_login['permissions'];
        Header("Location: panel/index.php");
      }
    }
  1. Zwykly formularz który wysyla dane do pliku add_user.php
        <div class="col-12 col-lg-5 mr-5 add_user_form">
            <form action="database/add_user.php" method="post">
              <h4>Dodaj nowego użytkownika</h4>
              <label for="add_user_login">Login: </label>
              <input id="add_user_login" class="form-control form-users" type="text" name="add_user_login" placeholder="Nazwa użytkownika">
              <label for="add_user_password">Hasło: </label>
              <input id="add_user_password" class="form-control form-users" type="password" name="add_user_password" placeholder="Hasło">
              <label for="add_user_permissions">Uprawnienia:  </label>
              <select id="add_user_permissions" name="add_user_permissions">
              <option value="2" disabled="disabled">root</option>
              <option value="1">pracownik</option>
            </select>
            <br>
            <?php
              if($_SESSION['permissions']==2)
              {
                echo '<input type="submit" class="btn btn-success add_user_button" name="add_user" value="Utwórz użytkownika">';
              }
              else
              {
                echo '<input type="submit" disabled="disabled" class="btn btn-success add_user_button" name="add_user" value="Utwórz użytkownika">';
              }
            ?>
          </form>
          </div>
  1. Ostatni plik, łączy sie z bazą danych i dodaje nowego uzytkownika do bazy po czym przekierowuje z powrotem do panelu admina
<?php
session_start();
if(isset($_SESSION['logged']) && $_SESSION['logged']==true && isset($_SESSION['permissions']) && $_SESSION['permissions']==2)
{
    if(isset($_POST['add_user']))
    {
      if(!empty($_POST['add_user_login']) && !empty($_POST['add_user_password']))
      {
        include('db_connect.php');

        $login = $_POST['add_user_login'];
        $password = $_POST['add_user_password'];
        $permissions = $_POST['add_user_permissions'];

        $statement = $mysqli->prepare('INSERT users (login, password, permissions) VALUES(?,?,?)');
        $statement->bind_param("ssi", $login, $password, $permissions);
        $statement->execute();
        $statement->close();
        Header('Location: ../users.php');
      }
      else
      {
        echo "Nie mozesz wprowadzic pustych danych :c";
      }
    }
}
else {
  echo "nie masz uprawnien";
}

 ?>

Nie rozumiem czemu następuje przelogowanie na nowo utworzonego usera. Sesja nigdzie nie jest nadpisywana. Dodam jeszcze, że na localhost działa normalnie. Jak ktoś masz jakieś propozycje rozwiązania problemu to byłbym wdzięczny, z góry dzięki :) Pozdrawiam

1

nie prościej zamiast całej tej pętli zrobić po prostu

$login = $_POST['login'];
$pass = $_POST['password'];
//tu jeszcze sprawdzić czy $login i $pass nie są puste, czy nie ma żadnego SQL injection (a najlepiej użyć parametrów)
$mysqli->query("SELECT * FROM users WHERE login= '$login' AND password = '$pass'");

INSERT users a nie powinno być INSERT INTO users

co masz w users.php?

0

Z sql mało umiem i nie znam wszystkich zapytań ;d Dzięki poprawie to bo faktyczniej dużo prościej. A wracając do tematu to users.php Jest zlepkiem elementów statycznych panelu i samego contentu opcji "Użytkownicy"

users.php

<?php
session_start();
if(!empty($_POST['logout']))
{
  unset($_SESSION['logged']);
  Header('Location: ../index.php');
}

if(isset($_SESSION['logged']) && $_SESSION['logged']==true)
{
?>

<!DOCTYPE html>
<html lang="pl" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Panel administratora</title>
    <link rel="stylesheet" href="../../css/bootstrap/bootstrap.min.css">
    <link rel="stylesheet" href="css/prod/styles.css">
    <link href="https://fonts.googleapis.com/css?family=Lato:400,700|Roboto:400,500&amp;subset=latin-ext" rel="stylesheet">
  </head>
  <body>
<!-- .............................TOP NAV................................... -->
    <?php include('modules/nav.php'); ?>
<!-- .............................CONTENT................................... -->

    <main class="content">
      <div class="container-fluid">
        <div class="row">
          <?php include('modules/menu.php'); ?>
          <?php include('modules/users.php'); ?>
        </div>
      </div>
    </main>

<!-- .............................CONTENT................................... -->



    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
  </body>
</html>
<?php
}
else
{
  echo "Nie masz uprawnien do przegladania tej strony";
}
 ?>

A a ten content wygląda tak:

<?php if(isset($_SESSION['logged']) && $_SESSION['logged']==true) { ?>
<div class="col-12 col-xl-10 menu-content">
  <div class="menu-container">
    <div class="container-users">
      <div class="container-fluid">
        <div class="row">
          <!-- .......................DODAWANIE UZYTKOWNIKOW................................. -->
          <div class="col-12 col-lg-5 mr-5 add_user_form">
            <form action="database/add_user.php" method="post">
              <h4>Dodaj nowego użytkownika</h4>
              <label for="add_user_login">Login: </label>
              <input id="add_user_login" class="form-control form-users" type="text" name="add_user_login" placeholder="Nazwa użytkownika">
              <label for="add_user_password">Hasło: </label>
              <input id="add_user_password" class="form-control form-users" type="password" name="add_user_password" placeholder="Hasło">
              <label for="add_user_permissions">Uprawnienia:  </label>
              <select id="add_user_permissions" name="add_user_permissions">
              <option value="2" disabled="disabled">root</option>
              <option value="1">pracownik</option>
            </select>
            <br>
            <?php
              if($_SESSION['permissions']==2)
              {
                echo '<input type="submit" class="btn btn-success add_user_button" name="add_user" value="Utwórz użytkownika">';
              }
              else
              {
                echo '<input type="submit" disabled="disabled" class="btn btn-success add_user_button" name="add_user" value="Utwórz użytkownika">';
              }
            ?>
          </form>
          </div>
          <!-- .......................TABELA UZYTKOWNIKOW................................. -->
          <div class="col-12 col-lg-6 add_user_form">
            <?php
              include('../database/db_connect.php');
              $result = $mysqli->query('SELECT id,login,permissions FROM users ORDER BY id');
            ?>
            <h4>Lista użytkowników</h4>
            <table class="table table-striped">
              <thead>
                <tr>
                  <th scope="col">#</th>
                  <th scope="col">Login</th>
                  <th scope="col">Uprawnienia</th>
                  <th scope="col">Usuń</th>
                </tr>
              </thead>
              <tbody>
                <?php
                while( $users_list = mysqli_fetch_array($result) )
                {
                  if($users_list['permissions']==1) {$users_list['permissions']='pracownik';}
                  elseif($users_list['permissions']==2) {$users_list['permissions']='ALL';}
                  echo '<tr>';
                  echo '<th scope="row">'.$users_list['id'].'</th>';
                  echo '<td>'.$users_list['login'].'</td>';
                  echo '<td>'.$users_list['permissions'].'</td>';
                  if($_SESSION['permissions']==2)
                  {
                    echo '<td><a href="database/user_delete.php?id='.$users_list["id"].'"><i class="fas fa-times text-danger"></i></a></td>';
                  }
                  else
                  {
                    echo '<td><a href="#"><i class="fas fa-times text-danger"></i></a></td>';
                  }
                  echo '</tr>';
                }
                ?>
              </tbody>
            </table>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<?php }
else
{
echo "Nie masz uprawnien do przegladania tej strony";
}
?>

Zebyś miał lepszy wgląd na sytuacje to dam link do stronki: http://wasweb.xaa.pl/cms_v1_server/admin/

haslo roota: 12345
login wiadomo: root

1

nigdzie nie podałeś kodu odpowiedzialnego za ten kawałek
4p.png

0

To jest zwykły button który usuwa sesje 'logged' a nazwa zalogowanego usera jest przy logowaniu pobierana z bazy, zapisywana do sesji a potem wyświetlana w menu

<span class="who_logged"><i class="fas fa-user"></i> [<?php echo $_SESSION['login']; ?>]</span>
        <form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
          <input class="logout_button form-control" type="submit" name="logout" value="Wyloguj">
        </form>
1

nie chodzi o przycisk ale o to jak wyświetlasz zalogowanego. Skoro zalogowanego bierzesz wprost z sesji - <?php echo $_SESSION['login']; ?> a w kodzie, który podałeś masz tylko jedno przypisanie do $_SESSION['login'] - $_SESSION['login']=$check_login['login']; to błąd musisz mieć gdzieś indziej

0
        $_SESSION['logged']=true;
        $_SESSION['user_id']=$check_login['id'];
        $_SESSION['login']=$check_login['login'];
        $_SESSION['permissions']=$check_login['permissions'];

To są wszystkie sesje jakie tworze po zalogowaniu, a jedyny unset jest w buttonie "wyloguj", nigdzie nie nadpisuje sesji. Nie wiem jakim cudem to sie przelogowuje, sprawdzalem juz wszystko :/ szczególnie, że na local działa to może wina nie leży w kodzie?

1

wyszukaj sobie we wszystkich plikach projektu $_SESSION['login'] - może masz gdzieś przypisanie o którym zapomniałeś - ja tu innego nie widzę

0

Nie mam, sesje tworze tylko na stronie z logowaniem, a inne pliki panelu jedynie sprawdzają istnienie sesji i wartość. Zaczyna mi brakować pomysłów, każdy plik analizowałem linijka po linijce i według mnie nie ma tam błędu

1

może ktoś mądrzejszy przyjdzie i znajdzie błąd bo jeśli mówisz, że przypisanie do $_SESSION['login'] masz tylko w jednym miejscu to ja nie wiem :).

BTW. zrób sobie co jakiś czas np. var_dump($_SESSION['login']); i zobacz gdzie się zmienia user

0

No właśnie w jednym miejscu, a się zmienia xd dziwne i niezrozumiałe dla mnie, ale dzięki :) jutro podebuguje, może coś znajdę

0

@abrakadaber:

Juz widze gdzie jest przeskok, w pliku który dodaje usera do bazy

include('db_connect.php');
        var_dump($_SESSION['login']);     // Jeszcze poprawny user
        $login = $_POST['add_user_login'];
        var_dump($_SESSION['login']);   // Przeskok na nowego
        $password = $_POST['add_user_password'];
        $permissions = $_POST['add_user_permissions'];
        $statement = $mysqli->prepare('INSERT users (login, password, permissions) VALUES(?,?,?)');
        $statement->bind_param("ssi", $login, $password, $permissions);
        $statement->execute();
        $statement->close();

@Edit
Problem był w nazwie zmiennej $login, po zmianie już nie przelogowuje. Nie rozumiem troche tego błędu, ale ważne, że problem rozwiązany. Jak ktoś wie czemu tak sie działo przez nazwe zmiennej to byłbym wdzięczny jakby mi wyjaśnił :)

@Edit2
To samo dotyczy nazw:

        $password = $_POST['add_user_password'];
        $permissions = $_POST['add_user_permissions'];
1

Masz włączone register_globals i tak to właśnie działa. Tak ogólnie powineneś sobie to ustawić na off i dziwne, że to w ogóle jest włączone na Twoim serwerze.

0

@sabat24:
Faktycznie, dzięki :)

0

Masz zly nawyk nie stosowania nawiasow w warunkach. Czasami to wazne jest.

if(isset($_SESSION['logged']) && $_SESSION['logged']==true && isset($_SESSION['permissions']) && $_SESSION['permissions']==2)

a powinno byc

if((isset($_SESSION['logged']) && $_SESSION['logged']==true) && (isset($_SESSION['permissions']) && $_SESSION['permissions']==2))

To session = true zupelnie niepotrzebne jest. Poza tym stosuj

session_regenerate_id();
0

@hopaj:

Nie wiem czemu uważasz to za zły nawyk. Sprawdzam warunek po warunku, nie chciałem tego grupować i dodawać kolejne 4 nawiasy bo według mnie traci to na przejrzystości.
Wiem, że $_SESSION['logged']==true jest niepotrzebne, ale na wszelki wypadek wolałem dodać. A session_regenerate_id() to gdzie dodać? W którym momencie mam regenerować nowe id sesji? Przyznam, że nie wiedziałem o tej funkcji wcześniej ;D

0
Codin napisał(a):

@hopaj:

Nie wiem czemu uważasz to za zły nawyk. Sprawdzam warunek po warunku, nie chciałem tego grupować i dodawać kolejne 4 nawiasy bo według mnie traci to na przejrzystości.
Wiem, że $_SESSION['logged']==true jest niepotrzebne, ale na wszelki wypadek wolałem dodać. A session_regenerate_id() to gdzie dodać? W którym momencie mam regenerować nowe id sesji? Przyznam, że nie wiedziałem o tej funkcji wcześniej ;D

Zly nawyk. To nie chodzi o przejzystosc tylko czasami moze sie zdarzyc ze zle bedzie dzialac. To jakby warunek w warunku a nie stosowanie nawiasow moze sie zle skonczyc. Wlasnie nawet lepiej to widac bo tak to wszystko pozlewane jest. Nalezy grupowac.

session_regenerate_id();

stosuj tuz za

session_start();

Jak dalej nie znalazles bledu to wytlumacz problem bo malo z tego rozumiem. Jesli przypsales sesji wartosc to ona sama z siebie nie moze nadpisac niczym bo niby z jakiego powodu. Pamietaj tez ze jak zarejestrowales sesje na adresie z www.costam.pl i potem chcesz ja wywolac bez przyrostka www to sie posypie.

0

@hopaj:
Problem juz rozwiązany czytaj wyżej odpowiedzi ;)

Sabat24 napisał:
"Masz włączone register_globals i tak to właśnie działa. Tak ogólnie powineneś sobie to ustawić na off i dziwne, że to w ogóle jest włączone na Twoim serwerze."

Miałem na serwerze starą wersje php która domyślnie miała register_globals ON.

0

A, no tak. Nie zauwazylem ze jest druga strona tematu.

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