Logowanie nie przekierowuje jeśli nadam nazwę sesji

0

Przed nadawaniem nazwy sesji wszystko działa.

Plik logowania:

session_name('sess_' . bin2hex(random_bytes(16)));
session_start();

// i do momentu logowania poprawnego wszystko działa
// tzn nie poprawne dane to są informacje, że nie można się tak logować...
// ale nie wykonuje się poprawnie skrypt:

 header("Cache-Control: no-cache, must-revalidate");
 echo '<meta http-equiv="refresh" content="1;URL=strona_dla_zalogowanych.php'>;

Plik z formularzem logowania:

<?php
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
header("Cache-Control: no-cache, must-revalidate");
 echo '<meta http-equiv="refresh" content="1;URL=strona_dla_zalogowanych.php'>;
}

Zdaje się, że nie powinienem w każdym pliku na nowo robić session_start() tylko w przypadku pierwszego jej ustanowienia prawda?
Nie zamierzam zarządzać wieloma sesjami ... ani wieloma użytkownikami w ramach jednego systemu.

Dlaczego więc po dodaniu: session_name('sess_' . bin2hex(random_bytes(16)));
przestaje działać logowanie?
Jeśli to usunę lub przeniosę pod session_start() w pliku logowania to będzie ok.

Co mi umyka?

0

Przy każdym wywołaniu PHP powinieneś mieć session_start().
Z drugiej strony coś przekombinowałeś.

  1. Po co ten random?
  2. Po co to META?
  3. Co jest w pliku strona_dla_zalogowanych.php?
0

Nie można mieć przy każdym wywołaniu bo będzie logowanie błędów, że nie można zmienić nazwy sesji gdy ta jest aktywna ...

AD 2.
Jak po co? Do przekierowania do odpowiedniego pliku.

AD 3..

<?php
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}
require_once('root/token.php');

if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = generate_csrf_token();
}

// Sprawdź, czy użytkownik jest zalogowany
if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
    header("Cache-Control: no-cache, must-revalidate");
    header("Location: index.php");
    exit();
}

$pageTitle = "Dla zalogowanych";
include 'root/header.php';
?>

// potem dalszy kod, głównie HTML tabele i inne dane z bazy danych. 

2
  1. session_start masz wywołać za każdym razem na początku skryptu.
  2. session_name zmienia nazwę sesji więc za każdym razem masz inną.
0
  1. Przecież to robię:
   if (session_status() == PHP_SESSION_NONE) {
    session_start();
   }
  1. Przy nowym zalogowaniu gdy tworzy sesję. W tym przypadku tworzyłbym sesję w każdym pliku osobno.
