• User Attivo

    @Mck said:

    io vorrei creare un metodo per autenticare e mantenere una sorta di "sessione di login" tramite database, con uno script che imposto io. Quindi senza utilizzare le sessioni di php.
    Ma sempre una sessione o un cookie dovresti usare (se proprio non ti fidi delle sessioni...) altrimenti l'utente, ogni volta che cambia o ricarica una pagina, sarebbe costretto a reinserire user e password!


  • User

    Ciao ragazzi,

    allora! Ho letto un pò a riguardo e finalmente ho trovato una guida esaustiva sulle sessioni.
    In pratica ho capito che, per evitare Session fixation, session hijacking, e altri problemi legati alle sessioni, basta rendere sicure le applicazioni da CrossSite Scripting ed SQL Injection, e salvare i dati di sessione su database anzichè su file testuali risiedenti su server.

    Quello che non ho capito esattamente è come salvare questi dati su database. Voi ne sapete qualcosa? Io naturalmente nel frattempo mi documento meglio.

    Devo dire che avevo tralasciato le sessioni tempo fa quando iniziai a studiare php, e me ne sto pentendo molto.

    Grazie per il supporto intanto. 🙂


  • User

    Fino ad adesso ho trovato due modi:

    • Creare sessioni manualmente con solo codice php+database;
    • session_set_save_handler();

    oppure?


  • User Attivo

    Ciao Mck,
    Io personalmente utilizzerei le sessioni di php.

    Se i permessi sono impostati correttamente risolvi il problema del crossSite, mentre per risolvere il problema dell'injection basta rigenerare la sessione ogni volta che si fa il session_start...

    Se non stai sviluppando un framework per l'FBI sei sufficientemente sicuro. 😉

    Inoltre, dove dovresti far girare tutto ciò, su un server proprietario?
    Perché se tutto gira su un hosting condiviso, allora è inutile preoccuparsi troppo: se vogliono bucarti il db, o il sito, stai pur certo che c'è almeno un furbone sulla tua stessa macchina che fornisce tutte le vulnerabilità necessarie ad entrare direttamente sul server.

    Ciao,
    Luca Bartoli


  • User

    in che senso se i permessi sono impostati correttamente?
    per prevenire XSS bisogna filtrare i dati in ingresso e uscita, no?

    Che mi dici invece per il furto dei cookie?

    Grazie


  • ModSenior

    Se un sito web non ha problemi di XSS, e nessuno può modificare le pagine, non c'è alcun pericolo di furto cookie.
    Utilizzare il database per le sessioni dovrebbe degradarne enormemente le prestazioni e l'utilizzo di risorse sale, a fronte di ciò che è a mio avviso un ipotetico incremento di sicurezza.

    Tu i problemi citati non esistono se effetti un opportuna validazione di tutti i dati di input, volendo ottenere comunque la massima sicurezza usare un sistema di crypt sui cookie memorizzando anche l'indirizzo IP abbatte qualsiasi possibilità che questo possa essere soggetto ad un furto.
    Questo sistema viene adottato ad esempio da codeigniter di default (Anche le sessioni vengono memorizzate in un cookie e non sul server), con rigenerazione dopo un certo intervallo di tempo, ma tale scelta è indicata non per motivi di sicurezza ma solo per dare maggior flessibilità agli sviluppatori.
    Salvare le sessioni su file o su database, all'atto pratico non fà tutta questa differenza, puoi gestirle tutte allo stesso modo.


  • User

    Però scusami, ho capito che utilizzare l'ip non è comunque molto conveniente.
    Un utente può utilizzare una connessione con IP dinamico, che addirittura cambia ad ogni richiesta di pagina, e quindi non poter mai trovare una corrispondenza tra lui/il suo computer e il cookie che gli è stato asssegnato nella pagina precedente.

    Senza considerare che i dati recuperati dalle variabili superglobali $_SERVER['REMOTE_ADDR'] non sono affidabili. Almeno così scrivono in molti e anche il mio libro di testo. Ma quasi non ci capisco più nulla.

    Riguardo le sessioni via database, eviterei problemi tipo Session Hijacking e avrei un maggiore controllo sulle sessioni, potrei comunque eseguire dei calcoli e delle statistiche. (Che posso comunque gestire anche utilizzando le sessioni di php).

    Se posso vorrei porvi due domande oltre quello scritto fin'ora:

    1. Quando si inizia una sessione, in automatico viene creato un cookie nel client con nome PHPSESSID, per modificare il nome di questo cookie mi basta scrivere session_name(nuovonome);?

    2. Quali sono secondo voi i migliori metodi per scongiurare falle di XSS?

    Filtrare tutti i dati in ingresso GET/POST con htmlentities e un preg_match specifico, può bastare?

    Grazie ancora! 🙂


  • ModSenior

    Con quello che fà htmlentities risolvi i problemi dei tag html, ovvio che se fai echo diretto in mezzo ad un tag script hai sempre problemi di XSS.
    Ogni dato deve essere trattato in base all'utilizzo che dovremo farne, non esiste una regola generale.
    Tutte le connessioni domestiche sono per lo più con IP dinamico, ma non cambiano IP con una frequenza così elevata nella realtà, a me è capitato un solo utente che avesse un cambio IP frequente su un numero immenso di utenti con cui ho avuto a che fare.

    Francamente prenderei con le pinze tutto ciò che si può leggere, tenendo in forte considerazione l'anno in cui certe cose vengono scritte(Anni fà la sicurezza è molto lasciata andare a se stessa, e register_global ad esempio comprometteva moltissimo la sicurezza), e la preparazione di chi le scrive, perchè non tutto quello che si legge in molti forum corrisponde alla verità, molte cose vengono riportare per sentito dire e finiscono con il cambiare di post in post.
    Ad esempio prova a cercare come si fa ad alterare $_SERVER['REMOTE_ADDR'] e provare a vedere se trovi come è possibile farlo in realtà.

    Anche utilizzando un database eventualmente non risolveresti, un confronto con qualcosa che ha il client devi sempre farlo per verificare sia effettivamente suo, una soluzione completa non esiste, ognuna può presentare degli aspetti "negativi".


  • User

    allora mi preparo una funzione anti XSS che in pratica:

    1. tramite preg_replace e un pattern ad hoc mi toglie tutti i caratteri che non mi aspetto in quel determinato contesto (Es. "£'$%&/,.-+).

    2. eseguo un htmlentities sul dato pulito per precauzione e per rendere la funzione utilizzabile su più ambiti.

    che te ne pare conterraneo?

    Potresti darmi un tuo parere su un mio dubbio esposto prima? Te lo riporto:

    1. Quando si inizia una sessione, in automatico viene creato un cookie nel client con nome PHPSESSID, per modificare il nome di questo cookie mi basta scrivere session_name(nuovonome);?

    Grazie!


  • ModSenior

    Direi che come soluzione, in linea generale, sia sufficiente.
    Si con session_name modifichi il nome del cookie.