Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Visualizzare X oggetti di X Utente / Login utente

    Salve a tutti , sono un ragazzo di 18 anni che si è affacciato da poco al php , quindi chiedo scusa in anticipo in caso di gravi errori di compilazione.

    Dopo aver iniziato ad apprendere le basi del mysql+php , sto facendo alcuni siti di prova e mi sono sorti due problemi, seppur non troppo complessi (credo):


    1. Nel sito che sto attualmente progettando c'è un negozio con determinati oggetti (inseriti in una tabella "oggetti dal database), ogni utente ,tramite crediti , può acquistare questi oggetti . Ora il problema è il seguente:
    Come faccio a creare una pagina in cui mostro tutti gli oggetti acquistati dall' utente connesso?


    2. Per effettuare il login ho messo due semplici form in html che attraverso il get , mandano i valori ad una pagina php (cioè la home) che a sua volta fa un semplice confronto tra i campi del database e i valori inseriti.




    Vi posto tutto il codice di home.php (all' inizio controllo attraverso i cookie se l' utente ha già effettuato l'accesso o se deve/si e' appena registrato (ditemi se esiste un modo più semplice o comunque più efficace)) .






    codice:
    <?php
    
    
    include ("config.php");
    
    
    
    
    $nome="";
    @$nome=$_COOKIE['utente'];
    
    
    
    
    if($nome!="")
    {
    $query = "SELECT uid, name,email, password, crediti,autorizzazione FROM utenti WHERE name = '$nome'";
    $result = mysql_query($query, $myconn) or die('Errore...');
    
    
     
        $resrow = mysql_fetch_row($result);
        $name = $resrow[1];
    	$crediti = $resrow[4];
    	$aut = $resrow[5];
    
    
    
    
    if ($aut==1)
    {
    $grado = "amministratore";}
    else
    {
    $grado = "utente"; 
    }	
    
    
    
    
    echo "Bentornato $nome<br> ";
    echo "$crediti <img src='img/crediti.png'></img><br>";
    echo "Hai i privilegi da $grado<br><br>";
    echo "Clicca <a href='logout.php'>Qui</a> per disconnetterti";
    
    
    }
    else
    {
    
    
    
    
    
    
    @$nome = $_GET['nome'];
    @$password = $_GET['pass'];
    
    
    
    
    $query = "SELECT uid, name,email, password, crediti FROM utenti";
    $result = mysql_query($query, $myconn) or die('Errore...');
    $numrows = mysql_num_rows($result);
    
    
    
    
    $x=0;
    $flag="errato";
    
    
    while($x<$numrows&&$flag=="errato"){
     $resrow = mysql_fetch_row($result);
    if($nome==$resrow[1]&&$password==$resrow[3]){
    $flag="corretto";}
    else
    {
    $flag="errato";
    }
    $x=$x+1;
    }
    if($flag=="corretto")
    {
    $nome = $_GET['nome'];
    
    
    echo "Benvenuto $nome , hai effettuato correttamente l' accesso";
    header('refresh: 1; url=home.php');}
    
    
    else
    
    
    
    
    {
    echo "Nome e/o password errati , o non inseriti , redirect al login";
    header('refresh: 2; url=login.php');}
    }
    
    
    setcookie("utente", @$nome, time()+3600);
    setcookie("crediti",@$crediti, time()+3600);
    setcookie("grado", @$aut, time()+3600);
    
    
     mysql_close() 
    ?>



    Il tutto mi sembra abbastanza "instabile" a livello di sicurezza , qual' è il modo più sicuro e/o utilizzato per login ?






    -Spero di essermi spiegato bene , e grazie in anticipo-

  2. #2
    Ciao

    le informazioni "sensibili" vanno gestite solitamente con variabili di sessione.

    Le variabili di sessione sono informazioni che restano lato server e che "sopravvivono" tra una richiesta HTTP e l'altra, consentendoti di sapere -ad esempio- se la richiesta che stai gestendo è di un utente che ha già fatto il login (e nel caso quale utente, etc etc etc).

    Come hai già notato da solo il fatto di usare i cookie non va bene, in quanto lato client sarebbe possibile cambiare i cookie e quindi saltare i tuoi controlli.

    Per l'utilizzo delle sessioni è sufficiente chiamare la funzione

    session_start();

    prima di qualsiasi comando di echo o in genere di output, questo invierà automaticamente al browser un cookie speciale (chamato solitamente PHPSESSID) che consentirà al server di riconoscere il client.

    Per salvare o leggere le informazioni dalla sessione è sufficiente che tu operi sulla variabile $_SESSION che viene gestita come un array.

    Per maggiori info guarda qui:

    http://www.php.net/manual/it/book.session.php

    esempio, per salvare un dato in sessione basta fare:

    Codice PHP:
    <?php
    session_start
    ();
    if(!isset(
    $_SESSION["pippo"])){
    $_SESSION["pippo"]=0;
    }

    $_SESSION["pippo"]++;

    echo 
    "Pippo = ".$_SESSION["pippo"];
    ?>
    Se tu richiami ripetutamente questa pagina vedrai aumentare il valore di Pippo, questo fino a quando non ti scade la sessione o non usi un'altro browser.

    Infine altre due note:

    nel tuo codice non fai il sanitize dell'input: questa è una cosa molto grave perchè consenti ad un utente malintenzionato di iniettare codice sql nelle tue applicazioni, con potenziali problemi molto seri in termini di sicurezza e protezione dei dati (vedi sql injection)

    usa sempre una libreria di astrazione dal db: oltre che rendere il tuo codice più portabile da un database all'altro è anche più leggibile e semplice, vedi ad esempio PDO.

    http://it1.php.net/pdo_mysql

    Ciao
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Da ex bug hunter:

    # config.php
    Codice PHP:
    <?php
    /**
     * config.php
     * 
     * Funzioni di gestione database
     *
     * @author Your Name <your@email.com>
     * @copyright Copyleft (c) 2014, Your Name
     */

    /**
     * Connession, selezione e selezione codifica caratteri al database
     *
     * @param    void
     * @return    void
     */
    function dbConnect() {
        
    $dbHost "";
        
    $dbName "";
        
    $dbUser "";
        
    $dbPass "";
        
        if ( !
    $dbConnect = @mysql_connect$dbHost$dbName$dbUser$dbPass ) ) {
            exit( 
    "Impossibile connettersi al database." );
        }
        
        if ( !@
    mysql_select_db$dbName$dbConnect ) ) {
            exit( 
    "Impossibile selezione il database." );
        }
        
        
    // Richiesto per prevenire il bypass delle funzioni di escaping
        
    @mysql_query"SET NAMES 'utf8'" );
    }

    /**
     * Esegue le query proteggendole da attacchi SQL Injection
     *
     * @param    string        Stringa query da eseguire
     * @param    array        Argomenti da passare alla query
     * @return    resource    Resource id della query
     */
    function dbQuery$query$params = array() ) {
        global 
    $dbConnect;

        
    // Verifica che ci siano parametri da inserire, eventualmente li cicla e li purifica
        
    if ( count$params ) ) {
            foreach ( 
    $params as $key => $value ) {
                
    $params[$key] => mysql_real_escape_string$query );
            }
        
            
    $query vsprintf$query $params );
        }
        
        
    // Esegue la query
        
    if ( !$queryId = @mysql_query$query$dbConnect ) ) {
            exit( 
    mysql_error() );
        }
        
        return 
    $queryId;
    }
    ?>
    *.php
    Codice PHP:
    <?php
    /**
     * 
     * 
     * 
     *
     * @author Your Name <your@email.com>
     * @copyright Copyleft (c) 2014, Your Name
     */

    // Costanti fondamentali
    define"DS"DIRECTORY_SEPARATOR );
    define"ROOT_PATH"dirname__FILE__ ) . DS );
     
    // Include le librerie fondamentali
    require_once( ROOT_PATH "config.php" );

    // Connessione e selezione al database
    dbConnect();

    // Dati cookie provenienti dall'utente
    $data = array();
    $data["nome"] = isset( $_COOKIE["nome"] ) ? $_COOKIE["nome"] : "";
    $data["pass"] = isset( $_COOKIE["pass"] ) ? $_COOKIE["pass"] : "";

    // Verifica se l'utente è loggato
    if ( $data["nome"] != "" && $data["pass"] != "" ) {
        
    $query    "SELECT uid, name,email, password, crediti,autorizzazione FROM utenti WHERE name = '%s' AND password = '%s' LIMIT 1";
        
    $result dbQuery$query$dbConnect );
        if ( 
    mysql_num_rows$result ) == ) {
            
    $resrow mysql_fetch_array$result );
            echo 
    "Bentornato " htmlspecialchars$resrow["name"] ) . "<br>";
            echo 
    intval$resrow["crediti"] ) . " <img src='img/crediti.png'></img><br>";
            echo 
    "Hai i privilegi da " . ( $resrow["autorizzazione"] == "amministratore" "utente" ) . "<br><br>";
            echo 
    "Clicca <a href='logout.php'>Qui</a> per disconnetterti";
            exit;
        }
    }

    // Verifica se l'utente sta eseguendo il login
    if ( !defined"IS_USER" ) && isset( $_POST["nome"] ) && isset( $_POST["pass"] ) ) {
        
    $query    "SELECT uid, name,email, password, crediti,autorizzazione FROM utenti WHERE name = '%s' AND password = '%s' LIMIT 1";
        
    $result dbQuery$query$dbConnect );
        if ( 
    mysql_num_rows$result ) == ) {
            
    $resrow mysql_fetch_array$result );        
            
    setcookie"nome"    $resrow["name"]     , time()+3600 );
            
    setcookie"crediti"$resrow["crediti"] , time()+3600 );
            
    setcookie"pass"    $resrow["password"], time()+3600 );
            
            echo 
    "Benvenuto " htmlspecialchars$resrow["name"] ) . ", hai effettuato correttamente l' accesso.";
            
    header"refresh: 3; url=home.php" );
            exit;
        }
    }

    // Errori?
    if ( isset( $_POST["login"] ) ) {
        echo 
    "<font color='red'>Utente e/o Password errata.</font><br />";
    }

    echo <<<TPL
    <form method="POST">
    Nome Utente: <input type="text" name="nome"><br />
    Password: <input type="password" name="pass"><br />
    <input type="submit" name="login" value="Accedi">
    </form>
    TPL;

    mysql_close$dbConnect ): 
    ?>
    Così non è hackerabile da nessuna tecnica attualmente conosciuta.

    Lo soluzione da te postata può essere hackerata nel seguente modo:

    1) creare un cookie utente con il nick dell'admin.
    2) se non si è a conoscenza del nick dell'admin o della struttura della piattaforma, bisogna eseguire diversi steps per scoprire nomi e struttura della tabella e infine estrarre i dati dal database, creando sempre un cookie con dice sql maligno.
    Ultima modifica di zacca94; 24-04-2014 a 15:00

  4. #4
    Innanzitutto vi ringrazio per le risposte .



    Per il primo problema ho ovviato in questo modo :
    creo una tabella nel database con un campo "id" in cui viene inserito l' id dell utente che ha acquistato l' oggetto . ("oid" e' l' id dell oggetto)


    oid---id---nome


    78---18---Sapone


    79---18---Acqua


    80---18---Latte


    81---17---Latte


    82---16---Latte


    83---16---Caffe



    Dopo , quando andiamo a visualizzare , uso la funzione WHERE, in questo modo


    Codice PHP:
    $id $_COOKIE['id'];
    echo 
    "<center><br><hr> I TUOI OGGETTI </CENTER>";
    $query "SELECT  nome FROM o_utenti WHERE id = '$id' ";
    $result mysql_query($query$myconn) or die('Errore...'); 

    Correggetemi se qualche passaggio è sbagliato , o la compilazione e' vulnerabile.

    Per il login pensavo fosse molto più complesso il discorso , il mio codice era solo una prova per testare l' efficacia del sito , quindi una compilazione (spartana) di prova.
    Con i metodi da voi consigliati , se sono davvero così efficaci , non credo di aver tanti problemi nell' adattarlo.

    Ora però , essendo nuovo a questo linguaggio , chiedo cortesemente qualcuno può spiegarmi alcune funzioni:


    1. Qual' è l' utilità nell' incremento del valore di sessione?

    2. Cosa si intende con sanitize dell' input?

    3. Cosa servono queste funzioni?
    Codice PHP:
    // Costanti fondamentali
    define"DS"DIRECTORY_SEPARATOR );
    define"ROOT_PATH"dirname__FILE__ ) . DS );
     
    // Include le librerie fondamentali
    require_once( ROOT_PATH "config.php" ); 

    4. Qual' e' il contenuto effettivo della variabile $array?
    Codice PHP:
    // Dati cookie provenienti dall'utente
    $data = array();
    $data["nome"] = isset( $_COOKIE["nome"] ) ? $_COOKIE["nome"] : "";
    $data["pass"] = isset( $_COOKIE["pass"] ) ? $_COOKIE["pass"] : ""

    Grazie ancora , e scusate se eccedo nel farvi domande.
    Ultima modifica di alfredom15; 24-04-2014 a 16:49

  5. #5
    ciao

    - l'incremento del valore di sessione non ha alcuna utilità: era solo un esempio per farti capire come funzionava
    - il sanitize dell'input significa "bonificare" i parametri che ti vengono passati dagli utenti, nel tuo codice iniziale se io mettessi nel campo user 1' or '1'='1 avrei accesso anche senza sapere la password perchè tu vai a concatenare l'input dell'utente alla stringa SQL e questo può comportare la creazione di un sql di questo tipo:

    select * from account where user='pippo' and password='1' or '1'='1'

    che restituirà tutti i record nella tabella.

    La cosa ha potenzialmente delle implicazioni molto più pericolose, come ad esempio:

    select * from account where user='pippo' and password='1' or id_account in (drop table xxx) or '1'='1'


    etc etc etc....

    Nell'esempio di zacca94 ti viene mostrato come usare una funzione che tramite mysql_real_escape_string effettua la "bonifica" di quanto scritto dall'utente, convertendo una stringa come 1'1 in 1\'1.

    In genere io comunque ti consiglio di usare delle librerie di astrazione (come PDO,MDB2 o altre) ed effettuare il bind dei parametri.


    Ciao
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Si oltretutto riguardando per caso ho notato che questo:
    $params[$key] => mysql_real_escape_string( $query );

    Deve essere sostituito con questo:
    $params[$key] => mysql_real_escape_string( $value);

    2. Cosa si intende con sanitize dell' input?


    Purifica, impedisce di venire "hackerato".

    3. Cosa servono queste funzioni?


    Teoricamente a niente.
    Praticamente fai l'echo delle costanti o funzioni e vedi cosa restituisce.

    4. Qual' e' il contenuto effettivo della variabile $array?


    Nessuno, viene definita prima del suo utilizzo. Come deve essere fatto sempre, invece di utilizzare la @ per silenziare gli errori.

    Anzi, ti consiglio di inserire error_reporting(E_ALL); in cima ad ogni file, togliere tutte le @ e correggere gli errori.

  7. #7
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    Si oltretutto riguardando per caso ho notato che questo:
    $params[$key] => mysql_real_escape_string( $query );

    Deve essere sostituito con questo:
    $params[$key] => mysql_real_escape_string( $value);



    Purifica, impedisce di venire "hackerato".



    Teoricamente a niente.
    Praticamente fai l'echo delle costanti o funzioni e vedi cosa restituisce.



    Nessuno, viene definita prima del suo utilizzo. Come deve essere fatto sempre, invece di utilizzare la @ per silenziare gli errori.

    Anzi, ti consiglio di inserire error_reporting(E_ALL); in cima ad ogni file, togliere tutte le @ e correggere gli errori.

    Anche cambiando con $value mi continua a dare sempre il seguente errore :

    Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW) in C:\* on line 48

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    si ci sono un paio di errori dettati da distrazione

    $result = dbQuery( $query, $dbConnect );

    con

    $result = dbQuery( $query, $data);

    Mentre il secondo:

    $result = dbQuery( $query, array( $_POST["user"], $_POST["pass"] ));

    E nel form devi inserire name="pass" invece di "password"

  9. #9
    Quote Originariamente inviata da nik600 Visualizza il messaggio
    ciao

    - l'incremento del valore di sessione non ha alcuna utilità: era solo un esempio per farti capire come funzionava
    - il sanitize dell'input significa "bonificare" i parametri che ti vengono passati dagli utenti, nel tuo codice iniziale se io mettessi nel campo user 1' or '1'='1 avrei accesso anche senza sapere la password perchè tu vai a concatenare l'input dell'utente alla stringa SQL e questo può comportare la creazione di un sql di questo tipo:

    select * from account where user='pippo' and password='1' or '1'='1'

    che restituirà tutti i record nella tabella.

    La cosa ha potenzialmente delle implicazioni molto più pericolose, come ad esempio:

    select * from account where user='pippo' and password='1' or id_account in (drop table xxx) or '1'='1'


    etc etc etc....

    Nell'esempio di zacca94 ti viene mostrato come usare una funzione che tramite mysql_real_escape_string effettua la "bonifica" di quanto scritto dall'utente, convertendo una stringa come 1'1 in 1\'1.

    In genere io comunque ti consiglio di usare delle librerie di astrazione (come PDO,MDB2 o altre) ed effettuare il bind dei parametri.


    Ciao
    Perfetto , grazie per avermi chiarito le idee.
    Quindi per bonificare i parametri dell' utenti con mysql_real_escape_string viene effettuato in automatico?
    Ipotizzando un utente malintenzionato non potrebbe bypassare il comando?

  10. #10
    Quote Originariamente inviata da zacca94 Visualizza il messaggio
    si ci sono un paio di errori dettati da distrazione

    $result = dbQuery( $query, $dbConnect );

    con

    $result = dbQuery( $query, $data);

    Mentre il secondo:

    $result = dbQuery( $query, array( $_POST["user"], $_POST["pass"] ));

    E nel form devi inserire name="pass" invece di "password"

    Il problema continua a darmelo in config.php nella riga 45

    $params[$key] => mysql_real_escape_string( $value);
    Con questo errore :

    Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW) in config.php on line 48

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.