• User Newbie

    Dubbio apici

    Ciao a tutti,
    ho creato un form di registrazione e sembra funzionare tutto correttamente.
    Il mio dubbio era la gestione degli apici...

    [php]
    $nome = (isset($_POST['nome'])) ? str_replace("'", "'", htmlspecialchars(trim($_POST['nome']))) : '';

    if (!get_magic_quotes_gpc()) {
        $nome = addslashes($nome);
    }
    

    [/php]Mentre nel form ho inserito

    [php]
    <input type="text" id="nome" name="nome" value="<?php echo stripslashes($nome);?>" tabindex="1" maxlength="100" />
    [/php]L'inserimento nel database funziona e mi lascia inalterati sia gli apici che i doppi apici(e qui vorrei sapere se è un bene o è meglio aggiungere gli slash), e risulta anche corretto nell'input il value nel caso debba recuperare il valore in caso di errore su altri campi.

    Ringrazio chiunque possa darmi un suggerimento o fare chiarezza.
    Ciao a tutti!


  • ModSenior

    Ciao,

    E' sufficiente:
    [php]
    if (!get_magic_quotes_gpc()) {
    $nome = addslashes($nome);
    }
    [/php]
    Per filtrare i dati, ed evitare sql injection, nel database devi inserirli normalmente, il problema e se si va a modificare la query.
    La funzione str_replace puoi pure toglierla, anche perchè non sta facendo nulla.

    Ti consiglio di leggere questo breve articolo:
    http://sicurezza.html.it/articoli/leggi/973/tecniche-sql-injection/1/
    Che ti spiega come funzionano le sql injection, in modo che puoi meglio capire quali sono i problemi.


  • User Newbie

    Quello che mi interessava capire è se nel database devo salvare la stringa con gli slash prima dell'apice o doppi apici...

    Perché nel modo da te suggerito, quello che ricavo nel campo value viene visualizzato all'utente con gli slash davanti, e in caso di invio questi vengono sempre raddoppiati...

    Se infatti lo script mi esegue il controllo sui campi, quello che l'utente ha gia compilato, viene recuperato ad esempio così

    ciao\'come\"stai\"...

    Grazie ancora.
    Ciao


  • ModSenior

    Ciao mic3000,

    Hai tolto il resto? Perchè devi usare esclusivamente quel codice che ti ho postato, se aggiungi altre funzioni che fanno la stessa cosa hai quel risultato li.
    Nel database non è necessario salvare gli slash.


  • User Newbie

    Ciao Thedarkita e grazie per l'attenzione.
    Ho seguito il tuo suggerimento ma ho sempre il problema nel campo value del form, non so se sono riuscito a spiegarmi nel migliore dei modi, ma siccome sul form eseguo diversi controlli, per far si che l'utente non debba reinserire ogni volta i dati in caso di errore su altri campi sto cercando di recuperarli, mettendo nel campo value dell'input qualcosa tipo <?php echo $cognome;?> ma se ad esempio inserisco dell'acqua, quello che visualizzo è dell'\acqua, oppure se vengono inseriti i doppi apici mi tronca tutto ciò che c'è dopo, è questo che vorrei evitare.
    Grazie ancora
    Buona giornata


  • ModSenior

    Dovresti fare gli echo cosi:
    <?php echo ((get_magic_quotes_gpc()) ? stripslashes($_POST['$nome']) : $_POST['nome']);?>


  • User Newbie

    Perdonami ma non funziona...:x

    Ti posto tutta la pagina così se hai tempo di dargli un occhio, magari riesco anche a capire dove sbaglio...

    [php]

            <?php
                // Includo la connessione al database
                require('config.php');
    

    // Se il modulo viene inviato...

    if(isset($_POST['registra']))

    {

    // Dati Inviati dal modulo
    $nome = (isset($_POST['nome'])) ? trim($_POST['nome']) : '';    // Metto nella variabile 'nome' il dato inviato dal modulo, se non viene inviato dò di default ''
    $cognome = (isset($_POST['cognome'])) ? trim($_POST['cognome']) : '';    // Metto nella variabile 'cognome' il dato inviato dal modulo, se non viene inviato dò di default ''
    $mail = (isset($_POST['mail'])) ? trim($_POST['mail']) : '';    // Metto nella variabile 'mail' il dato inviato dal modulo, se non viene inviato dò di default ''
    
    // Filtro i dati inviati se i magic_quotes del server sono disabilitati per motivi di sicurezza
    $nome = get_magic_quotes_gpc() ? stripslashes($nome) : $nome;
    $cognome = get_magic_quotes_gpc() ? stripslashes($cognome) : $cognome;
    $mail = get_magic_quotes_gpc() ? stripslashes($mail) : $mail;
    
    $nome = mysql_real_escape_string($nome);
    $cognome = mysql_real_escape_string($cognome);
    $mail = mysql_real_escape_string($mail);
    
    
    //Qui tutti i controlli sui campi...
        
        // Query per l'inserimento dell'utente nel database
        $strSQL = "INSERT INTO utenti (nome,cognome,mail)";
        $strSQL .= "VALUES('$nome', '$cognome', '$mail')";
        mysql_query($strSQL) OR die("Errore 003, contattare l'amministratore. ".mysql_error());
        
    unset($nome);    
    unset($cognome);    
    unset($mail);    
    
    echo ('Invio completato');
    mysql_close($db);
    

    }
    ?>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    <label for="nome">Nome* </label>
    <input type="text" id="nome" name="nome" value="<?php echo ((get_magic_quotes_gpc()) ? stripslashes($_POST['nome']) : $_POST['nome']);?>" tabindex="1" maxlength="100" /><br />

            <label for="cognome">Cogome* </label>
                <input type="text" id="cognome" name="cognome" value="<?php echo htmlentities($cognome, ENT_QUOTES);?>" tabindex="2" maxlength="100" /><br />                
             
            <label for="mail">E-mail* </label>
                <input type="text" id="mail" name="mail" value="<?php echo htmlentities($mail, ENT_QUOTES);?>" tabindex="3" maxlength="320" /><br />                
    
            <label for="submit" ></label>
                <input name="registra" id="submit" type="submit" value="Registrati" tabindex="4" /><br />
        </form>
    

    [/php]

    Non dovrei aver dimenticato nulla...
    Grazie.
    Ciao e buona serata.


  • ModSenior

    Prova cosi:
    [php]

            <?php
                // Includo la connessione al database
                require('config.php');
    

    // Se il modulo viene inviato...

    if(isset($_POST['registra']))

    {

    // Dati Inviati dal modulo
    $nome = (isset($_POST['nome'])) ? trim($_POST['nome']) : '';    // Metto nella variabile 'nome' il dato inviato dal modulo, se non viene inviato dò di default ''
    $cognome = (isset($_POST['cognome'])) ? trim($_POST['cognome']) : '';    // Metto nella variabile 'cognome' il dato inviato dal modulo, se non viene inviato dò di default ''
    $mail = (isset($_POST['mail'])) ? trim($_POST['mail']) : '';    // Metto nella variabile 'mail' il dato inviato dal modulo, se non viene inviato dò di default ''
    
    
    
    //Qui tutti i controlli sui campi...
        
        // Query per l'inserimento dell'utente nel database
        $strSQL = "INSERT INTO utenti (nome,cognome,mail)";
        $strSQL .= "VALUES('$nome', '$cognome', '$mail')";
        mysql_query($strSQL) OR die("Errore 003, contattare l'amministratore. ".mysql_error());
    
    echo ('Invio completato');
    

    }
    ?>
    <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    <label for="nome">Nome* </label>
    <input type="text" id="nome" name="nome" value="<?php echo ((get_magic_quotes_gpc()) ? stripslashes($_POST['nome']) : $_POST['nome']);?>" tabindex="1" maxlength="100" /><br />

            <label for="cognome">Cogome* </label>
                <input type="text" id="cognome" name="cognome" value="?php echo ((get_magic_quotes_gpc()) ? stripslashes($_POST['cognome']) : $_POST['cognome']);?>" tabindex="2" maxlength="100" /><br />                
             
            <label for="mail">E-mail* </label>
                <input type="text" id="mail" name="mail" value="<?php echo ((get_magic_quotes_gpc()) ? stripslashes($_POST['mail']) : $_POST['mail']);?>" tabindex="3" maxlength="320" /><br />                
    
            <label for="submit" ></label>
                <input name="registra" id="submit" type="submit" value="Registrati" tabindex="4" /><br />
        </form>
    

    [/php]


  • User Newbie

    Non funziona nemmeno così...mi tronca tutto quello che c'è dopo il doppio apice...

    Pensavo fosse un problema abbastanza comune quello dell'escape...


  • User Attivo

    Ciao,
    mettere apici e doppi apici nel campo value di un input ha i suoi limiti.
    Se delimiti il campo value con gli apici singoli, questi stessi ti creano problemi inserendo, lato php, testi contenenti gli apici.
    La stessa cosa accade con i doppi apici.

    La soluzione è quella di usare le entità html con la funzione htmlentities() forzando la conversione degli apici:
    [php]
    <?php echo htmlentities((get_magic_quotes_gpc()?stripslashes($_POST['nome']):$_POST['nome']),ENT_QUOTES);?>
    [/php]

    Alessandro