Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    75

    SQL Injection... chiarimento

    Ciao a tutti,

    dovrei implementare un controllo che difenda dall'sql injection in un progettino che sto facendo. Cercando sul forum ho visto che si fa sempre riferimento alla funzione mysql_real_escape_string per controllare la bontà delle variabili $_POST.
    Questo escape è sicuro? Leggevo tempo fa su una guida che l'escape non è una tecnica sicura al 100% e che con particolari sequenze di caratteri speciali si può cmq aggirare. Li si parlava di escape in generale, questo metodo real_escape si può usare tranquillamente?

    Grazie

  2. #2
    l'escape non risolve il problema al 100% ma riduce enormemente la superficie di attacco

    va controllato tutto, non solo il $_POST ... vanno controllati tutti i parametri provenienti dall'esterno, ovvero $_GET, $_POST, $_COOKIE, $_SERVER (per quei parametri come il referer, l'user agent, la path e via dicendo) e $_FILES (per il nome del file)

    In generale devi fare l'escape di TUTTO quello che carichi nel database.

    L'escape, ad esempio, converte i ' in \\' il che significa che in un campo scrivi ' OR 1='1

    Invece di eseguire una query del genere
    SELECT * FROM tabella WHERE testo = '' OR 1='1'

    che eseguirebbe il codice sql inserito, eseguirebbe questa query
    SELECT * FROM tabella WHERE testo = '\\' OR 1=\\'1'

    che cercherebbe una corrispondenza ovviamente inesistente, annullando quindi qualsiasi danno fattibile.

    Ovviamente però ci sono altre situazioni, ovvero se passi valori "numerici" chi attacca non ha bisogno di inserire apici nelle stringhe, quindi se metti 1 OR 1 e lanci una query che cerca un id otterrai
    SELECT * FROM tabella WHERE id = 1 OR 1

    ... ma la otterrai anche con l'escape!

    Quindi l'importante è controllare i dati in ingresso e convertirli nei loro rispettivi valori prima di inserirli, ovvero se sai che il campo $_GET['id'] è numerico prima lo controlli con is_numeric e dai errore nel caso in cui non è numerico e poi, giusto per sicurezza, lo casti ad intero nella query.
    Solitamente ho un metodo che mi costruisce la query a cui passo la data con i parametri da inserire tramite vsprintf ( www.php.net/vsprintf www.php.net/func_get_args )

    in questo modo scrivo la query
    SELECT * FROM id = %d

    ed in automatico vsprintf mi effettua il cast a numero, ma per sicurezza lo metto pure io nei parametri che passo già castato ad intero

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    75
    Grazie della risposta, molto esaustivo.

    Ho iniziato a fare qualche prova e riscontro dei problemi però già con il real escape
    Io, ad esempio, ho un form in cui l'utente deve compilare a mano alcune caselle di testo, e poi selezionare dei valori da dei menù a tendina.
    Adesso... per i menù a tendina non dovrei temere visto che l'utente non ha la possibilità di digitare nulla giusto?
    Ho però dei problemi sugli altri valori. Nonostante siano tutte stringhe applicando il metodo mysql_real_escape_string() ricevo sempre indietro false...

    una cosa del tipo $descrizione = mysql_real_escape_string($_POST['descrizione']) non funziona, nonostante la descrizione sia una stringa...

  4. #4
    mysql_real_escape_string() vuole una connessione al server mysql attivata.

    Quindi devi prima eseguire la connessione con mysql_connect(). devi anche accertarti che le magic quotes gpc siano in off, oppure rimuovere i caratteri di escape gia' esistenti

    Maggiori info su questa funzione li trovi nella pillola di Luca200.

    http://forum.html.it/forum/showthrea...ostid=10166292

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    una cosa che generalmente faccio è richiamare uno stripslashes ricorsivo su $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV e $_FILES se c'è attivo il magic quote (verificando la profondità massima onde evitare di beccarmi qualche stack overflow exception)

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    75
    Grazie delle risposte.

    Quindi per fare un esempio pratico, limitandosi a $_POST per il momento, se io facessi
    codice:
    $var1 = stripslashes($_POST['var1']);
    $var1 = trim(htmlspecialchars(mysql_real_escape_string($var1)));
    potrei iniziare a stare moderatamente tranquillo?

    Grazie

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