Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Super Help Sessioni E Cookies

    PER FAVORE, ABBIATE MOLTA PAZIENZA!

    Premessa:

    In php.ini ho le seguenti impostazioni:

    PATH DELLE SESSIONI, USO QUELLO DI DEFAULT, QUINDI C:/WINNT/TEMP

    ; Whether to use cookies.
    session.use_cookies = 1

    ; This option enables administrators to make their users invulnerable to
    ; attacks which involve passing session ids in URLs; defaults to 0.
    session.use_only_cookies = 1

    ; Lifetime in seconds of cookie or, if 0, until browser is restarted.
    session.cookie_lifetime = 0

    session.gc_probability = 100
    session.gc_divisor = 100

    ; After this number of seconds, stored data will be seen as 'garbage' and
    ; cleaned up by the garbage collection process.
    session.gc_maxlifetime = 600

    Nella mia index.php non c'è session_start();

    Nella index se un utente vuole accedere all'area riservata, deve inserire login e password. La form, poi, invia tali dati alla pagina area_ris.php, dove viene creata la sessione:

    session_start();

    in essa sono memorizzate login e password;

    si controlla se tali dati sono presenti nel DB. Se si accedi, altrimenti ritorna in index.php

    In ogni pagina, interna, viene fatto il controllo se la login e la password presenti nella sessione siano valide o meno.

    Ora, quello che a me interessa è questo.

    Nelle pagine interne, io VOLGIO RINNOVARE una sessione esistente SOLO SE la sessione è EFFETTIVAMENTE ESISTENTE, altrimenti rimando alla pagina index.php. Il tutto per motivi di sicurezza.
    Secondo le mie impostazioni del php.ini, la sessione esiste solo se il client invia un cookie di sessione *e* esiste il file di sessione corrispondente.

    Nelle pagine, interne, ho sostituito session_start() con un include al seguente file:

    <SCRIPT LANGUAGE="php">
    if (!isset($_COOKIE['PHPSESSID']))
    {
    //No cookie from client.

    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE NON È PERVENUTO ALCUN COOKIE

    TORNO ALL'INDEX.PHP
    }


    $GLOBALS['sv'] = (string) $_COOKIE['PHPSESSID'];

    if (preg_match('/^[-,a-zA-Z0-9]+$/', $GLOBALS['sv']) !== 1)
    {
    //Not a valid cookie syntax.

    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE È PERVENUTO UN COOKIE CON ID DI SESSIONE NON VALIDO

    TORNO ALL'INDEX.PHP
    }


    $GLOBALS['dir'] = "C:/WINNT/Temp/sess_";
    $GLOBALS['sf'] = $GLOBALS['dir'] . $GLOBALS['sv'];


    if (!file_exists($GLOBALS['sf']))
    {
    //This cookie is not a session or session expired.

    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE È PERVENUTO UN COOKIE CHE NON CORRISPONDE AD UNA SESSIONE
    //OPPURE LA SESSIONE E' SCADUTA

    TORNO ALL'INDEX.PHP
    }

    //Se la sessione corrente è scaduta, ne cancelliamo il relativo file
    $GLOBALS['time_out'] = ini_get('session.gc_maxlifetime');

    if (time() - $GLOBALS['timeOut'] > fileatime($GLOBALS['sf']))
    {
    /* Se l'ultimo accesso al file supera il tempo di vita della sessione, allora il file viene
    distrutto */

    unlink($GLOBALS['sf']);
    }
    else
    {
    /* A questo punto abbiamo tale situazione: esiste il cookie di sessione dell'utente ma
    anche il file di sessione sul server. Ora, nella frazione infinitesimale di tempo che è
    intercorso tra l'if precedente e l'istruzione session_start() è probabile (anche se è
    quasi impossibile) che la sessione sia scaduta. In tal casi, session_start() provoca o
    potrebbe, la creazione di una nuova sessione: in tal caso si entra nell'if seguente, si
    distrugge la sessione e si ritorna nell'index.
    Invece, se non si entra nell'if allora vuol dire che abbiamo ripreso la sessione
    dell'utente corrente */

    session_start(); //restore session.

    if (session_id() !== $GLOBALS['sv'])
    {
    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE È PERVENUTO UN COOKIE PER IL QUALE LA SESSIONE E' SCADUTA

    TORNO ALL'INDEX.PHP
    }
    }

    //The restored session is that we actually expected.
    </SCRIPT>


    Ho dato, inoltre, un'occhiata a queste 2 discussioni

    http://forum.html.it/forum/showthrea...n&pagenumber=3

    dove andr3a ha suggerito l'uso del DB con riferimento a tale link http://www.devpro.it/code/94.html

    mentre Piero gestisce direttamente i file di sessione nella loro cartella (da lui ho preso spunto per la cancellazione del file di sessione scaduto - non sono Gay!!!)

    ed anche la discussione http://forum.html.it/forum/showthrea...readid=1095247
    dove anche qui si suggerisce l'uso di DB rimandando a tale link

    http://blog.studio-blue.it/2007/02/p...entazione.html


    Non posso far uso di DB, perché sul mio server vi sono vari servizi offerti alla clientela, ciascuno dei quali è implementato con un DB separato dagli altri.
    Visto l'elevato numero di utenti che accede al Server, sarebbe, quindi, impensabile avere un DB a parte per le sessioni, in quanto ad ogni pagina dovrei aprire la connessione con il DB delle sessioni, poi riprendere la connessione con il DB del servizio specifico per il controllo della validità del log-in, poi riprendere la connessione con il DB delle sessioni se devo memorizzare qualche variabile, poi, eventualmente, riprendere la connessione con il DB del servizio se nella pagina php devo visualizzare dei dati da prendere nel DB............. diventa, inefficiente, anche
    perché i vari DB si trovano su macchine differenti dal web-server.

    La mia domanda è se il metodo da me proposto appesantisce troppo il server o comunque sia poco sicuro o inefficiente.

    SE VERAMENTE IL GARBAGE COLLECTOR FUNZIONASSE E CANCELLASSE I FILE DI SESSIONE ALLA LORO SCADENZA, TUTTI I MIEI PROBLEMI SAREBBERO RISOLTI!!!!

    CONSIGLIATEMI!

  2. #2
    UP! PLEASE!

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120

    Re: Super Help Sessioni E Cookies

    Originariamente inviato da gianf_tarantino
    La mia domanda è se il metodo da me proposto appesantisce troppo il server o comunque sia poco sicuro o inefficiente.
    Diciamo pure che è una follia immotivata. Ti complichi la vita al cubo senza guadagnare niente.


    Originariamente inviato da gianf_tarantino
    In ogni pagina, interna, viene fatto il controllo se la login e la password presenti nella sessione siano valide o meno.
    In ogni pagina?!?!? E perché? Criceti che si annoiano? E poi salvi la password in sessione? E questa la chiami sicurezza?


    Originariamente inviato da gianf_tarantino
    Nelle pagine interne, io VOLGIO RINNOVARE una sessione esistente SOLO SE la sessione è EFFETTIVAMENTE ESISTENTE
    Luisa va a prendere il sole solo se c'è effettivamente il sole


    Originariamente inviato da gianf_tarantino
    Nelle pagine, interne, ho sostituito session_start() con un include al seguente file:
    .....
    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE NON È PERVENUTO ALCUN COOKIE
    .......
    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE È PERVENUTO UN COOKIE CON ID DI SESSIONE NON VALIDO
    ......
    //Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
    //DELL'UTENTE È PERVENUTO UN COOKIE CHE NON CORRISPONDE AD UNA SESSIONE
    //OPPURE LA SESSIONE E' SCADUTA
    Delirio totale.
    Quindi tu vorresti creare una email inutile ogni volta che un utente si addormenta davanti al video o si allontana per farsi gli affari suoi e gli scade la sessione? O magari perchè uno un po' tonto si è messo una pagina interna nei preferiti e poi ha provato ad accedervi direttamente?


    Originariamente inviato da gianf_tarantino
    Non posso far uso di DB, perché sul mio server vi sono vari servizi offerti alla clientela, ciascuno dei quali è implementato con un DB separato dagli altri.
    Visto l'elevato numero di utenti che accede al Server, sarebbe, quindi, impensabile avere un DB a parte per le sessioni, in quanto ad ogni pagina dovrei aprire la connessione con il DB delle sessioni, poi riprendere la connessione con il DB del servizio specifico per il controllo della validità del log-in, poi riprendere la connessione con il DB delle sessioni se devo memorizzare qualche variabile, poi, eventualmente, riprendere la connessione con il DB del servizio se nella pagina php devo visualizzare dei dati da prendere nel DB............. diventa, inefficiente, anche
    perché i vari DB si trovano su macchine differenti dal web-server.
    E allora?
    Che significa "riprendere e poi riprendere e poi riprendere..."? Basta usare due connessioni, una per l'applicazione e una per la sessione!

  4. #4

    Re: Re: Super Help Sessioni E Cookies

    Premetto che ho preso spunto da questo indirizzo http://www.icosaedro.it/articoli/php-security.html

    Originariamente inviato da luca200
    Diciamo pure che è una follia immotivata. Ti complichi la vita al cubo senza guadagnare niente.
    Innanzitutto, ciò che mi preme è la sicurezza.


    In ogni pagina?!?!? E perché? Criceti che si annoiano? E poi salvi la password in sessione? E questa la chiami sicurezza?
    Scusa, e dove vuoi che salvi i dati del log-in se non nella sessione? E poiché è più sicuro che la sessione venga trasmessa solo attraverso cookie, ho impostato il php per fare questo.
    Ad ogni pagina controllo se la login e la password che l'utente ha fornito, gli diano effettivamente i permessi per poter accedere alle pagine riservate.

    Luisa va a prendere il sole solo se c'è effettivamente il sole
    Nelle pagine interne, io VOLGIO RINNOVARE una sessione esistente SOLO SE la sessione è EFFETTIVAMENTE ESISTENTE. Questo perché come dice ad un certo punto nell'indirizzo che ho su indicato
    "Un attaccante malevolo potrebbe richiamare ciclicamente una qualsiasi pagina del sito costringendo il server a generare innumerevoli sessioni diverse. Questo potrebbe svuotare la riserva di entropia del generatore di numeri casuali del server, e costringere il server a ricorrere al generatore di numeri pseudo-casuali, meno sicuri dal punto di vista crittografico."


    Delirio totale.
    Quindi tu vorresti creare una email inutile ogni volta che un utente si addormenta davanti al video o si allontana per farsi gli affari suoi e gli scade la sessione? O magari perchè uno un po' tonto si è messo una pagina interna nei preferiti e poi ha provato ad accedervi direttamente?
    Il fatto è ke alcuni servizi che vengono offerti trattano dati "DAVVERO" importanti per cui nessuna precauzione è mai troppa. Pensa che per le aree riservate ho usato l'https!


    E allora?
    Che significa "riprendere e poi riprendere e poi riprendere..."? Basta usare due connessioni, una per l'applicazione e una per la sessione!
    Il fatto è ke l'accesso di utenti previsto per il sito è davvero alto, nell'ordine delle migliaia. Per questo nn voglio appesantire troppo il DB che è già sovraccarico.

  5. #5
    Luca, cmq se mi potresti dare dei consigli in termini di sicurezza e di prestazioni del server, te ne sarei molto grato.

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120

    Re: Re: Re: Super Help Sessioni E Cookies

    Originariamente inviato da gianf_tarantino
    Scusa, e dove vuoi che salvi i dati del log-in se non nella sessione? E poiché è più sicuro che la sessione venga trasmessa solo attraverso cookie, ho impostato il php per fare questo.
    In sessione si salva il login, NON la password. Una volta verificata non serve più.

    Originariamente inviato da gianf_tarantino
    Ad ogni pagina controllo se la login e la password che l'utente ha fornito, gli diano effettivamente i permessi per poter accedere alle pagine riservate.
    Questo è diverso da quello che hai scritto prima. Una cosa è verificare i permessi dell'utente presentato, una cosa è ripresentarlo ad ogni pagina.


    Originariamente inviato da gianf_tarantino
    Nelle pagine interne, io VOLGIO RINNOVARE una sessione esistente SOLO SE la sessione è EFFETTIVAMENTE ESISTENTE. Questo perché come dice ad un certo punto nell'indirizzo che ho su indicato
    "Un attaccante malevolo potrebbe richiamare ciclicamente una qualsiasi pagina del sito costringendo il server a generare innumerevoli sessioni diverse. Questo potrebbe svuotare la riserva di entropia del generatore di numeri casuali del server, e costringere il server a ricorrere al generatore di numeri pseudo-casuali, meno sicuri dal punto di vista crittografico."
    Evitando di fare ironia su un attaccante che si basi su un concetto del genere, l'articolo che citi parla chiaramente di "programmatore paranoico". Se vuoi avventurarti su quel sentiero, accomodati pure, ma non sperare nella mia approvazione.

    Originariamente inviato da gianf_tarantino
    Il fatto è ke alcuni servizi che vengono offerti trattano dati "DAVVERO" importanti per cui nessuna precauzione è mai troppa. Pensa che per le aree riservate ho usato l'https!
    E hai fatto benissimo. L'https è una misura seria, non l'entropia del generatore di numeri casuali.

    Originariamente inviato da gianf_tarantino
    Il fatto è ke l'accesso di utenti previsto per il sito è davvero alto, nell'ordine delle migliaia. Per questo nn voglio appesantire troppo il DB che è già sovraccarico.
    Ma non ti premeva la sicurezza prima di tutto?

  7. #7
    Luca, scusa se ti rispondo solo ora.

    Fammi capire una cosa.

    Quando io accedo alle pagine interne e fornisco login e password, entro nelle pagine riservate. Fin qui ci siamo.
    Io, salvando nella sessione login e password, in ogni pagina richiamo il file controllo.inc che mi controlla se quella login e password esistono effettivamente nel DB.
    Faccio questo perché se qualcuno dall'esterno supponiamo riesca in qualche modo a simulare una sessione php e a farla passare come buona al sistema, quest'ultimo fa un ulteriore controllo che è quello della validità della login e della password presenti nelle sessioni.
    Oppure stò fuori strada e non ho ben capito l'uso delle sessioni e come e quando possono essere "sniffate"? Anche perché da quello che tu mi dici, una sola volta tu controlli login e password, quando invece mi era parso di capire leggendo varie discussioni che converrebbe validare sempre l'utente.

    Il problema è anche un altro. Quando il sistema su cui sto lavorando è stato messo su, si è usati la direttiva del php.ini

    register_globals = On


    Questo vuol dire che automaticamente anche le variabili presenti nella sessioni, saranno globali. Quindi, in realtà, per scavalcare le sessioni (almeno penso) basterebbe forse inviare delle variabili con lo stesso nome di quelle delle sessioni ed il gioco è fatto. O sbaglio qualcosa?

    Comunque sto facendo un gran lavoro cercando di riconvertire tutte le pagine php nell'ottica di disabilitare la direttiva register_globals = On
    mettendola ad Off e sfruttando, così, le variabili predefinite del php, $_SESSION, $GLOBALS, etc.......

    In realtà se proprio la devo dire tutta, sto anche riprogettando il DB in modo che risulti normalizzato (adesso non lo è proprio!) cercando di avere un occhio per l'efficienza, anche se mi dovesse costare di penalizzare un pò la normalizzazione.

  8. #8
    C'è nessuno?

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da gianf_tarantino
    Faccio questo perché se qualcuno dall'esterno supponiamo riesca in qualche modo a simulare una sessione php e a farla passare come buona al sistema, quest'ultimo fa un ulteriore controllo che è quello della validità della login e della password presenti nelle sessioni.
    Non è un "ulteriore controllo", è uno spreco di risorse e basta. Senza considerare che salvando la password in sessione la esponi ad essere carpita da qualcuno che in qualsiasi maniera riuscisse a mettere le mani sul file della sessione.
    Se io riesco a simulare una sessione esistente, mi approprio del nome utente e password che tu hai salvato in quella sessione. Di conseguenza tu mi convaliderai, e il tuo controllo non serve a nulla.
    Se vuoi avere protezione assoluta dalle sessioni "sniffate" l'unico modo è tenere TUTTA L'APPLICAZIONE sotto https.

  10. #10
    Ok, grazie.
    Fin qui ci siamo ed in effetti uso https.

    Ora, prima ho scritto che "devo" per ora usare la direttiva

    register_globals = On

    Questo vuol dire che automaticamente anche le variabili presenti nella sessioni, saranno globali. Quindi, in realtà, per scavalcare le sessioni (almeno penso) basterebbe forse inviare delle variabili con lo stesso nome di quelle delle sessioni ed il gioco è fatto. O sbaglio qualcosa?

    Mi dici se è corretto questo che ho scritto o è una baggianata?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.