Il mio codice utilizza mysqli_real_escape_string e cita il 100% sicuro contro SQL Injection?

1

Il mio codice è:

SELECT * FROM tlb_members WHERE username="{mysqli_real_escape_string($_GET['test'])}"

Sto cercando e alcune persone hanno detto che usare le virgolette nelle istruzioni SQL è sicuro. È vero?

    
posta Anh 07.03.2016 - 07:14
fonte

2 risposte

5

È per lo più sicuro, tranne che in alcuni casi d'angolo riguardanti alcuni set di caratteri . Tuttavia, non è l'approccio corretto.

Ma prima, PDO con impostazione predefinita la configurazione soffre anche dei casi d'angolo sopra descritti.

Ci sono comunque ottime ragioni per non farlo in questo modo:

  • teoricamente, ha più senso separare le parole chiave di input e SQL dell'utente anziché l'escape.
  • generalmente si consiglia di utilizzare istruzioni preparate, per non sfuggire . Non è sempre consigliabile seguire raccomandazioni generali, ma se si va contro di esse, si dovrebbe avere una buona ragione per farlo.
  • è più difficile fare confusione con le istruzioni preparate piuttosto che scappare, perché devi farlo correttamente quando leghi i dati alla query, mentre l'escape può avvenire ovunque (e spesso lo fa, per evitare la duplicazione, ecc.).
  • le istruzioni preparate usano sempre lo stesso approccio, legano semplicemente i dati. Con l'escape, devi ricordare di avere virgolette, o di castare in int, a seconda dei dati che hai.
  • Le virgolette
  • sono molto facili da dimenticare e da trascurare, soprattutto nelle query più complesse.
  • mi sembra che, usando le istruzioni preparate, ti concentri sulla sicurezza, mentre quando usi l'escaping, è più un pensiero collaterale che interferisce con il compito che vuoi veramente realizzare, rendendo facile dimenticare per aggiungere fughe o virgolette una sola volta (non puoi dimenticare di associare le variabili, in quanto non funzionerebbe).
  • le istruzioni preparate sono più piacevoli da leggere rispetto al codice che ha mysqli_real_escape_string dappertutto.
  • è molto più facile trovare punti deboli nel codice se si utilizzano le istruzioni preparate (solo grep per le query che contengono variabili).
risposta data 07.03.2016 - 09:35
fonte
6

Non si sanifica correttamente il parametro GET HTTP. L'unico buon modo per prevenire l'SQL injection è usare query parametrizzate.

Dai un'occhiata a MeekroDB: link questo dovrebbe aiutarti a creare query piuttosto sicure e per me è anche molto più facile da usare .

Tieni presente che ciò che è considerato sufficientemente sicuro oggi potrebbe cambiare durante la notte. Non esistono cose come la sicurezza al 100%.

    
risposta data 07.03.2016 - 07:28
fonte

Leggi altre domande sui tag