Visualizzazione dei risultati da 1 a 4 su 4

Hybrid View

  1. #1

    Parere su sicurezza login su webapp PHP

    Ciao, ho scritto una webapp in PHP che si appoggia ad un database mysql con PHPmyAdmin.


    La web App richiede un Login e volevo un parere sulla robustezza della sicurezza del mio sistema ed eventualmente un consiglio per migliorarla nel caso fosse insufficiente.


    Allora, per prima cosa l'Admin crea gli utenti e gli conferisce un livello utente (admin, superuser, user).
    Sul database vengono salvati i dati utente compreso il livello e la password codificata con Argon2ID.


    A questo punto l'utente può fare il login, il sistema di login confronta username e password con quanto salvato sul database e se corrisponde istanzia diverse variabili di sessione che riguardano l'utente, tra cui nome utente, e il suo livello. Tutte le pagine successive della webapp hanno in testa un controllo che verifica se esistono alcune di queste variabili che vengono istanziate solo in caso di login positivo. Se esistono e si tratta di una pagina che ha un livello di accesso elevato, il sistema controlla anche che la variabile di sessione "livello" dell'utente sia adeguata.


    Se tutti i controlli vanno a buon fine il sistema genera la pagina. Se anche solo uno va male (mancano delle var di sessione o il livello non è adeguato), lo script reinvia l'utente all'index.php


    Bene.... a che rischi mi espongo? Eventualmente come lo posso migliorare?


    Grazie!

  2. #2
    Ciao.
    Dipende....le variabili sono in cookies o nel db?
    Se sono in un cookie, per evitare che vengano intercettate e modificate, ti conviene criptare il cookie prima di inviarlo al webserver e decriptarlo appena arriva all'applicazione, per fare i controlli di coerenza del caso.
    In ogni caso ti conviene sempre fare un check sui dati in arrivo dal browser, per esempio se ti affidi a una variabile (GET o POST cambia poco) che contiene un ID (Es: 43, che è l'id dell'utente), ogni volta che fai una query dovrai "normalizzare" questo dato. Per esempio qualcosa del tipo
    $post->ID = intval( $post->ID);
    $query = $this->crea_query("seleziona_utente", $post->ID);
    Questo per cominciare...poi ci sono altre cosette da verificare

  3. #3
    Ciao, le variabili sono di tipo $_SESSION["varName"] e a quanto ho verificato vengono salvate tutte in un file relativo alla sessione utente che viene conservato nella cartella temp di Windows sul server, quindi è tutta roba lato server tanto che con JavaScript non si può accedere a queste variabili se non sfruttando AJAX. Poi leggendo cosa fa PHP, so che da un nome casuale e univoco al file di Sessione sul server, e salva un cookie sul computer dell'utente nel quale scrive il nome di questo file.... così quando il client fa una richiesta può sempre associarlo al suo file SESSION.

    Per quanto riguarda le normalizzazioni dei dati inseriti nelle form che poi vengono usati per interagire con il database uso trim() e mysqli_real_escape_string().

    Mi è stato consigliato anche di codificare la password e l'username immesso dall'utente in fase di login così che dal client al server venga trasmesso l'hash e non i dati in chiaro.... anche questa è una cosa da fare giusto?

  4. #4
    Quote Originariamente inviata da Legolas84 Visualizza il messaggio
    Ciao, le variabili sono di tipo $_SESSION["varName"] e a quanto ho verificato vengono salvate tutte in un file relativo alla sessione utente che viene conservato nella cartella temp di Windows sul server, quindi è tutta roba lato server tanto che con JavaScript non si può accedere a queste variabili se non sfruttando AJAX. Poi leggendo cosa fa PHP, so che da un nome casuale e univoco al file di Sessione sul server, e salva un cookie sul computer dell'utente nel quale scrive il nome di questo file.... così quando il client fa una richiesta può sempre associarlo al suo file SESSION.
    Il fatto che il webserver salvi la sessione su un file esterno alla basedir del sito non è importante, l'importante è che l'eventuale cookie impostato sul browser non sia "in chiaro". Se nel cookie puoi leggere le variabili e il loro valore, sei esposto a session hijacking, soprattutto se non fai controlli di coerenza una volta ricevuto il cookie indietro dal browser
    Quote Originariamente inviata da Legolas84 Visualizza il messaggio
    Per quanto riguarda le normalizzazioni dei dati inseriti nelle form che poi vengono usati per interagire con il database uso trim() e mysqli_real_escape_string().
    Utile ma non sufficiente...trim e escape vanno bene fino a un certo punto. Se non controlli l'imput passato dall'utente in modo approfondito, sei esposto a sql injections.
    Un esempio....
    Il tuo codice:
    codice:
    txtUserId = getRequestString("UserId");
    txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
    Se non "purifichi" UserID in modo corretto, ad esempio ti limiti a trim o a real_escape, io potrei passarti come valore (get o post è indifferente) "105 OR 1=1", che trasforma la tua query in
    codice:
    SELECT * FROM Users WHERE UserId = 105OR1=1;
    C'è da lavorarci un bel po' sopra, per sanificare i dati...
    Quote Originariamente inviata da Legolas84 Visualizza il messaggio
    Mi è stato consigliato anche di codificare la password e l'username immesso dall'utente in fase di login così che dal client al server venga trasmesso l'hash e non i dati in chiaro.... anche questa è una cosa da fare giusto?
    L'user name non è indispensabile, la password è decisamente meglio, possibilmente con una funzione a senso unico (tipo md5 e simili).
    Dal browser arriverà comunque sempre il dato in chiaro, dovrai fare lato php la criptazione per verificare che corrisponda a quanto salvato nel db (già criptato)

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.