Sesi PHP tidak disimpan semasa menavigasi antara halaman di tapak web saya
P粉316890884
P粉316890884 2023-09-13 10:17:32
0
1
575

Mengapakah sesi php saya tidak disimpan semasa saya melayari halaman laman web?

Saya sedang mencipta tapak web yang menggunakan pasangan nama pengguna-kata laluan yang mudah untuk membenarkan pentadbir mengesahkan diri mereka pada halaman log masuk. Untuk melakukan ini, pertama sesi dibuat apabila pengguna mencapai halaman utama, kemudian apabila mereka mengklik pada butang log masuk, mereka dialihkan ke borang untuk memasukkan nama pengguna dan kata laluan, kemudian borang dihantar ke satu lagi melalui kaedah POST untuk mengesahkan nama pengguna dan kata laluan Jika halaman itu sah, letakkan pembolehubah dalam sesi yang mengandungi nama pengguna pentadbir yang dilog masuk, kemudian ubah hala ke papan pemuka pentadbir, sahkan bahawa pembolehubah ditetapkan untuk menyemak sama ada ia sememangnya pentadbir pada halaman tersebut.

Seperti yang dijelaskan dalam tajuk, masalah utama ialah apabila saya menguji halaman utama satu sesi dibuat, tetapi apabila saya mengklik pada pautan ke borang log masuk sesi itu nampaknya musnah, walaupun saya mengalih keluar atau meneutralkan apa-apa yang mungkin menyebabkan arahan ini.

Snippet php kecil (main.php) di halaman utama untuk memulakan sesi

<?php 
        session_start(['cookie_lifetime' => 86400]); 
        $_SESSION["start"] = time();
        error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt"); //puts in the log the session status and the content of the variable assigned above.
        if (!is_writable(session_save_path())) {
            error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); 
        } else {
            error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt");
        }
        ?>

Saya cuba mengatasi kitaran hayat kuki seperti yang ditunjukkan di atas untuk mendapatkan coretan jawapan kepada soalan ini untuk melihat sama ada folder itu boleh ditulis dan jika sesi itu dibuat. Log sentiasa kembali ke halaman utama:

Test de session : 2 | 1684946314; 
Session path C:\MAMP\bin\php\sessions\ is writable for PHP;

(Baris pertama | nombor selepasnya ialah cap masa yang dijangkakan).

Satu-satunya coretan kod php dalam borang log masuk (connexion.php)

<?php 
        if (isset($_SESSION["logged_admin"])) {
            header("Location: auth.php");
            exit();
        }

        error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt");
        if (!is_writable(session_save_path())) {
            error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); 
        } else {
            error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt");
        }
    ?>

Saya telah meletakkan yang pertama jika ada supaya pentadbir yang log masuk dialihkan terus ke papan pemuka jika mereka sudah disambungkan. Baris selepas itu melakukan ujian yang sama seperti dalam main.php, tetapi kali ini kembali dalam log:

Test de session : 1 | ; 
Session path C:\MAMP\bin\php\sessions\ is writable for PHP;

Ini menunjukkan bahawa sesi telah dimusnahkan dan semua pembolehubahnya tidak ditetapkan.

Sebahagian daripada kod dalam fail php yang bertanggungjawab untuk menyemak nama pengguna dan kata laluan yang disediakan berkaitan dengan penggunaan sesi (auth.php)

