2010-09-18 15 views
47

Esiste un modo per avviare una sessione persistente in PHP senza il posizionamento di un cookie di sessione? Esistono altri modi per mantenere una sessione tra le pagine, ad esempio una soluzione basata su indirizzi IP?sessione PHP senza cookie

Il motivo per cui mi chiedo è che, sebbene molti utenti abbiano i cookie, voglio vedere se c'è un modo per un sistema di login di funzionare per quelli con esso disabilitati (anche se penso che disabilitare i cookie sia solo paranoia inutile, personalmente).

risposta

50

non credo che sia troppo chiedere agli utenti di abilitare i cookie. Trovo sciocco quando la gente li spegne completamente.

Altrimenti, è possibile impostare lo session.use_only_cookies su "0" per forzare l'appendice di un ID di sessione agli URL all'interno del proprio php. Questo approccio, tuttavia, ha diversi svantaggi. Principalmente quello di mantenere lo stato all'interno dell'URL, al contrario dell'intestazione del cookie. Se un utente dovesse copiare e incollare l'URL della pagina in cui si trovavano, e qualcun altro avrebbe dovuto fare clic su di esso, entrambi avrebbero utilizzato la stessa sessione.

<?php 
    ini_set("session.use_cookies", 0); 
    ini_set("session.use_only_cookies", 0); 
    ini_set("session.use_trans_sid", 1); 
    ini_set("session.cache_limiter", ""); 
    session_start(); 
+1

Credo che l'OP volesse 'session.use_cookies' impostato su 1 –

+4

E si dovrebbe notare che queste impostazioni non alterano i collegamenti ipertestuali JS e le intestazioni di posizione nel codice PHP. –

+0

Infatti, chi naviga ancora con i cookie nel 2010? Mentre è ancora possibile, dubito che qualcuno lo faccia ancora; e quindi la domanda è piuttosto accademica. (Anche i ragni possono avere i biscotti ora) – Piskvor

3

si può lavorare con ID di sessione negli URL, e biscotti invalidanti con:

ini_set('session.use_cookies', 0); 
ini_set('session.use_only_cookies', 0); 
ini_set('session.use_trans_sid', 1); 
session_start(); 
// IP check 
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){ 
    session_regenerate_id(); 
    session_destroy(); 
    session_start(); 
} 
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR']; 
// session stuff 

Nota: è altamente discougared utilizzare ID di sessione negli URL. Gli indirizzi IP possono cambiare quando si viaggia con una scheda wireless e i server proxy hanno lo stesso indirizzo IP. Si rompe facilmente quando si fa clic su "un vecchio URL" (con il vecchio ID di sessione).

Potrebbe anche essere interessato a creare la propria funzione di gestione delle sessioni (in combinazione con un database). Ignorerai l'ID di sessione e lo assocerai all'indirizzo IP. (Si vedano gli esempi in http://php.net/manual/en/function.session-set-save-handler.php)

Riferimenti:

+5

Il collegamento a un indirizzo IP sembra un modo sbagliato. Alcuni utenti (aziendali?) Possono trovarsi dietro un proxy, in cui più utenti possono avere lo stesso indirizzo IP. – Leander

+3

@Leander Wooord! Ciò può portare a situazioni molto brutte, in cui l'intera azienda/famiglia/studente vivente ha accesso all'account dell'utente. – Sliq

+1

Qui in Germania il più grande ISP (Telekom) ha persino un proprio proxy che molti usano. Quindi nel peggiore dei casi un buco di rete ISP utilizzerà un account. Questo è davvero fastidioso in quanto rende quasi impossibile vietare gli indirizzi IP se non si vuole fare affidamento sull'intestazione X-HTTP-Forwarded-For. – Gellweiler

4

È possibile impostare l'ini-Valore della session.use_trans_sid su true per attivare aggiungendo l'id di sessione ad ogni URL. Dai un'occhiata a this.

Per motivi di sicurezza, è necessario limitare la sessione all'IP che ha creato la sessione. Tuttavia, questo non è perfettamente sicuro, poiché qualcuno con lo stesso IP (dietro ad un proxy, ad es.) Potrebbe riutilizzare quella stessa sessione.

1

È possibile salvare id di sessione per IP nel database:

Creare una tabella MySQL con tre campi: session_id, IP e la chiave di temperatura unico (per utenti registrati) o qualsiasi altra condizione che ti piace. Quindi disattiva i cookie di sessione e use_trans_sid.

quindi creare un codice per gestire il comportamento della sessione in base a questa nuova tabella!

dopo session_start() Salva session_id nella tabella e poi riceve da tavolo (da IP e qualsiasi altra condizione) e quindi chiamare

session_id($in_table_session_id); 

per ulteriori informazioni e guida completa vedi: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

+0

Ancora una volta, questo è vincolante per IP e non del tutto efficace, specialmente per gli ambiti in cui più utenti condividono lo stesso IP (ad esempio università, azienda o org proxy, ecc.) –

0

Si potrebbe creare un record del database o un file temporaneo e controllare le variabili $_SERVER contro la richiesta su ogni caricamento della pagina. È un rischio per la sicurezza, ma con abbastanza variabili (dai un'occhiata alla lista here) potresti sentire che hai avuto la possibilità di dirottare verso il basso a un livello accettabile; solo tu sai quanto è sicura la tua app deve essere.