Come protegge questo codice PDO da Iniezioni SQL?

Quindi stavo esaminando l'intera cosa DOP e stavo leggendo questo tutorial sul blog quando ho trovato questo codice e la spiegazione è che se uso PDO con associazione dati – gli utenti non saranno in grado di aggiungere Iniezioni SQL. Come funziona?

 # nessun segnaposto - maturo per SQL Injection!  
 $ STH = $ DBH -> ("INSERIRE i valori di folks (name, addr, city) ($ name, $ addr, $ city)");  

 # segnaposto senza nome  
 $ STH = $ DBH -> ("INSERIRE i valori di gente (nome, addr, città) (?,?,?); 

 # segnaposto con nome 
 $ STH = $ DBH -> ("INSERIRE il valore di gente (nome, addr, città) (: nome,: addr,: città)");  

Ecco il link al sito Web che ho ricevuto in caso tu voglia leggerlo come riferimento. http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

(C'è un bug nella seconda row, la string non è terminata Aggiungi un "); alla fine, e dovresti essere ok. È anche nella pagina a cui sei collegato, quindi è colpa loro. è necessario fornire i valori che sostituiranno i punti interrogativi e quindi eseguire effettivamente la query, prima di get risultati.)

Comunque, al punto. PDO cerca il ? oppure :name contrassegni :name e li sostituisce (in ordine o per nome, rispettivamente) con i valori specificati. Quando i valori vengono inseriti nella string di query, vengono prima elaborati per evitare qualsiasi cosa possa essere utilizzata per gli attacchi di iniezione.

È come usare mysql_real_escape_string() (o il più debole addslashes() ) su un valore prima di usarlo in una query, ma PDO lo fa automaticamente ed è migliore.

DOP fa molto di più dietro le quinte che semplicemente sostituendo i segnaposto con i dati parametrizzati. I motori di database possono accettare query in un formato simile a "ecco la tua dichiarazione, ecco i segnaposto e ti dirò cosa succede in each segnaposto". Il motore SQL sa che i parametri NON sono codice raw da eseguire ma devono essere trattati solo come dati.

Perché il PDO sa come inserire correttamente i valori nella query quando si utilizza un'istruzione preparata.

Quando leghi un valore al segnaposto, ad es

 $sth->bindValue(':name', $name, PDO::PARAM_STR); 

DOP si prenderà cura di fuggire correttamente. Pertanto, le Iniezioni SQL non functionranno.

Perché un'istruzione preparata con i parametri di bind è un'istruzione in cui l'analisi della query è già stata eseguita e le posizioni per stringhe o int sono solo striongs o int. Nessuna nuova analisi delle affermazioni viene eseguita, quindi nessun argomento dato può essere analizzato come qualcosa relativo a SQL e non verrà mai analizzato come SQL.