• User Newbie

    Problema con variabili estrapolate da MySql in PHP5

    Sì, lo so, avrei dovuto farlo molto tempo fa, ma mi sono deciso solo adesso a passare a PHP5.
    Da vecchio smanettone, ho trovato tutto quello che mi serve per adattare/modificare 20 anni di file.
    Però mi sono impiantato su una facility che mi sono voluto creare.
    Mi ero creato un file che contiene la conversione delle variabili che incontravo via via che mi apparivano i vari "Notice: Undefined variable: [variabile] in C:[path]".
    Una serie di righe come queste che seguono:
    if(isset($_GET['id'])) { $id = $_GET['id']; } else { $id = ""; }
    if(isset($_GET['id_cli_orig'])) { $id_cli_orig = $_GET['id_cli_orig']; } else { $id_cli_orig = ""; }
    if(isset($_GET['id_dom'])) { $id_dom = $_GET['id_dom']; } else { $id_dom = ""; }
    if(isset($_GET['id_mnt_orig'])) { $id_mnt_orig = $_GET['id_mnt_orig']; } else { $id_mnt_orig = ""; }

    oppure
    if(isset($_POST['ggx'])) { $ggx = $_POST['ggx']; } else { $ggx = ""; }
    if(isset($_POST['giorno'])) { $giorno = $_POST['giorno']; } else { $giorno = ""; }
    if(isset($_POST['id'])) { $id = $_POST['id']; } else { $id = ""; }
    if(isset($_POST['ids'])) { $ids = $_POST['ids']; } else { $ids = ""; }

    Ovvio che ho voluto sveltire. Così mi sono creato una tabella, contenente i nomi di tutte le variabili e ho scritto il seguente codice, che però non funziona: il messaggio d'errore continua a comparirmi.
    Qualcuno sa dirmi dove sbaglio? Grazie in anticipo per ogni aiuto.

    $sql_var = "SELECT Var FROM 98_var ORDER by Var";
    $sql_result_var = mysql_query($sql_var,$connection) or die(mysql_error());
    while ($ValoriRiga_var = mysql_fetch_array($sql_result_var))
    {
    $var = $ValoriRiga_var ["Var"];
    $varout = "$".$var;

    if(isset($_GET['$var'])) { $varout = $_GET['$var']; } else { $varout = ""; } 
    

    }
    mysql_free_result($sql_result_var);


  • ModSenior

    Ciao,
    al massimo dovrebbe essere:

    
    $sql_var = "SELECT Var FROM 98_var ORDER by Var"; 
    $sql_result_var = [mysql_query](http://www.giorgiotave.it/wikigt/os/Mysql_query)($sql_var,$connection) or die([mysql_error](http://www.giorgiotave.it/wikigt/os/Mysql_error)()); 
    while ($ValoriRiga_var = mysql_fetch_array($sql_result_var)) 
    { 
         $nome_variabile = $ValoriRiga_var ["Var"]; 
         if(isset($_GET[$nome_variabile])) { $$nome_variabile = $_GET[$nome_variabile]; } else { $$nome_variabile = ""; } 
    } 
    mysql_free_result($sql_result_var);
    
    

    Anche se utilizzare cosi una tabella del database è abbastanza assurdo, oltre che inutile. Poi lo rifai anche per evitare SQL INJECTION o quelle le ignori completamente?


  • User Newbie

    Grazie molte per l'indicazione. Finalmente ho risolto e ho (spero) imparato qualcosa. Quindi doppio grazie.
    Per quanto riguarda l'uso della tabella, in effetti potrei usare foreach. Immagino che ti riferissi a quello. Ammetto che è una pigrizia, dovuta alla migliore visibilita per me, quando controllo se una variabile esiste o no.
    Invece non ti seguo (certamente per mia ignoranza, che è tantissima) sulla SQL INJECTION. I dati in tabella sono inseriti da me manualmente, non con un form. Certo anche questo non è elegante, ma sono le conseguenze dell'avere smanettato tanti anni, imparando da sé: ci si trascinano i vizi, ai quali però siamo affezionati.
    Sempre disposto ad imparare però, nel caso si abbia la pazienza ti insegnarmi.
    Grazie ancora.


  • User

    Si riferisce alla GET passata senza nessun controllo direttamente al database, quello è il metodo sicuro per farsi "bucare" il database e poi estrarre i dati in modo fraudolento. (detto in parole povere)
    In pratica le SQL Injection o iniezione di codice SQL in modo fraudolento sono proprio questo, si inserisce un pezzo di query tramite un form e si "buca" il database, se non ci si sta attenti ai dati immessi il rischio è enorme. Per esempio proprio quest'anno a Udine un ragazzino di 14 anni ha messo in rete tutte le cartelle cliniche dell'ospedale di Udine con una SQL Injection vecchia come il cucco ( 1 = 1 ) eppure il sistema era fornito e manutenuto da una grossa ditta regionale...
    Ora che tu dici di riempire il database a mano va bene, ma è buona pratica stare attenti a quelle cose, una GET o un POST non si passano mai direttamente senza prima fare un controllino a ciò che contengono, anche perché se si tratta di GET non serve il form per manipolarli, basta la barra degli url del browser.
    Infine se usi PHP5 studiati l'uso dei filtri e magari usa mysqli_ come funzioni che offrono una protezione superiore a quella delle vecchie funzioni che usi e che lo stesso PHP definisce deprecate ( vedi il manuale online alla pagina MySQL introduzione ).

    Ciao.


  • User Newbie

    Grazie per le indicazioni. Vedrò di capire se nel mio codice c'è qualche possibilita di SQL injection. Intendo dire che ci provano mille volte, ma ogni form viene prima controllato. E non uso mai GET. Il che però non mi tranquillizza del tutto. Mi studierò meglio la materia.


  • ModSenior

    Ciao,
    qui trovi una guida che ho scritto alcuni anni fa in merito all'argomento:
    http://www.giorgiotave.it/forum/scripting-e-risorse-utili/189074-guida-sql-injection.html

    Può esserti utile a capire meglio come avviene una SQL INJECTION e di conseguenza a come proteggerti.


  • User Newbie

    Grazie davvero, Thedarkita. È esattamente ciò che mi serve: sintetico, chiaro, efficace.


  • ModSenior

    Prego 🙂
    Se non capisci qualcosa, hai dubbi, o ti serve un aiuto chiedi pure nella discussione più appropriata per la tua domanda e appena possibile ti risponderò.

    :ciauz:


  • User Newbie

    Grazie. Non mancherò.