-
Problema sessioni e path
Buonasera,
ho uno script che crea una sessione dati in paginaIniziale.php e che recupero correttamente su
- /cartellaA/paginaA.php
- /cartellaC/paginaC.php
Mentre su visito /cartellaB/paginaB.php, non funziona.
Le pagine, in header, richiamano tutti questa funzione:
Codice PHP:
<?php
function sysInit(){
session_set_cookie_params(0, '/', 'dominio.tld', true, true);
session_start();
if(empty($_SESSION['reLoc'])){
header('location: paginaIniziale.php');
exit;
}
}
Debuggando il tutto, noto che /cartellaB/ all'avvia della sessione, utilizza /cartellaB/ come path del cookie di sessione, mentre le altre pagine utilizzano /.
Sarà la stanchezza o il caldo ma non riesco ad uscirne
-
Ciao Miki! 👋 Problema curioso e frustrante! :mrgreen:
Giusto per essere sicuri: la chiamata a session_set_cookie_params() è li principalmente per settare secure: true e httponly: true? In quel caso, potrebbe bastarti session_start():
Codice PHP:
session_start([
'cookie_httponly' => 1,
'cookie_secure' => 1,
# 'cookie_samesite' => <'strict' | 'lax'>, // magari vuoi anche questo?
]);
Altrimenti, visto che avrai già controllato tutte le cose ovvie, magari il problema è da un'altra parte. Cose tipo "oh, il file in cartellaB non conteneva il codice aggiornato", oppure "oh, lo stavo salvando nel posto sbagliato".
-
Heilà... poco fa leggevo il tuo post su Pest
Comunque ho controllato dappertutto.
Alcune pagine creano un secondo cookie con lo stesso nome, altro valore di sessione e path diversa.
Anche la tua soluzione non va :/
Ultima spiaggia è quella integrare la funzione con una lettura dei cookie ed eliminare quelli doppi rimanendo il primo emesso!
-
"Spegni" un attimo il redirect commentando la riga con header(), e prova a mandare in output il parametri prima e dopo la tua chiamata:
Codice PHP:
var_export(session_get_cookie_params());
session_set_cookie_params(...);
session_start();
var_export(session_get_cookie_params());
E vediamo cosa ne esce :mrgreen:
[edit] Cerca anche se c'è un altro session_start() nel codice! Il path di default è la directory corrente, quindi il secondo cookie arriva da una chiamata che in qualche modo non "sente" i parametri che setti in quella funzione. O la funzione non è chiamata, o c'è un altro session_start secondo me 🤔
-
Codice:
array ( 'lifetime' => 0, 'path' => '/', 'domain' => '', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict', )
Warning: session_start(): Session cannot be started after headers have already been sent in /home/miksco/web/gestio24.com/inc/auth.php on line 6
array ( 'lifetime' => 0, 'path' => '/', 'domain' => '', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict', )
Warning: session_name(): Session name cannot be changed after headers have already been sent in /home/miksco/web/gestio24.com/inc/auth.php on line 8
Warning: session_start(): Session cannot be started after headers have already been sent in /home/miksco/web/gestio24.com/inc/auth.php on line 9
Improvvisamente lo fa solo dal PC di casa ora.
-
Mmmmh, ci sono due session_start in quel log, la cosa è sospetta! Può essere che sia da qualche parte in paginaB.php, e sia la causa di quel secondo cookie.
-
1) Da PHP 7.2 session_name va utilizzato prima di session_start
2) Se si utilizzano i cookie non puoi avere output prima della funzione session_start che appunto crea una sessione con cookie o la recupera
Io per spegnere output_buffering (php.ini) uso nel mio codice ob_end_clean e inoltre abilito tutti gli errori con error_reporting e visualizzo il file archiviato nel filesytem.
Codice PHP:
<?php
ob_end_clean();
$i256 = str_replace(',', '', '115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936');
error_reporting((int) $i256);
$t = true;
ob_start();
session_name('a[b]');
session_start();
ob_end_clean();
if(isset($_SESSION['hi'])) {
$t = false;
}
$text = ini_get('session.save_path') . '/sess_' . $_COOKIE['a']['b'];
function get_include_contents($filename) {
//if (is_file($filename)) {
ob_start();
include $filename;
$var = ob_get_contents();
ob_end_clean();
return $var;
//}
return false;
}
$string = get_include_contents($text);
$_SESSION['hi'] = 'user2';
var_dump($string);
?>
Questa pagina é il recupero dei dati di sessione ma non la pagina di creazione
-
Buongiorno e grazie del suggerimento ma l'ho spostato dopo.
Per quanto incredibile possa sembrare il problema è che anteponevo la parola "sid" prima del nome sessione (es. SID-SitoA)... è stato sufficiente spostarlo come suffisso (sitoA-sid) per risolvere.
Inoltre ho controllato tutte le pagine ed ho sempre usato require_once ed un solo session_start
Ora non so se la mia soluzione è stata una casualità o meno ma così parrebbe risolto.
-
Mistero! Ma se hai risolto, perfetto così :mrgreen: