Как предотвратить закрытие сеанса PHP при обновлении страницы?

#php #session

Вопрос:

Я создал системы регистрации и входа в систему для своего веб-сайта галереи. Когда пользователь пытается войти в систему, проверяется его пользователь, пароль и права администратора. Если это было успешно, имя пользователя отображается в левом верхнем углу домашней страницы, и Вход в систему превращается в Выход. Проблема в том, что при обновлении страницы пользователь выходит из системы.

login.php код:

 <?php

session_start();

class User

{

    public function CheckUser()

    {

        require "../app/core/database.php";

        if (isset($_POST['username']) amp;amp; isset($_POST['pass'])) {

            $username = $_POST['username'];

            $password = $_POST['pass'];

            //to prevent sql injection

            $username = stripcslashes($username);

            $password = stripcslashes($password);

            $username = mysqli_real_escape_string($connection, $username);

            $password = mysqli_real_escape_string($connection, $password);

            $sql = "SELECT * FROM signup WHERE username = '$username' and password = '$password'";

            $sql2 = "SELECT 'admin' FROM signup";

            $log_result = mysqli_query($connection, $sql);

            $count = mysqli_num_rows($log_result);

            if ($count == 1) {

                $_SESSION['loggedin'] = true;

                $_SESSION['username'] = $username;

                $_SESSION['is_admin'] = mysqli_query($connection, $sql2);

                header("Location: ../home/index");

            } else {

                echo "<script>Invalid()</script>";

            }

        }

    }

}

?>

<script>

    function Invalid() {

        alert("Invalid user/password");

    }

</script> 
 

часть кода домашней страницы (index.php):

 <?php

error_reporting(E_ALL);

ini_set('display_errors', TRUE);

include "../app/model/loadImages.php";

include "../app/core/config.php";

include "../app/model/login.php";

?>

