2012-03-22 19 views
10

Eventuali duplicati:
SQL injection that gets around mysql_real_escape_string()Può mysql_real_escape_string SOLO prevenire tutti i tipi di iniezione sql?

I havent visto alcun valuabe o info non superata su questo. Quindi, c'è questa domanda: Does mysql_real_escape_string() FULLY protect against SQL injection? Eppure è molto obsoleto (è del '09), così da php 5.3 e mysql 5.5 nel '12, lo protegge completamente?

+0

In teoria si :) –

+8

Per favore, per amore di Zaphod Beeblebrox, aggiornati alle istruzioni preparate tramite PDO o l'estensione mysqli. 'mysql *' è un dinosauro che non dovrebbe mai essere usato. Se così tanti siti "tutorial" non hanno continuato ostinatamente a usarlo, il team di sviluppo di PHP lo avrebbe già deprecato. I nuovi devoti a questa pratica arretrata vengono coniati ogni giorno perché non ne sanno di più e dopo tutto "il tutorial diceva che potevo farlo in questo modo". ** Le istruzioni preparate sono il modo corretto per prevenire l'iniezione SQL **. – rdlowrey

+1

Fonte: http://news.php.net/php.internals/53799 – rdlowrey

risposta

10

mysql_real_escape_string ALONE può impedire nulla.

Inoltre, questa funzione non ha nulla a che fare con le iniezioni.

Se ha bisogno di fuggire, è necessario che nonostante la "sicurezza", ma solo perché è richiesto dalla sintassi SQL. E dove non ne hai bisogno, la fuga non ti aiuterà nemmeno un po '.

L'utilizzo di questa funzione è semplice: quando è necessario utilizzare una stringa tra virgolette nella query, è necessario sfuggire al suo contenuto. Non a causa di alcuni "utenti malintenzionati" immaginari, ma semplicemente per sfuggire a queste citazioni utilizzate per delimitare una stringa. Questa è una regola estremamente semplice, ma estremamente sbagliata dalla gente di PHP.

Questa è solo la funzione relativa alla sintassi, non correlata alla sicurezza.

A seconda di questa funzione in materia di sicurezza, ritenendo che "proteggerà il database dagli utenti malintenzionati" , il comporterà l'iniezione.

Una conclusione che si può fare da soli:
No, questa funzione non è sufficiente.

Le dichiarazioni preparate non sono un proiettile d'argento. Ti copre le spalle solo per metà dei possibili casi.Vedi lo important addition I made to the famous question per i dettagli

0

Sì. Eseguendo correttamente l'escape della stringa utilizzando le funzioni di escape native di mysql, non è possibile "scomporre" ed eseguire una query.

Tuttavia, un approccio migliore sarebbe utilizzare istruzioni preparate. Questo farà un certo numero di cose. Usando le dichiarazioni preparate approfitti di ancora più ottimizzazioni dal database e uscirà correttamente da qualsiasi dato passato. Dai un'occhiata a: http://php.net/manual/en/mysqli.prepare.php

4

molto tempo da quando ho letto un post sul blog in modo che non possa più contenere true BUT ...

I post affermavano che se avessi caratteri codificati unicode nella tua stringa, sarebbero stati persi dalla vera stringa di escape ma sarebbero stati valutati dal motore mysql, alludendo all'idea che potevi essere ancora aperto a un'iniezione ben piazzata.

Non riesco a ricordare il post sul blog ma this question on here si trova nello stesso parco.

Problemi correlati