2012-04-21 19 views
5

Sto sviluppando il mio sito web personale usando php. tutto è ok ma ho appena letto mysql_real_escape_string manuale in php.net e ha trovato due cose:domande su mysql_real_escape_string

  1. Questa funzione deve sempre (con poche eccezioni) essere utilizzato per rendere i dati di sicurezza prima di inviare una query a MySQL.
  2. mysql_real_escape_string() non sfugge% e _. Questi sono caratteri jolly in MySQL se combinati con LIKE, GRANT o REVOKE.

Ho due domande:
1-che cosa sono queste eccezioni?
2- come sfuggire a quei personaggi?

+1

È necessario utilizzare [PDO] (http://php.net/manual/en/book.pdo.php). Fare il tuo sito web personale è una grande opportunità per impararlo. – kapa

+0

Il punto 2 si riferisce alle clausole 'LIKE' e non è rilevante per l'utilizzo di dati stringa in altri contesti. – mario

+0

una delle eccezioni potrebbe essere una stringa già sfuggita. – hjpotter92

risposta

5

Questa funzione deve sempre essere utilizzata (con poche eccezioni) per rendere sicuri i dati prima di inviare una query a MySQL.

Con mia grande delusione, la pagina di manuale dice completa spazzatura e they refuse to make it correct.
Quindi, al contrario, ci sono solo pochi casi in cui è necessaria questa funzione. Quindi per dire SOLO UNO: quando si aggiunge una stringa nella query SQL.

mysql_real_escape_string() non sfugge a% e _. Questi sono caratteri jolly in MySQL se combinati con LIKE, GRANT o REVOKE.

Non importa troppo. Finché si utilizza apposta l'operatore LIKE, questi personaggi non arrecheranno alcun danno.

Ma se si vuole sfuggire la stringa andando come dichiarazione, è possibile utilizzare questo codice

$like = addCslashes($like,'\%_'); 

(notare la barra -. Ma è anche necessario per essere sfuggito come manuale affermando che notare anche la C lettera nel nome della funzione).
Dopo questa procedura, è possibile utilizzare la risultante variabile $like in qualsiasi modo si utilizzi per creare le query, sia citandole che sfuggendole o utilizzandole nell'istruzione preparata.

+0

grazie, ma come evitarli ('%', '_')? – undone

+1

semplicemente con la stessa barra. 'addCslashes ($ data,"% _ ");' eseguirà il trucco –

+1

ma lo farà solo per i pezzi che entrano in un contesto di pattern matching. Altrimenti, vedrai un letterale '\%' nel tuo SQL. – Matthew

3

Non sono sicuro delle eccezioni a cui fa riferimento il manuale quando si parla di protezione dei dati. Si potrebbe dire che l'eccezione è quando i dati sono già noti per essere sicuri. Ad esempio, qui ci sono alcuni casi che vengono in mente:

  • i dati è tipizzata come un numero (questo è davvero una specializzazione della voce successiva)
  • sai già che non contiene caratteri che ha bisogno di essere sfuggito (ad esempio, si tratta di guardare qualcosa in un array di "whitelist", che contiene alcune opzioni che si hardcoded)

per esempio, se avete $id = intval($_GET['id']) allora non c'è bisogno di fuggire $id prima di iniettarlo in una query.

Tuttavia! Non può mai farti male sfuggire a tutto l'input e così facendo si elimina la possibilità che si introducano vulnerabilità nel codice (ad esempio se si dimentica di scappare, se i requisiti cambiano, o qualcosa di veramente). Quindi consiglio di prendere l'abitudine di scappare da tutto e di dimenticare le "eccezioni".

Per quanto riguarda le % e _ personaggi come parte dell'input, questi non hanno bisogno di essere sfuggito a meno che non si sta andando ad alimentare questo ingresso per un comando che li riconosce. Così, per esempio, se si dispone di una query come questa:

$term = $_GET['term']; 
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'", 
       mysql_real_escape_string($term)); 

In questo caso, se l'utente digita una % come parte di $term è ragionevole supporre che vogliono cercare in realtà per un letterale %. Pertanto in questi casi è necessario evitare % sostituendolo con \% (\ è il carattere di escape predefinito). str_replace o strtr sono due buone opzioni per questo.

+0

mysql_real_escape_string non ha nulla a che fare con * sicurezza *. è completamente diverso (ampiamente confuso da gente PHP, devo ammettere). È un dato di fatto, sfuggire ma semplicemente una funzione di formattazione di stringhe e niente di più. Anche qualsiasi dato "sicuro" può contenere un'interruzione di riga che deve essere sostituita per la leggibilità dei registri. per non parlare del fatto che per un identificatore non sicuro non andrebbe bene. –

+0

@YourCommonSense: avvolgimento tra virgolette + 'mysql_real_escape_string' = sicuro. Ha * tutto * da fare con sicurezza * indirettamente *, perché è un prerequisito per ciò che fornisce sicurezza * direttamente * (citazione). Grazie comunque per il DV. – Jon

+0

'Tuttavia! Non può mai farti male sfuggire a tutti gli input, "congratulazioni, hai appena inventato la funzione' virgolette magiche'! –

1

È possibile write your own function;) Vedere this thread per ulteriori informazioni.

Altrimenti è possibile utilizzare PDO library o qualsiasi altra libreria di questo tipo.

+0

Il primo collegamento è per 'MSSQL' non' mysql' :-) – undone

+0

sì, era solo per dare un'idea di come implementare la logica per scrivere manualmente una funzione per mysql. La stessa logica può essere implementata anche per MySQL .. – gopi1410