real_escape()
è una funzione che ha bisogno di memoria per la sua funzionalità, quindi mi chiedevo se fosse necessario farlo se l'avessimo già lanciata?
$num = (int) $num;
Possiamo usare real_escape()
solo per i parametri stringa?
È vero che la trasmissione può attenuare le iniezioni SQL, ma a meno che le prestazioni non siano per noi una preoccupazione enorme , utilizzerei comunque mysqli_real_escape_string()
, per due motivi:
L'applicazione potrebbe cambiare in futuro. Anche se l'applicazione sta trasmettendo solo numeri interi nelle tue query al momento (tramite questa particolare chiamata di funzione o qualsiasi altra cosa), il tuo codice potrebbe essere modificato in il futuro per accettare stringhe, ecc. Propongo che sia meglio pianificare in anticipo un po 'e che dovresti eliminare questa potenziale vulnerabilità futura in questo momento, mentre è nella tua mente.
Uno sviluppatore meno esperto potrebbe "rifattorizzare" quel cast. A un certo punto, posso vedere un dev junior che passa attraverso il tuo codice e dice: "Perché questo cast è qui?" re solo gli ID passivi nell'SQL, "e poi rifattorizzare quel cast. Ti consigliamo di utilizzare mysqli_real_escape_string()
anche se solo per dare ai futuri sviluppatori un punto di vista sul fatto che qui è in gioco un problema di sicurezza.
Per lo meno, se hai intenzione di fare affidamento su un cast per implementare la sicurezza, lascerei alcuni consensi TUTTI i commenti di CAPS nel tuo codice per chiarire che è quello che stai facendo.
Hai ragione. Se sai che è un int
(perché lo lanci su int
), non devi chiamare mysql_real_escape_string()
.
P.S. Andrò su un arto ed esprimo un'opinione. Per la maggior parte degli scopi, le istruzioni preparate rappresentano una difesa migliore contro l'iniezione SQL rispetto all'applicazione manuale delle funzioni di escape. (Sono sicuro che ci sono persone PHP da qualche parte che mi daranno del tempo difficile su questo, o far notare che alcuni sistemi di database su PHP non supportano le istruzioni preparate.)
In questo esempio, se si esegue il cast della variabile, non è necessario eseguire alcuna altra sanitizzazione. Ma ricorda che il casting deve essere preparato a livello PHP. Non pensare nemmeno a lanciare nella tua query SQL!
corretta:
mysql_query("SELECT * FROM users WHERE id=".(int)$_GET['id'])
Questo porta a Blind SQL Injection:
mysql_query("SELECT * FROM users WHERE id=CAST(".$_GET['id']." AS UNSIGNED)")
?id=1 AS UNSIGNED) AND 1337=BENCHMARK(13371337,MD5('ouch!'))--