<?php 
        error_log("\n\n------- [AUTH START ".date(DATE_RFC2822)." ] -------\n", 3, "log1.txt");
        $fail = 0;

        /*if (isset($_SESSION["logged_admin"]) && isset($_SESSION['start']) && (time() - $_SESSION['start'] > 1800)) {
            session_unset(); 
            session_destroy(); 
            session_start(['cookie_lifetime' => 86400]);
            $_SESSION["start"] = time(); 
            error_log("Session expirée (connecté + de 30 min);\n", 3, "log1.txt");
            echo "Votre session a expirée. Veuillez vous reconnecter.";
            $fail = 1;
            goto fail;
        }*/ //code that checks if a session is loaded during too much time and if yes, destroys it. I've put the code in a comment so it normally shouldn't be executed by the server.

        error_log("Test de session : ".session_status()." | ".$_SESSION["start"]."; \n", 3, "log1.txt");
        if (!is_writable(session_save_path())) {
            error_log('Session path '.session_save_path()." is not writable for PHP; \n", 3, "log1.txt"); 
        } else {
            error_log('Session path '.session_save_path()." is writable for PHP; \n", 3, "log1.txt");
        } //Here's once again the similar tests done in the other files.

        if (isset($_SESSION["logged_admin"])) {
            error_log("L'administrateur est déjà connecté;\n", 3, "log1.txt");
            goto fail;
        }

        //Other stuff that verifies if the data sent with POST method is there and connecting the local server to the database i use.

        $Accounts = $AccountsQuery->fetchAll(); //Converts the data i've received via a SQL query
            foreach ($Accounts as $Compte) {
                if ($Compte["login"] == $login && $Compte["mdp"] == $mdp) {
                    $_SESSION["logged_admin"] = $login; //if a username-password couple from the registered admins corresponds to the couple sent via the log in form, the username retrieved from the log in form ($login) is associated to the session's array.
                    error_log(session_status()."; \n", 3, "log1.txt");
                    error_log("Login et mot de passe valides | ".var_dump($_SESSION["logged_admin"])." est désormais connecté sur la session ".session_id()." ;\n", 3, "log1.txt");
                goto fail;
            }
        }
        $fail = 1;
        error_log("Login et mot de passe invalide; \n", 3, "log1.txt");
        echo "L'identifiant ou le mot de passe fourni est invalide."; ?>

Log dikembalikan dengan melaksanakan fail selepas menyerahkan borang:

------- [AUTH START Wed, 24 May 2023 16:49:17 +0000 ] -------
Test de session : 1 | ; 
Session path C:\MAMP\bin\php\sessions\ is writable for PHP; 
PDO set up for authentification;
1; 
Login et mot de passe valides |  est désormais connecté sur la session  ;
Authentification réussie le Wed, 24 May 2023 16:49:17 +0000 - British GMT hour ----------------------- [AUTH END]

Memandangkan saya telah memasukkan bukti kelayakan pentadbir yang didaftarkan ke dalam borang, pengesahan itu sendiri berjaya, tetapi selepas mengklik untuk mengakses borang log masuk, sesi yang dibuat di halaman utama ternyata masih dipadamkan, jadi saya tidak dapat meletakkan nama pengguna ke dalam $_SESSION Pentadbir log masuk dalam tatasusunan.

jika struktur menghalang pengguna yang tidak dibenarkan daripada mengakses kandungan papan pemuka pentadbir sahaja (dashboard.php)

<?php if (isset($_SESSION["logged_admin"])) { ?>
     //If there's a logged-in admin, shows up the dashboard with the admin-stuff to do.
<?php 
    } else {
        echo "Vous ne pouvez pas accéder à cette page car vous n'êtes pas connecté. Veuillez vous rediriger vers la page principale.";
    }; 
    ?> //Else shows the user on the page that he isn't logged-in.

Petikan daripada dua fail konfigurasi komponen PHP yang digunakan dalam pelayan saya (php 8.1.0)

php.ini-pembangunan

...
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; https://php.net/session.save-path
session.save_path = "tmp/"

php.ini-pengeluaran

;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; https://php.net/session.save-path
session.save_path = "tmp/"
Parameter

session.save_path nampaknya tidak diulas dalam kedua-duanya. Walau bagaimanapun, ia bukan laluan yang dikembalikan oleh fungsi session_save_path().

P粉316890884
P粉316890884

membalas semua(1)
P粉588152636

https://www.php.net/manual/en/function.session-start.php

Setiap kali halaman baharu dimuatkan, ia adalah permintaan HTTP yang berbeza. Sesi mesti dimulakan pada setiap permintaan HTTP, oleh itu, anda mesti menambah session_start() pada setiap halaman.

Saya mengesyorkan membuat satu fail pengepala tunggal yang disertakan dalam semua halaman, ia juga berguna untuk menetapkan perkara lain yang diperlukan pada semua halaman, seperti mengubah hala ke skrin log masuk jika pengguna tidak log masuk.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan