2010-09-15 14 views
54

Sto usando PDO dopo la migrazione dalla libreria mysql. Cosa utilizzo al posto della vecchia funzione real_escape_string?vera stringa di escape e PDO

Ho bisogno di sfuggire alle virgolette singole così entreranno nel mio database e penso che ci possa essere un modo migliore per gestire questo senza aggiungere (ing) barre a tutte le mie stringhe. Qualcuno può dirmi cosa dovrei usare?

+1

Un po 'in ritardo alla festa, ma si potrebbe usare PDO :: citazione() se il metodo prepare() non è un'opzione (ad esempio, quando hai creato il tuo modello) –

risposta

30

Si dovrebbe usare PDO Prepare

Dal link:

Calling PDO :: preparare() e PDOStatement :: execute() per le dichiarazioni che saranno emesse più volte con diversi valori di parametro ottimizza la prestazioni dell'applicazione, consentendo al conducente di negoziare la memorizzazione nella cache del client e/o del lato server del piano di query e delle metainformazioni, e aiuta a prevenire attacchi SQL injection eliminando la necessità di citare manualmente i parametri.

+0

Grazie SteD. Ho letto che un po 'di tempo fa, ma da allora ho sentito che la preparazione PDO NON impedirà l'iniezione SQL. Non sono sicuro di cosa credere più. Sei sicuro che la preparazione fermerà gli attacchi per iniezione? – John

+1

@John è la prima volta che sento qualcuno che ha sentito che la preparazione PDO NON impedirà l'iniezione SQL. Sei sicuro di averlo sentito davvero? La tua fonte è più affidabile della documentazione ufficiale? E nota, c'è sempre un altro modo, diverso dal chiedere a qualcuno: puoi fare una ricerca tu stesso ... –

+4

PDO previene l'SQL Injection. (Non aiuta a prevenire xss vunerabilities, ma nemmeno mysql_real_escape) – nos

4

Utilizzare dichiarazioni preparate. Questi mantengono separati i dati e la sintassi, eliminando la necessità di sfuggire ai dati MySQL. Vedi per es. this tutorial.

+0

Piskvor, grazie. Li sto già usando solo non dove sto ricevendo gli errori. Mi stavo solo chiedendo se preparare davvero arresti gli attacchi per iniezione. Ho sentito il contrario e sembra esserci un sacco di dibattiti su di esso. – John

+1

@John: Sì, le istruzioni preparate interromperanno gli attacchi di SQL injection. (Naturalmente, le iniezioni SQL sono solo un possibile vettore di attacco, quindi impedire loro non è una polvere magica "poof-your-website-is-now-fully-secure") – Piskvor

+1

@ John non c'è un singolo dibattito. In realtà sei solo tu a discuterne. –

23

DOP offre un'alternativa progettata per sostituire mysql_escape_string() con il metodo PDO::quote().

Ecco un estratto dal sito Web PHP:

<?php 
    $conn = new PDO('sqlite:/home/lynn/music.sql3'); 

    /* Simple string */ 
    $string = 'Nice'; 
    print "Unquoted string: $string\n"; 
    print "Quoted string: " . $conn->quote($string) . "\n"; 
?> 

È possibile che questo codice di uscita volontà:

Unquoted string: Nice 
Quoted string: 'Nice' 
+6

Attualmente sto eseguendo la migrazione del vecchio codice per utilizzare PDO e mentre la soluzione è buona, le persone devono essere consapevoli del fatto che posizionerà le virgolette attorno alla stringa. Quindi, se le persone costruiscono query che hanno già citazioni come "SELECT * FROM users WHERE username = '". $ Conn-> quote ($ username). "'"; ', Le query falliranno inevitabilmente. – user3158900

+5

La risposta accettata potrebbe essere il metodo consigliato e la migliore pratica, ma questa risposta è la risposta corretta alla domanda effettiva. a volte hai effettivamente bisogno della vecchia funzione mysql_escape_string, ad esempio se stai costruendo un file da eseguire in seguito. non puoi farlo con una dichiarazione preparata. –

Problemi correlati