Entità e sessioni php

Postato da psegno il 01-09-2007 in: php, sessioni

Entità sessioni php: soluzione per la mancata validazione delle pagine

In (x)html e in tutti i linguaggi derivati da SGML e XML, alcuni caratteri sono "riservati": il carattere < serve per esempio ad indicare al parser l'inizio di un tag; per poter includere nei documenti questi caratteri riservati, vengono usate le entità, composte da:

  1. carattere &, indicante l'inizio dell'entità
  2. un codice specifico per l'entità (tabella dei codici w3c)
  3. il punto e virgola

Riprendendo l'esempio precedente, per visualizzare il carattere > è necessario nel codice utilizzare l'entità &gt;

Le sessioni php

Attraverso le sessioni php è possibile memorizzare nel server alcuni dati relativi ad uno specifico utente. Per identificare i dati registrati nel server relativi all'utente il browser mantiene un identificativo, chiamato id di sessione, al quale i dati sono associati e lo invia ad ogni richiesta al server; questo id può essere registrato in un cookie, ma non tutti i browser (sai per loro natura che per impostazioni dell'utente) possono registrarli. Per risolvere questo inconveniente php può inviare l'id di sessione al server attraverso una query nel link della pagina.

Se la pagina non ha altri elementi nella query, l'uso di questo meccanismo non pone problemi: php automaticamente accoderà al link una query formata da ?PHPSESSID= con accodato l'id di sessione.
Qualora però vi sia già una query nel link, verrà accodato &PHPSESSID=.

Questo non crea problemi per l'utilizzo del sito ma ne crea per la validità della pagina secondo lo standard (x)html: viene difatti utilizzato il carattere riservato & non per identificare un'entità ma come carattere di accodamento
Ad esempio un url http://www.sito.it?lang=it diventerà http://www.sito.it?lang=it&PHPSESSID=01a44171360djj8b86297bc3f69906f5.

soluzioni

Esistono tre soluzioni per questo problema:

  1. modificare il separatore di argomenti nelle query
  2. forzare php ad usare un riferimento a carattere
  3. impedire a php di utilizzare la propagazione via url dell'id di sessione
Considerazioni preliminari

Le impostazioni di php possono essere settate in tre modi

  1. Nel file di configurazione php.ini. Per vedere dove si trova è possibile creare un piccolo script, chiamato ad esempio phpinfo.php, contenente il seguente codice <?php phpinfo(); >. Lanciato lo script, si ricerca il valore di Configuration File (php.ini) Path.
  2. Attraverso una direttiva di Apache, da impostare o nel file di configurazione del web server o in un file .htaccess
  3. Attraverso del codice script
1. modificare il separatore di argomenti nelle query

php.ini: arg_separator.output = ";"

direttiva apache: php_value arg_separator.output ;

script: <?php ini_set('arg_separator.output',';'); ?>

2. forzare php ad usare un riferimento a carattere

php.ini: arg_separator.output = "&amp;"

direttiva apache: php_value arg_separator.output &amp;

script: <?php ini_set('arg_separator.output','&amp;'); ?>

3. impedire a php di utilizzare la propagazione via url dell'id di sessione

php.ini: session.use_trans_sid = 0

direttiva apache: php_value session.use_trans_sid 0

script: <?php ini_set('session.use_trans_sid','0'); ?>

Considerazioni finali

Trovandosi a lavorare con hosting di terze parti, non è facilmente possibile richiedere la modifica del file php.ini o della configurazione di apache; le soluzioni possibili sono o l'inclusione di un file .htaccess o l'utilizzo della modalità script.
Anche in questo caso però ci possono essere delle limitazioni dettate dalla configurazione di apache.

Questo articolo è un riadattamento in italiano dell'articolo di David Dorward, Ampersands, PHP Sessions and Valid HTML, pubblicato dal w3c

link utili