Visualizzazione risultati 1 fino 10 di 10

Discussione: Problema sicurezza modifica e invio dati

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito Problema sicurezza modifica e invio dati

    Ciao

    Ho creato un sistema di login mediante il quale un utente per entrare nel suo pannello di controllo e per modificare suoi articoli deve prima autenticarsi.

    La sicurezza sull'accesso alle pagine protette del sito accessibili solo agli utenti registrati sembra funzionare.

    Ho riscontrato però un problema sull'invio e la modifica degli articoli (con immagini) dei singoli utenti.
    L'utente loggato modifica gli articoli in base al suo id (che ho salvato in sessione permettendo così di spostarsi tra le varie pagine) ad ogni articolo insomma viene associato anche l'ID dell'utente per identificare lo stesso.
    Mi sono accorto però che modificando nel browser
    L'id dell'articolo ad esempio:

    Codice PHP:
    http://localhost/multigallery/manager.php?task=mod1&id=12
    al posto del 12 (l'id del singolo articolo che "appartiene" all'utente loggato)

    inserisco 9, sempre nella barra degli indirizzi, si visualizzano i dati di un articolo relativi ad un altro utente che io posso modificare impunemente.

    La tabella che contiene i dati dell'articolo, come avete già capito, è unica per tutti e tutti gli articoli sono identificati con l'id utente (quindi ID_articolo, ID_utente, nome, descrizione, ecc ecc per essere chiari).

    Come possono evitare questa falla nella sicurezza impedendo a utenti malintenzionati di cancellare e modificare (provando ad inserire ID) articoli non propri?

    Grazie

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,752

    Predefinito

    Se hai detto di salvare l'id nelle sessioni, perché non usi quelle, visto che sono "sicure" ?

    Cioè, invece di aprire la pagina leggendo da $_GET['id'] perché non usi $_SESSION['id'] ??

    ..forse non ho capito il problema...

    Ciao!

  3. #3
    L'avatar di matt93
    matt93 non è connesso Utente
    Data registrazione
    01-09-2008
    Messaggi
    241

    Predefinito

    Semplicemente, dopo aver reperito via $_GET l'id dell'articolo fai una query al database per vedere se l'autore dell' articolo corrisponde all'utente attualmente loggato!

    Codice PHP:
    <?php
    $article_id
    =(isset($_GET['id']) && is_numeric($_GET['id'])) ? $_GET['id'] : 0;
    // La variabile da dove peschi l'ID dell'utente attualmente connesso, un $_SESSION o nel caso delle API di phpBB3 $user->data['user_id']
    $my_user_id=$user->data['user_id'];
    // Query alla tabella
    $q=mysql_query("SELECT * FROM articles WHERE ID_articolo='".$article_id."' AND ID_utente='".addslashes($my_user_id)."' LIMIT 1;");
    if(
    mysql_num_rows($q)==0){
    die(
    "Stai modificando un'articolo inesistente o non di tua proprietà!");
    }
    ?>

  4. #4
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da matt93 Visualizza messaggio
    Semplicemente, dopo aver reperito via $_GET l'id dell'articolo fai una query al database per vedere se l'autore dell' articolo corrisponde all'utente attualmente loggato!

    Codice PHP:
    <?php
    $article_id
    =(isset($_GET['id']) && is_numeric($_GET['id'])) ? $_GET['id'] : 0;
    // La variabile da dove peschi l'ID dell'utente attualmente connesso, un $_SESSION o nel caso delle API di phpBB3 $user->data['user_id']
    $my_user_id=$user->data['user_id'];
    // Query alla tabella
    $q=mysql_query("SELECT * FROM articles WHERE ID_articolo='".$article_id."' AND ID_utente='".addslashes($my_user_id)."' LIMIT 1;");
    if(
    mysql_num_rows($q)==0){
    die(
    "Stai modificando un'articolo inesistente o non di tua proprietà!");
    }
    ?>



    ho inserito la tuo soluzione nel mio codice:

    Codice PHP:
    ....

    $idute=$_SESSION['iduser'];

    $query = "SELECT * FROM images WHERE Id = '$modifica_id' AND id_user = '$idute'";
    if(
    mysql_num_rows($query)==0){
    die(
    mysql_error());
    }

    ....
    ricevo però un messaggio di errore del tipo:

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\Programmi\xampp\htdocs\multigallery\manager.php on line 178
    Stai modificando un'articolo inesistente o non di tua proprietà!

    la linea 178 è proprio questa:

    if(mysql_num_rows($query)==0){


    se non aggiungo il codice di errore e mi limito ad aggiungere alla query solo il controllo dell'id user

    Codice PHP:
    $query = "SELECT * FROM images WHERE Id = '$modifica_id' AND id_user = '$idute'";
    se provo a fare il trucchetto di cui sopra (da browser come spiegato) non vedo in pratica l'articolo da modificare...sembra funzionare.

    Ma vorrei capire il perchè di quell'errore e se la mia modifica è efficace secondo te.



    Grazie
    Ultima modifica di gianlucaweb : 11-04-2010 alle ore 19.28.25

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,752

    Predefinito

    Codice PHP:
    $idute=$_SESSION['iduser'];
    $query = "SELECT * FROM images WHERE Id = '$modifica_id' AND id_user = '$idute'";
    if(
    mysql_num_rows($query)==0){
    die(
    mysql_error());
    }
    Qui non esegui la query...

    Metti così:

    Codice PHP:
    $idute=$_SESSION['iduser'];
    $query = "SELECT * FROM images WHERE Id = '$modifica_id' AND id_user = '$idute'";
    mysql_query($query);
    if(
    mysql_num_rows($query)==0){
    die(
    mysql_error());
    }
    ..perché la mia soluzione non va bene? (quella di vedere il session_start())...

    Ciao!

  6. #6
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    ..perché la mia soluzione non va bene? (quella di vedere il session_start())...

    Ciao!
    si si me n'ero accorto del problema della query adesso così sembra funzionare:

    Codice PHP:

    $idute
    =$_SESSION['iduser'];

    $query = "SELECT * FROM images WHERE Id = '$modifica_id' AND id_user = '$idute' LIMIT 1"; //VEDERE QUI
    $esegui = mysql_query($query);

    $num_rows = mysql_num_rows($esegui);

    if(
    $num_rows==0){
    die(
    "Stai modificando un'articolo inesistente o non di tua proprietà!");
    }

    In merito alla tua soluzione non va bene (ma forse sono io che non ho capito tutto..non sono un esperto anzi) perchè l'identificazione dell'utente nella pagina tramite id la faccio già e che mi sono accorto che un utente comunque loggato poteva modificare anche gli altri articoli quindi c'era bisogno di un ulteriore controllo incrociato, altrimenti forse dovrei fare dei cambiamenti più radicali al sistema di protezione delle pagine. Magari, ripeto, c'è qualcosa che mi sfugge e potresti rendermi la faccenda più chiara .

    Grazie
    Ultima modifica di gianlucaweb : 11-04-2010 alle ore 19.56.43

  7. #7
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,752

    Predefinito

    invece di controllare con l'id via get, usa le sessioni: un dato dentro le sessioni è impossibile modificarlo, visto che è salvato sul server

    ...cioè io eviterei anche l'uso del get... no?

    Ciao!

    EDIT:

    ..perché la mia soluzione non va bene? (quella di vedere il session_start())...
    Solo adesso mi son accorto: non volevo dire session_start(), ma $_SESSION

  8. #8
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    invece di controllare con l'id via get, usa le sessioni: un dato dentro le sessioni è impossibile modificarlo, visto che è salvato sul server

    ...cioè io eviterei anche l'uso del get... no?

    Ciao!

    EDIT:



    Solo adesso mi son accorto: non volevo dire session_start(), ma $_SESSION


    sul fatto di evitare l'uso del get ci sto pensando

    per il resto...non ci siamo capiti ancora credo.

    Grazie

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,752

    Predefinito

    sai cosa sono le sessioni?

    Ciao!

  10. #10
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    sai cosa sono le sessioni?

    Ciao!
    ti ho detto di si.

    Le sto utilizzando in questo lavoro e che (magari così come è impostato il tutto)
    non sono sufficienti.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •