Originariamente inviato da andrea_kobe
Se devo fare una query semplice di questo tipo

delete from tabella where id = $id

è più corretta scritta come sopra oppure scritta così

delete from tabella where id = '$id'

con la variabile tra apici. Lo chiedo perchè mi sembra di aver letto che per ragioni di sicurezza è preferibile il metodo con gli apici. Vi risulta questa cosa? Grazie ancora.
E' vero in parte.
Se quell'$id deve essere numerico e tu hai VERIFICATO che lo sia, gli apici diventano superflui.
Se non hai verificato la correttezza del dato, gli apici possono impedire una SQL Injection, ma in realtà non è detto, se non fai l'escape della stringa.
In sintesi, se fai tutti i controlli gli apici non servono.

Esempi basati sulla tua query: supponiamo che la variabile $id venga passata in query string e tu non controlli il suo contenuto

Chiamata dal browser: pagina.php?id=2 or 1=1
Query eseguita senza apici: delete from tabella where id = 2 or 1=1 (ti svuota la tabella!)
Query eseguita con apici: delete from tabella where id='2 or 1=1' (in questo caso la stringa fra apici viene "numericizzata" col valore 2, neutralizzando di fatto l'attacco ed eseguendo la query corretta).

Come vedi in questo caso gli apici ti hanno aiutato. Ma se la chiamata dal browser fosse questa:
pagina.php?id=2' or '1=1
Ecco che la query eseguita (con gli apici) diventa: delete from tabella where id='2' or '1=1'
E tu ti trovi di nuovo la tabella svuotata. In questo caso il rimedio sarebbe eseguire l'escape, che trasformerebbe la query in
delete from tabella where id='2\\' or \\'1=1'
E così otterresti lo stesso risultato visto nell'ultimo caso precedente, cioè attacco neutralizzato.

Tuttavia la soluzione più logica è verificare la numericità del dato; non ha infatti molto senso non fare questo controllo e poi affidarsi agli apici, che a loro volta sono efficaci solo in presenza di escape della stringa (che invece diventa superfluo quando sai che la stringa è numerica).
Fra l'altro, volendo ragionare in termini di portabilità, bisogna ricordare che alcune versioni di SQL, contrariamente a MySql, segnalano un errore se trovano fra apici un valore che è previsto come numerico.

Ricordo anche che con MySql 4.1 e la nuova estensione mysqli sono state introdotte le Prepared Statements che eliminano i problemi di SQL Injection