Prevenire le iniezioni SQL

2

Quindi sono abbastanza nuovo per SQL quindi non ho molta familiarità con come prevenire eventuali iniezioni SQL.

Ho 1 modulo principale che viene utilizzato come sondaggio e attualmente ha solo 1 campo di testo. Al momento penso di essere al sicuro dal generico '); DROP TABLE table; -- exploit, ma ce ne sono di più di cui non sono troppo sicuro.

Di seguito sono riportate le mie righe di inserimento e aggiornamento. $want è il campo di testo che ho menzionato.

INSERT INTO polls (ip, continent, hours, timespent, f_champ, l_champ, o_champ, u_champ, b_champ, w_champ, want, story, happy, 4star, 3star, 2star, 1star) VALUES ($ip, '$continent', $hours, '$timespent', '$f_champ', '$l_champ', '$o_champ', '$u_champ', '$b_champ', '$w_champ', CAP_FIRST('$want'), '$story', '$happy', $_4star, $_3star, $_2star, $_1star)

UPDATE polls SET continent = '$continent', hours = $hours, timespent = '$timespent', f_champ = '$f_champ', l_champ = '$l_champ', o_champ = '$o_champ', u_champ = '$u_champ', b_champ = '$b_champ', w_champ = '$w_champ', want = CAP_FIRST('$want'), story = '$story', happy = '$happy', 4star = $_4star, 3star = $_3star, 2star = $_2star, 1star = $_1star WHERE ip = $ip

Attualmente sto usando PHP e MySQLi (procedurale) inserendo in un database phpMyAdmin.

Qualcuno può fornire suggerimenti per fermare potenziali iniezioni. Grazie.

    
posta Spedwards 11.02.2015 - 15:43
fonte

2 risposte

6

Il modo corretto per prevenire le iniezioni SQL è usare Istruzioni preparate .

Ecco un esempio abbreviato tratto dalla documentazione di PHP:

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("i", $id);
$stmt->execute();

Invece di sostituire letteralmente il valore di una variabile nella tua query, che sarà sempre vulnerabile all'iniezione da parte di un utente malintenzionato creativo, utilizzi un carattere jolly - "?" . La variabile deve quindi essere associata al carattere jolly.

Ovviamente questo è un esempio molto semplificato. Devi fare una gestione degli errori e spesso avrai più di una variabile nella tua dichiarazione. Tutto questo può essere trovato nella documentazione .

Il concetto di istruzioni preparate non è esclusivo di PHP. Lo trovi praticamente in tutti i linguaggi di programmazione, sebbene l'implementazione possa differire. Familiarizza con il concetto, perché lo incontrerai e ne avrai spesso bisogno.

    
risposta data 11.02.2015 - 15:45
fonte
1

At the moment I think I'm safe from the generic '); DROP TABLE table; -- exploit but there are more I'm not too sure about.

La maggior parte del tempo ti salverà, dato che devi usare esplicitamente multi_query in PHP + MySQL per consentire query impilate (più query separate da un punto e virgola)

Ciò che non viene salvato da sono iniezioni SQL che non utilizzano query impilate. Questi sono ad esempio:

  • in select istruzioni: usando union per combinare l'istruzione select legittima con una seconda istruzione select iniettata, recuperando così i dati che non avrebbero dovuto essere recuperati (e possibilmente scrivere / leggere file).
  • in update / delete / insert istruzioni: iniezione basata su errore utilizzando XPATH tramite updatexml o extractdata . Fondamentalmente, si genera un messaggio di errore che contiene i dati che si desidera estrarre dal database.

Anche le iniezioni sono possibili in ordine di clausole e limiti.

Come @ S.L. Barth ha affermato che il modo corretto per prevenire l'iniezione SQL è di utilizzare sempre istruzioni preparate per tutti i dati variabili.

    
risposta data 11.02.2015 - 16:10
fonte

Leggi altre domande sui tag