<body>
  <nav>
    <?php while ($row = $result2->fetch_assoc()) {
      $rows[] = $row ?>
      <div class="logo">
        <a href="index.php"><?php echo $row['header_1'] ?> <em><?php echo $row['header_2'] ?></em></a>
        <span style="font-weight: normal; color:white;">
          <label>
            <?php
            if (isset($_SESSION['loggedin']) amp;amp; isset($_SESSION['username'])) {
              echo $_SESSION['username'];
            } ?>
          </label>
        </span>
      </div>
      <div class="menu-icon">
        <span></span>
      </div>
      </nav>
 <section class="overlay-menu">
    <div class="container">
      <div class="row">
        <div class="main-menu">
          <ul>

            <li>
              <?php
              if (!isset($_SESSION['loggedin']) amp;amp; !isset($_SESSION['username'])) {
                echo "<a href='/MyProject/public/login/index.php'>LogIn</a>";
              } else {
                echo "<a href='' action='EndSession();'>Logout</a>";
                echo "<li>";
                echo "<a href='/MyProject/public/admin/index'>Admin Area</a>";
                echo "</li>";
              } ?>

            </li>
            <li>
              <a href="about.html">About Us</a>
            </li>
            <li>
              <a href="blog.html">Blog Entries</a>
            </li>
            <li>
              <a href="single-post.html">Single Post</a>
            </li>
          </ul>
          <?php foreach ($rows as $row) { ?>
            <p><?php echo $row['message_1'] ?></p>
          <?php } ?>
        </div>
      </div>
    </div>
  </section>
<script>
    function EndSession() {

      <?php session_unset(); ?>
    }
  </script>
 

index.php для страницы входа в систему:

 <?php
include "../app/core/config.php";
include "../app/model/login.php";

$login = new User();
$login->CheckUser();

?>

<body>
    
    <div class="limiter">
        <div class="container-login100" style="background-image: url('../../app/views/login/images/bg-01.jpg');">
            <div class="wrap-login100 p-l-55 p-r-55 p-t-65 p-b-54">
                <form class="login100-form validate-form" method="POST">
                    <span class="login100-form-title p-b-49">
                        Login
                    </span>

                    <div class="wrap-input100 validate-input m-b-23" data-validate = "Username is reauired">
                        <span class="label-input100">Username</span>
                        <input class="input100" type="text" name="username" placeholder="Type your username">
                        <span class="focus-input100" data-symbol="amp;#xf206;"></span>
                    </div>

                    <div class="wrap-input100 validate-input" data-validate="Password is required">
                        <span class="label-input100">Password</span>
                        <input class="input100" type="password" name="pass" placeholder="Type your password">
                        <span class="focus-input100" data-symbol="amp;#xf190;"></span>
                    </div>
                    
                    <div class="text-right p-t-8 p-b-31">
                        <a href="#">
                            Forgot password?
                        </a>
                    </div>
                    
                    <div class="container-login100-form-btn">
                        <div class="wrap-login100-form-btn">
                            <div class="login100-form-bgbtn"></div>
                            <button class="login100-form-btn">
                                Login
                            </button>
                        </div>
                    </div>

                    <div class="txt1 text-center p-t-54 p-b-20">
                        <span>
                            Or Sign Up Using
                        </span>
                    </div>

                    <div class="flex-c-m">
                        <a href="#" class="login100-social-item bg3">
                            <i class="fa fa-google"></i>
                        </a>
                    </div>

                    <div class="flex-col-c p-t-155">
                        <span class="txt1 p-b-17">
                            Or Sign Up Using
                        </span>

                        <a href="<?php echo $root ?>/public/signup/index.php" class="txt2">
                            Sign Up
                        </a>
                    </div>
                </form>
            </div>
        </div>
    </div>
 

Как я могу решить эту проблему?

Комментарии:

1. он использует сеанс из Login.php

2. Предупреждение! Никогда не храните пароли в виде обычного текста! Вы должны хранить только хэши паролей, сгенерированные с помощью password_hash () , и для повторной проверки пароля с помощью хэша используйте password_verify() .

3. К вашему сведению, полосатые косые черты не имеют ничего общего с внедрением sql и не помогают предотвратить это. Все, что это сделает в вашем случае, — это потенциально предотвратит вход пользователя в систему, изменив его пароль

4. В любом случае, ваша домашняя страница где-нибудь вызывает session_start ()?

5. Можете ли вы добавить код, в котором вы вызываете функцию CheckUser() внутри пользовательского класса?

Ответ №1:

Я повторил проблему. session_unset внутри функции js вызывается при обновлении страницы, кроме того, он находится внутри функции JS.

Удалите эту функцию, чем создайте новый файл под названием logout.php:

 <?php 
session_unset();
header("Location: ../home/index.php");
?>
 

Измените тег a внутри home/index.php:

 <a href='logout.php'>Logout</a>
 

Примечание: рассмотрите возможность использования session_destroy() вместо session_unset() для выхода из системы

Ответ №2:

Вы должны создать сеанс и установить куки , этот метод, я надеюсь, поможет вам

Сначала выберите проверить пользователя : функция проверки пароля работает, если вы храните пароль с помощью алгоритма bcrypt

   <?php
    if(isset($_POST["username"])) {
        $u = $dbmysqli->real_escape_string($_POST['username']);
        $p = $_POST['p'];



        $sql = $dbmysqli->prepare('SELECT username, password FROM users WHERE username = ?');
        $sql->bind_param("s", $u);
        $sql->execute();
        $sql->store_result();
    }
    if ($sql->num_rows > 0) {
        $sql->bind_result($db_id, $db_username, $db_pass_str);
        $sql->fetch();
        if (password_verify($p, $db_pass_str)) {
            // Verification success! User has logged-in!
            // Create sessions, so we know the user is logged in, they basically act like cookies but remember the data on the server.
            session_regenerate_id(TRUE);
            $_SESSION['userid'] = $db_id;
            $_SESSION['username'] = $db_username;
            $_SESSION['password'] = $db_pass_str;
            setcookie("id", $db_id, strtotime(' 30 days'), "/", "", "", TRUE);
            setcookie("user", $db_username, strtotime(' 30 days'), "/", "", "", TRUE);
            setcookie("pass", $db_pass_str, strtotime(' 30 days'), "/", "", "", TRUE);
            echo $db_username;
            exit();
        } else {
            // Incorrect password
            echo 'login_failed';
        }
    }
    ?>
 

Затем вам нужно создать статус проверки входа в систему file.php вот так (включите это на каждой странице, если вы хотите, чтобы пользователь оставался в системе) :

 <?php
$user_ok = FALSE;
$log_id = "";
$log_username = "";
$log_password = "";

function evalLoggedUser($dbmysqli,$id,$u,$p){
    $sql = $dbmysqli->prepare('SELECT email FROM users WHERE id = ? AND uname = ? AND pswd = ?');
    $sql->bind_param("sss", $id,$u,$p);
    $sql->execute();
    $sql->store_result();
    $numrows = $sql->num_rows;
    if($numrows > 0){
        return true;
    }
}

if(isset($_SESSION["userid"]) amp;amp; isset($_SESSION["username"]) amp;amp; isset($_SESSION["password"])) {
    $log_id = preg_replace('#[^0-9]#', '', $_SESSION['userid']);
    $log_username = preg_replace('#[^a-z0-9]#i', '', $_SESSION['username']);
    $log_password = $_SESSION['password'];
    //$log_password = preg_replace('#[^a-z0-9$./]#i', '', $_SESSION['password']);

    $user_ok = evalLoggedUser($dbmysqli,$log_id,$log_username,$log_password);
} else if(isset($_COOKIE["id"]) amp;amp; isset($_COOKIE["user"]) amp;amp; isset($_COOKIE["pass"])){
    $_SESSION['userid'] = preg_replace('#[^0-9]#', '', $_COOKIE['id']);
    $_SESSION['username'] = preg_replace('#[^a-z0-9]#i', '', $_COOKIE['user']);
    $_SESSION['password'] = $_COOKIE['pass'];
    //$_SESSION['password'] = preg_replace('#[^a-z0-9$./]#i', '', $_COOKIE['pass']);
    $log_id = $_SESSION['userid'];
    $log_username = $_SESSION['username'];
    $log_password = $_SESSION['password'];

    $user_ok = evalLoggedUser($dbmysqli,$log_id,$log_username,$log_password);
    if ($user_ok == TRUE);
}
?>
 

И, наконец, logout.php :

 <?php
session_start();
$_SESSION = array();
if(isset($_COOKIE["id"]) amp;amp; isset($_COOKIE["user"]) amp;amp; isset($_COOKIE["pass"])) {
    setcookie("id", '', strtotime( '-5 days' ), '/');
    setcookie("user", '', strtotime( '-5 days' ), '/');
    setcookie("pass", '', strtotime( '-5 days' ), '/');
}
session_destroy();
if(isset($_SESSION['username'])){
    header("location: message.php?msg=Error:_Logout_Failed");
} else {
    header("location: login.php");
    exit();
}
?>
 

Комментарии:

1. Пожалуйста, не рекомендуйте людям хранить учетные данные в файлах cookie! Любой, у кого есть доступ к компьютеру пользователей, также получит доступ к учетным данным пользователей! Никогда не храните конфиденциальную информацию в клиенте! Вам также не нужно хранить учетные данные в сеансе.