Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    Caratteri speciali con MySQL e funzioni da utilizzare

    Ho letto diversi post e ci sono pareri discordanti su quali funzioni utilizzare per validare tutti i dati provenienti dal form da inserire in un database MySQL.

    La direttiva magic_quotes_gpc sembra verrà definitivamente deprecata da PHP 6 per cui in prospettiva la evito.
    Alcuni dicono di utilizzare le espressioni regolari per validare ma molti sono perplessi sull'utilizzo di questa tecnica per questo scopo.
    Infine abbiamo mysql_real_escape_string (che prende il posto della ormai deprecata mysql_escape_string).

    Voi cosa consigliate? E' meglio utilizzare direttamente quest'ultima direttiva in un nuovo progetto?

    grazie

  2. #2
    La migliore da usare è mysql_real_escape_string, anche perchè se le passi come secondo parametro l'id di connessione al db tiene conto anche del charset.

    Tuttavia tale funzione non fa l'escape di tutti i caratteri pericolosi: è meglio aggiungere un escaping manuale
    Codice PHP:
    $query=mysql_real_escape_string($query);
    $escape_chars=array('%''_'','';');
    foreach(
    $escape_chars as $char)
    {
            
    $query=str_replace($char"\\\$char"$query);

    La differenza fra la genialità e la stupidità è che la genialità ha i suoi limiti.


  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    1)
    ...anche perchè se le passi come secondo parametro l'id di connessione al db tiene conto anche del charset.
    Non ho capito, cosa intendi?


    2) Dal sito ufficiale sembra che non faccia l'escape dei soli caratteri % e _ (ma dalle prove come dici tu non fa l'escape nemmeno di , e ; per cui è meglio prevederlo)

    3) Inoltre come l'hai messa tu mi andrebbe a togliere quei caratteri (% _ , dall'intera query che non va bene perchè se voglio fare ad esempio una ricerca con LIKE devo poter utilizzare il carattere percentuale; credo che il modo corretto sia fare il parsing dei soli parametri passati dai form.

    4) Inoltre il magic_quotes_gpc() potrebbe essere attivato per cui forse è meglio controllare.
    Per tutte queste considerazioni direi che la versione potrebbe essere:

    codice:
    $login=mysql_real_escape_string($login);
    $escape_chars=array('%', '_', ',', ';');
    if (gpc_magic_quotes()) {
       $login = stripslashes($login);
    }
    foreach($escape_chars as $char) {
       $login=str_replace($char, "\\$char", $login);
    }
    $query = "SELECT * FROM utenti WHERE utenti.login = '$login';";
    Oppure si potrebbe anche eliminare il carattere anzichè commentarlo.

    Correggimi se sbaglio ovviamente.
    ciao

  4. #4
    Dal sito ufficiale:
    Escapes special characters in the unescaped_string, taking into account the current character set of the connection so that it is safe to place it in a mysql_query().
    http://php.net/manual/en/function.my...ape-string.php
    sezione della pagina "description"

    Originariamente inviato da aasmdaa
    Inoltre come l'hai messa tu mi andrebbe a togliere quei caratteri ( % _ ,; ) dall'intera query che non va bene perchè se voglio fare ad esempio una ricerca con LIKE devo poter utilizzare il carattere percentuale; credo che il modo corretto sia fare il parsing dei soli parametri passati dai form.
    Scusa, ho sbagliato a scrivere il codice, sono i valori dei campi che devi passare e non tutta la query.

    Per quanto riguarda magic_quotes_gpc ti conviene disattivarlo.

    La differenza fra la genialità e la stupidità è che la genialità ha i suoi limiti.


  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Ho letto ma non credo di aver capito. Il set di caratteri lo prende dalla collation del db (o c'entra anche il set di caratteri settato su php?).
    In entrambi i casi non è un problema in quanto uso in entrambi utf-8, però vorrei capire.

    Codice PHP:
    // Forza il set di caratteri tramite header
    header('Content-type: text/html; charset=utf-8');

    // Effettua la connessione al database
    $db_link mysql_connect($db_host$db_utente$db_password) or die ('Errore nella stringa di connessione al database: '.mysql_error());
    mysql_select_db($db_nome$db_link);
    mysql_query("SET NAMES 'utf8'"); // Per versioni di MySQL < 5.2.3 

  6. #6
    Il charset di php c'entra, perchè quello che in un certo charset corrisponde ad un carattere, in altri charset potrebbe corrispondere un altro carattere.
    Comunque ho scoperto che la funzione, se il secondo parametro non viene passato, prende automaticamente l'ultima connessione eseguita.

    In ogni caso questa è una precauzione che serve in caso di charset diversi tra webserver e database, ma se tu usi utf-8 in entrambi non c'è alcun problema.
    La differenza fra la genialità e la stupidità è che la genialità ha i suoi limiti.


  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Ok sei stato chiarissimo. Grazie.

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da furbostandby
    Tuttavia tale funzione non fa l'escape di tutti i caratteri pericolosi: è meglio aggiungere un escaping manuale
    Pericolosi per cosa?

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Per l'SQL injection?

  10. #10
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da aasmdaa
    Per l'SQL injection?
    No.
    Il problema dell' SQL injection lo risolvi con mysql_real_escape_string
    Il resto è ciarpame inutile

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 © 2026 vBulletin Solutions, Inc. All rights reserved.