1
NieZnaju6 napisał(a):
  1. Przecież to robię:

    if (session_status() == PHP_SESSION_NONE) {
     session_start();
    }```
    

Przy nowym zalogowaniu gdy tworzy sesję. W tym przypadku tworzyłbym sesję w każdym pliku osobno.

Nie prawda. session_start() nie tworzy nowej sesji. To jest po prostu część interfejsu, musisz wywołać tą funkcję żeby móc korzystać z innych funkcji session_ w skrypcie. A ten if wywal. Ty sam, jako programista nie tworzysz nigdzie sesji. PHP sam tworzy sesję jeśli jej nie ma, a jeśli jest to używa istniejącej.

Powinno być tak:

session_start();

// i do momentu logowania poprawnego wszystko działa
// tzn nie poprawne dane to są informacje, że nie można się tak logować...
// ale nie wykonuje się poprawnie skrypt:

header("Location: strona_dla_zalogowanych.php");

oraz

<?php

session_start(); // zawsze, jak chcesz skorzystać z sesji (nie ważne czy jesteś zalogowany czy nie)

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

session_name() też źle użyłeś, to tam się podaje tylko prefix - faktyczna nazwa sesji na dysku będzie odpowiednio zapisana dla każdej sesji użytkownika.

0

To jak mam poprawnie wykorzystać session_name() przy logowaniu?

2

Najlepiej tego nie rób

2
NieZnaju6 napisał(a):

To jak mam poprawnie wykorzystać session_name() przy logowaniu?

A jaki efekt próbujesz uzyskać? Jaką funkcjonalność próbujesz zaprogramować?

Bo na 99.9% nie potrzebujesz używać tej funkcji.

0

Zrób to jak należy i nie kombinuj jak koń pod górę.
Robisz 2 pliki:

index.php

<?php  
  include ( 'UserLogin.php' );  
  $user = new UserLogin();
  
  //
  // weryfikacja logowania
  // parametry login i passowrd w $_REQUEST są potrzebne tylko gdy użytkownik nie jest zalogowany
  if ( $user->getUser() == null ){    
    $user->userName = $_REQUEST [ 'login' ];
    $user->userPassword = $_REQUEST [ 'password' ];
    if ( $user->login() == true ){      
      echo "Jesteś zalogowany jako: ".$user->getUser()."<hr>";
    } else {
      echo "Błąd logowania!<hr>";
    }    
  }
  
  //
  // obsługa zalogowanego lub nie
  if ( $user->getUser() == null ){
    echo "Żeby zobaczyć treść musisz się zalogować!<hr>";
  } else { 
    echo "To jest treść dla zalogowanych !!! Witaj szanowny zalogowańcu :-)<hr>";
  }

UserLogin.php

<?php
session_start();
class UserLogin{
  
  public $userName = '' ;
  public $userPassword = '' ;
  
  function login(){
    if ( ( $this->userName == 'marek' ) && ( $this->userPassword == 'test' ) ){
      $_SESSION[ 'LOGGED_USER' ] = 'marek' ;
      return true ;
    } else {
      return false ;
    }
  }
  
  function logout(){
    unset( $_SESSION[ 'LOGGED_USER' ] ) ;
    //
    // tu przekieruj do strony po wylogowaniu...
  }
  
  function getUser(){        
    if ( ( isset ( $_SESSION[ 'LOGGED_USER' ] ) ) && ( $_SESSION[ 'LOGGED_USER' ] !== null ) ){
      return $_SESSION[ 'LOGGED_USER' ] ;
    } else {
      return null ;
    }    
  }

}

Tak wywołujesz gdy chcesz się logować (np form action z formularza logowania): index.php?login=marek&password=test
Musisz oczywiście zrobić odpowiednią obsługę w przypadku gdy logowanie jest błędne i przekierować użytkownika np. do formularza logowania.
Warto też zrobić możliwość wylogowania wykorzystując metodę klasy UserLogin->logout(); a po jej wywołaniu także skierować użytkownika na odpowiednią podstronę.

1
NieZnaju6 napisał(a):

To jak mam poprawnie wykorzystać session_name() przy logowaniu?

przed każdym session_start wywołać session_name z tym samym parametrem np

session_name("sess");

Ty dodajesz do nazwy ciasteczka z sesją losowe 16 bajtów więc masz szansę 1 na 340282366920938463463374607431768211456 że nazwa ciastka się zgodzi i ta sama sesja będzie kontynuowana, ciekawe rozwiązanie

0

Wyczytałem, że session_name ma chronić przed atakami na sesję, przejęcie sesji.
W tym wypadku atakujący miałby ograniczony czas - 60 min - na przejęcie nazwy sesji nim ta wygaśnie, a nowa będzie miała nową nazwę.
Czy w takim wypadku źle używam session_name czy to w ogóle jest nie potrzebne?

1

Daj źródło na podstawie którego działasz.
Przeczytaj Czy, jak, kiedy i po co używacie session_name()?

2
NieZnaju6 napisał(a):

Wyczytałem, że session_name ma chronić przed atakami na sesję, przejęcie sesji.
W tym wypadku atakujący miałby ograniczony czas - 60 min - na przejęcie nazwy sesji nim ta wygaśnie, a nowa będzie miała nową nazwę.
Czy w takim wypadku źle używam session_name czy to w ogóle jest nie potrzebne?

Nie przejmuj siw tym w ogóle na tym etapie.

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