• ModSenior

    Ciao Giuliox,

    sostituisci questo:
    [php]
    if (mysql_query($query, $conn))

    [/php]
    Con:
    [php]
    if (mysql_query($query, $conn) or die(mysql_error()))

    [/php]


  • User

    Grazie mille TheDarkIta.
    Gentilissimo come sempre 🙂

    Ho un altro problema ahimè, il campo citta non viene riempito.

    Questo è i lcodice che ho inserito nel mio form di iscrizione :

            <tr>
                    <td><p>Città:</p></td>
                    <td>
                    <select name="citta">
                    <?php
                    @include "config.php";
                    $stringa_query="select provincia from citta order by provincia";
                    $elenco_provincia=mysql_query($stringa_query) or die(mysql_error());
                    while($row_provincia=mysql_fetch_array($elenco_provincia)){
                    $sigla_procincia=$row_provincia[sigla];
                    $nome_provincia=$row_provincia[provincia];
                    echo "<option value=\"$sigla_provincia\">$nome_provincia</option>\n";
                    }
                    ?>
                    </select>
                    </td>
            </tr>
    

    e sopra puoi vedere come mi son "comportato" per inserirlo nel databse.

    Quando su phpmyamin verifico l'effettivo inserimento dei dati l'unico campo vuoto è appunto citta!
    Perchè?


  • ModSenior

    Sostituisci questo:
    [php]$stringa_query="select provincia from citta order by provincia";
    [/php]
    Con:
    [php] $stringa_query="select sigla,provincia from citta order by provincia";
    [/php]

    Invece di $row_provincia[sigla] sarebbe più corretto mettere $row_provincia['sigla'] anche perchè in quel modo dovrebbe generarti un notice perchè cerca la costante sigla.


  • User

    No, ahimè questa soluzione non porta da nessuna parte.

    La tabella citta è stata importata ed è composta dai seguenti campi :
    provincia
    regione (vincolo di integrità referenziale con un'altra tabella regione)
    sigla

    Tutti e 3 di tipo varchar, stesso tipo e stessa lunghezza del dato impostato nella tabella utente.
    Sembra tutto "lineare" invece inceppiamo in qualche stupidata...


  • ModSenior

    Intanto verifica che nel tuo form i value siano impostati correttamente, perchè prima non lo erano sicuramente, vedi un pò ora.


  • User

    @Thedarkita said:

    Sostituisci questo:
    [php]$stringa_query="select provincia from citta order by provincia";
    [/php]Con:
    [php] $stringa_query="select sigla,provincia from citta order by provincia";
    [/php]Invece di $row_provincia[sigla] sarebbe più corretto mettere $row_provincia['sigla'] anche perchè in quel modo dovrebbe generarti un notice perchè cerca la costante sigla.

    Se intendi questi value ho gia modificato tutto dal precedente intervento prima di dire che non funzionava neanche dopo quell'accorgimento!


  • ModSenior

    No intendo i value delle option del select del tuo form.


  • User

    Queste son le option value del form dove ho la mia combobox

                    $stringa_query="select sigla,provincia from citta order by provincia";
                    $elenco_provincia=mysql_query($stringa_query) or die(mysql_error());
                    while($row_provincia=mysql_fetch_array($elenco_provincia)){
                    $sigla_procincia=$row_provincia['sigla'];
                    $nome_provincia=$row_provincia['provincia'];
                    echo "<option value=\"$sigla_provincia\">$nome_provincia</option>\n";
    

    Dovrebbero andar bene adesso!


  • User Attivo

    Prima hai scritto
    [php]$sigla_procincia=$row_provincia[sigla];[/php]e poi
    [php]$sigla_provincia[/php];)

    A parte questo devo dire che il tuo codice ha dei seri problemi, primo fra tutti il mancato controllo dell'input utente: fai una query insert inserendo direttamente i valori che l'utente ti passa tramite $_POST - PERICOLOSISSIMO!! Mai sentito parlare di SQL injection? http://it.wikipedia.org/wiki/SQL_injection


  • User

    Azz...ho letto almeno 20 volte i nomi...diventerei un pazzo quando succedono ste cose.Ti ringrazio per l'accorgimento!

    SQL Injection...ne avevo letto qualcosa a riguardo qualche tempo fa.
    Onestamente non saprei che genere di controlli poter mettere nei vari campi poichè son proprio alle primissime armi con il php (penso che si veda anceh dal tipo di codice postato).
    Qualche consiglio me lo potresti dare?

    Ho letto che possono inserire delle queries nelle varie textbox e da li autenticarsi...

    Ti spiego di che tratta il sito : è un sito di annunci, nel quale ti registri e pubblichi qualcosa...una sorta di esperimento più che altro. Per pubblicare un annuncio devi semplicemente registrarti, all'iscrizione ti verrà inviato un codice che dovrai mettere in una textbox di controllo per pubblicare l'annuncio..diciamo che è una sorta di base, un esperimento per provare un futuro progetto!
    Pertanto non dispongo di casella login/logout

    Mi chiedo pertanto...La SqlInjection si fa nelle caselle login oppure può essere fatta anche in textbox varie che "elabori" per poi mandare i dati in un database ???
    Se la risposta è affermativa, ahimè credo che lo sia, che mi consigli per difendermi allora ?


  • User Attivo

    Come avrai letto dalla pagina di Wikipedia, la SQL Injection vuol dire che un utente utilizza una vulnerabilità del tuo codice per far eseguire dei comandi SQL non previsti da te al tuo database.

    Essere vulnerabili vuol dire, in primo luogo, fare come fai tu, cioè non controllare e non "bonificare" l'input dell'utente: nella tua query tu inserisci direttamente il contenuto dell'array $_POST - passi quindi direttamente al db del testo inserito dall'utente, senza controllare che non contenga codice malevolo e senza assicurarti che non possa fare del "male". Ovviamente non c'entra nulla se questo testo inserito dall'utente venga da una textarea, da una casella di login o da qualunque altro input utente

    Per "difendersi" ti consiglio:

    • in primo luogo di "studiare" un po' di più, ci sono tanti e tanti articoli su questo argomento
    • la soluzione ideale sarebbe utilizzare una libreria per parlare con il tuo DB e non le funzioni MySQL di PHP (nello specifico, la libreria da utilizzare dovrebbe essere MDB2 che trovi su PEAR) e sfruttare i sistemi già inclusi per evitare i rischi di SQL Injection (tipo l'utilizzo dei placeholder)
    • se proprio non vuoi fare tutto ciò, almeno utilizza mysql_real_escape_string prima di inserire l'input dell'utente dentro una qualsiasi query

    HTH, ciao! 🙂


  • User

    Ho dato un occhiata in giro nel poco tempo che ho per dedicarmi a questo sito ed ho trovato una sorta di funzione che dicono che sia efficace.
    Onestamente prima di utilizzarla preferirei ascoltare un tuo parere perchè mi sembri una persona più che preparata e dalla quale si può apprendere molto:

    <?php
    function pulisci( $value ) {
       
       if( get_magic_quotes_gpc() )
          $value = stripslashes( $value );
    
       if( is_numeric( $value ) )
          return $value;
    
       $value = addslashes( htmlspecialchars( $value ) );
    
       return $value;
    }
    
    foreach( $_POST as $key => $val ) {
       $_POST[$key] = pulisci( $val );
    }
    
    foreach( $_GET as $key => $val ) {
       $_GET[$key] = pulisci( $val );
    }
    ?>
    

    Penso che vada richiamata in ogni textbox nella quale un utente malevolo possa immettere del codice!!!

    Che ne pensi?


  • User Attivo

    No, la funzione che devi usare (se usi MySQL, come mi pare tu faccia) è mysql_real_escape_string - e la usi solo nella query quando ne hai bisogno.

    Ad esempio:
    [php]$query = "INSERT INTO utente
    (tipo_utente, nome, cognome, ...)
    VALUES (
    '" . mysql_real_escape_string($tipo_utente) . "', '" . mysql_real_escape_string($nome) . "', '" . mysql_real_escape_string($cognome) . "', ...)";[/php]
    HTH, ciao! 🙂


  • User

    Perfetto. Grazie mille per la dritta...

    Stavo vedendo, tanto sapere anche qualcosa in più, la funziona addslashes() o in alternativa a quella che hai detto tu mysql_real_escape_string la funzione mysql_escape_string.

    Comunque penso proprio che userò questa che mi hai appena consigliato.

    Solo una curiosità a questo punto : perchè quando usi la funzione che mi hai consigliato
    aggiungi dei punti subito dopo l'apetura dei doppi apici e subito priam della chiusura?
    hanno qualche funzione particolare questi punti ?

    Grazie ancora per l'aiuto.
    Gentilissimi in questo forum come pochi altri...
    Spero un giorno di poter essere utile alla community anche io come
    lo siete stati voi con me!


  • User

    Ah dimenticavo una cosa da chidere nel post precedente.
    Il controllo sui dati immessi del tipo anteporre alla variabile il tipo di dato per esempio :

    $eta=(int)$_POST($eta);

    è necesasrio?
    Oppure con la funzione mysql_real_escape_string($eta) sono apposto e non ho bisogno di altri controlli ???


  • User Attivo
    addslashes
    ``` è una funzione (di fatto) deprecata per gli inserimenti nel DB, ```
    mysql_escape_string
    ``` è uguale a ```
    mysql_real_escape_string
    ``` solo che non rispetta il character set...
    
    I punti servono per poter concatenare funzioni e stringhe: non puoi inserire una funzione all'interno di virgolette, cioè non puoi fare
    [php]"INSERT INTO table ( campo1, campo2 ) VALUES ( mysql_real_escape_string($valore1), mysql_real_escape_string($valore2) )"[/php]quindi devi "spezzare" la stringa fra virgolette facendo
    [php]"INSERT INTO table ( campo1, campo2 ) VALUES ( " . mysql_real_escape_string($valore1) . ", " . mysql_real_escape_string($valore2) . " )"[/php]
    Spero di essere stato chiaro anche se questo punto spesso non è facile da comprendere...

  • User Attivo

    Risposta veloce: può bastare mysql_real_escape_string.

    In ogni caso io farei [PHP]$eta = intval($_POST($eta));[/PHP] (non so se è meglio ma mi piace di più :2:

    Oh, un'altra cosa: fino ad adesso stiamo parlando di sicurezza del dato (cioè evitiamo che un "hacker" ci distrugga o rubi i dati) - altro discorso è l'integrità del dato, cioè i controlli che dobbiamo fare per assicurarci che i nostri dati abbiano "senso", ad esempio che l'utente non inserisca il 30 febbraio come data o "abc" come età...


  • User

    Ok perfetto...
    Ti ringrazio di tutto, abbiamo parlato un po di tutto in questo thread ed ho imparato molte cose grazie a voi !!

    Grazie a presto!