Newsgroup: it.comp.www.php
Titolo: session.use_trans_sid & header()

Ciao a tutti,
mi trovo a dover abilitare  session.use_trans_sid e fin qui.. Funziona tutto
senza toccare alcuna riga di codice, tranne che in alcune parti
dell'applicazione utilizzo la funzione header("Location: pippo.php"), dove
ovviamente php nulla può!
La mia soluzione è questa (ho bisogno di uno one-liner):
header("Location: pippo.php".(htmlspecialchars(SID)== null)?('')
('?').htmlspecialchars(SID));
ma non funziona! Se provate:
print("Location: pippo.php".(htmlspecialchars(SID)== null)?('')
('?').htmlspecialchars(SID));
php non stampa nulla, e non da nessun errore (PHP Version 5.2.0-8+etch7)!
Almeno 'Location: pippo.php' dovrebbe scriverlo, no?
-- 
g4b0, linux user n. 369000
http://gabo.homelinux.com

 pippo.php"), dove ovviamente php nulla può!
Per conformita all'RFC ti suggerisco di utilizzare un URL assoluto
nell'header Location. Comunque, seguendo il tuo esempio:
$sid = urlencode(session_name()) . '=' . urlencode(session_id());
session_write_close();
header('Location: pippo.php?' . $sid);
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 
E se fai: print('Location: pippo.php' . (htmlspecialchars(SID)== null ? 
'' : '?'. htmlspecialchars(SID));
Senza entrare nel merito del codice....
	Francesco

 Francesco


 
Ma il session_write_close() č proprio necessario?


 Cosa intendi?
Il primo htmlspecialchars lo puoi togliere e, forse, anche il secondo 
(alla fine il SID è generato dallo script e non da query string,  quindi 
non dovrebbe esserci rischio XSS)
	Francesco

 Ma il session_write_close() è proprio necessario?
Se prima dell'header location fai modifiche ai dati in sessione, e'
raccomandbile.


 
E' raccomandato dal manuale ufficiale di php..


 E' raccomandato dal manuale ufficiale di php..
Vero, ma la url string la generi via codice, quindi non hai problemi 
(altrimenti utilizzi già un SID "corrotto")
	Francesco

Francesco F wrote:

La generi da codice quando la sessione è nuova. Quando il browser cambia
pagina ti invia il SID tramite GET/COOKIE e va processato da
htmlspecialchars.. o forse se ne occupa php, dovrei provare..


 
Forse mi sbaglio, ma questo era il mio ragionamento (senza aver 
verificato niente): sulla url string hai il SID della sessione, spero 
vivamente che l'interprete prima di memorizzare l'id della sessione 
nella costante SID, cercare il file serializzato sul disco e tirar su le 
varie variabili esegua un test sulla validitą dello stesso ed 
un'eventuale bonifica del dato; per questo motivo (ripeto, non 
verificato ma, spero, a buon senso) il Sid dovrebbe essere pulito ed 
incluso nella location senza ulteriori verifiche. Chi ha voglia di 
controllare?
	Francesco

 ('?').htmlspecialchars(SID));
Location vuole un URI **ASSOLUTO**.
Non è difficile. Eppure sembra che NESSUNO lo sappia.
ciao, f.

 controllare?
Ho fatto una prima verifica: Sia modificando il cookie che il valore passato
via GET, l'interprete php verifica che nella stringa passata come parametro
vi siano solo caratteri validi (a-z, A-Z, 0-9 and '-,'), altrimenti ritorna
l'errore qua sotto e crea un nuovo session id:
[Wed Mar 12 17:38:27 2008] [error] [client 88.88.88.88] PHP Warning: 
session_start() [<a
href='function.session-start'>function.session-start</a>]: The session id
contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,'
in /home/.../public_html/include/session_var.php on line 6
Siamo quindi, in teoria, al sicuro da XSS. La costante SID, però, viene
valorizzata con qualunque stringa di caratteri validi passatogli dal
browser, a prescindere dalla sua lunghezza. Ho provato con valori di
PHPSESSID abbastanza lunghi:
http://test.php?PHPSESSID=AAAAAAAAAA[...]AAA
test.php fa pressapoco questo:
<?php
echo ini_get('session.use_trans_sid');
print("<br>SID: " . session_name() . ' = ' . session_id());
echo '<br>'.htmlspecialchars(SID);
exit(0);
?>
ed il risultato è:
0<br>SID: PHPSESSID =
AAAAAAAAAA[...]AAA<br>
PHPSESSID=AAAAAAAAAA[...]AAA
con questo errore nei log:
[Wed Mar 12 17:45:58 2008] [error] [client 88.88.88.88] PHP Warning: 
Unknown:
open(/var/lib/php5/sess_AAAAAAAAAA[...]AAA
O_RDWR) failed: File name too long (36) in Unknown on line 0
[Wed Mar 12 17:45:58 2008] [error] [client 88.88.88.88] PHP Warning: 
Unknown: Failed to write session data (files). Please verify that the
current setting of session.save_path is correct (/var/lib/php5) in Unknown
on line 0
Sembra che siamo anche al sicuro dai buffer overflow e family.. Qualcuno che
mi smentisca?
