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.