• User

    Insert testo con apici

    Ciao,
    ho la necessità di inserire in un campo della tabella mysql una frase o valori che contengono apici e caratteri speciali.
    Al momento della insert, lo script restituisce il seguente errore:
    [CODICE]
    Insert Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a'', '22', '> Aggiungere tra i filtri: Sede - Disciplina/Reparto - Risorsa/Ambu' at line 8[/CODICE]

    Lo script è composto da:
    script di inserimento insert.php
    [php]<html><head><title>Inserisci record</title></head>
    <body>
    <?
    /* Change db and connect values if using online */
    $codice=$_POST['codice'];
    $descrizione=$_POST['descrizione'];
    $db="db01";
    $link = mysql_connect('localhost', 'aaa' , 'bbb');
    if (! $link)
    die(mysql_error());
    mysql_select_db($db , $link) or die("Select Error: ".mysql_error());
    $result=mysql_query("INSERT INTO sqlreporting (codice, descrizione) VALUES (
    '$codice',
    '$descrizione')") or die("Insert Error: ".mysql_error());
    mysql_close($link);
    print "Record added";
    ?>
    <form method="POST" action="insert_form.php">
    <input type="submit" value="Insert Another Record">
    </form>
    <br>

    <form method="POST" action="index.php">
    <input type="submit" value="Dbase Interface">
    </form>
    </body>
    </html>[/php]form html di inserimento form_insert.php
    [html]<html><head><title>Inserisci record</title>
    <style type="text/css">
    td {font-family: tahoma, arial, verdana; font-size: 10pt }
    </style>
    </head>
    <body>
    <table width="300" cellpadding="5" cellspacing="0" border="2">
    <tr align="center" valign="top">
    <td align="left" colspan="1" rowspan="1" bgcolor="64b1ff">
    <h3>Insert Record</h3>
    <form method="POST" action="insert_record.php">
    <?
    print "Enter codice: <input type=text name=codice size=20><br>";
    print "Enter descrizione: <textarea rows=10 name=descrizione cols=40></textarea><br>";
    print "<br>";
    print "<input type=submit value=Submit><input type=reset>";
    ?>
    </form>
    </td></tr></table>
    </body>
    </html>[/html]

    Come posso evitare questo errore?

    Grazie


  • User Attivo

    Ciao azocomposto,
    in questi casi è necessario inserire un backslash per fare l'escape dei caratteri speciali.
    Ad esempio, se vuoi inserire nel campo la frase "nell'aria", dovrai scrivere: nell'aria.
    Ovviamente se hai più caratteri speciali dovrai inserire più backslash, uno prima di ogni carattere.

    Ciao.


  • ModSenior

    Ciao azocomposto,
    lo script attualmente è vulnerabile a SQL injection.
    Dovresti almeno filtrare i dati in ingresso con mysql_real_escape prima di passarli nella query. Cosi facendo risolvi anche il problema relativo all'apostrofo che ti ha indicato sandroid.


  • User Attivo

    Ciao Thedarkita, giusto, in effetti ho dimenticato di specificarlo perché ho già attivata la funzione magic_quotes_gpc. O è comunque preferibile mysql_real_escape?


  • ModSenior

    I magic_quotes verranno rimossi con php 6, per cui sarebbe preferibile fare un controllo e fare mysql_real_escape se necessario.
    Anche perchè se si cambia server in futuro e le impostazioni sono diverse, hai parecchio lavoro da fare per sistemare i problemi di sicurezza.


  • User Attivo

    Ok grazie del consiglio.


  • User Attivo

    Io opterei per richiamare il post con una funzione come htmlentities o al massimo addslashes e quindi usare le funzioni inverse alla stampa degli elementi.


  • ModSenior

    Fare le operazioni inverse è abbastanza inutile, htmlentities fà molto più di quello che è necessario e considerando che dovrebbe fare l'operazione inversa alla stampa consumerebbe più risorse.
    addslashes è molto simile a mysql_real_escape_string non filtra tutta via i caratteri \x00, \n, \r, e \x1a considerando che mysql_real_escape_string è una funzione della libreria mysql sarebbe meglio utilizzare questa in quanto è stata realizzata appositamente per questo scopo.


  • User Attivo

    Molto bene!