Mysql
 sql >> Database >  >> RDS >> Mysql

Che cos'è PDO, come è correlato all'iniezione SQL e perché dovrei usarlo?

PDO - Oggetti dati PHP è un livello di accesso al database che fornisce un metodo uniforme di accesso a più database.

Non tiene conto della sintassi specifica del database, ma può consentire che il processo di commutazione di database e piattaforme sia abbastanza indolore, semplicemente cambiando la stringa di connessione in molti casi.

Le istruzioni preparate / le query parametrizzate sono sufficienti per impedire l'iniezione del primo ordine su tale istruzione. Se utilizzi SQL dinamico non controllato in qualsiasi altra parte della tua applicazione, sei ancora vulnerabile all'iniezione di secondo ordine.

L'iniezione di secondo ordine significa che i dati sono stati ciclati nel database una volta prima di essere inclusi in una query ed è molto più difficile da ottenere. AFAIK, non vedi quasi mai veri attacchi di secondo ordine, poiché di solito è più facile entrare in ingegneria sociale.

PDO è un po' più lento di mysql _*. Ma ha una grande portabilità. PDO fornisce un'unica interfaccia su più database. Ciò significa che puoi utilizzare più DB senza utilizzare mysql_query per mysql, mssql_query per SQL Server, ecc. Usa semplicemente qualcosa come $db->query("INSERT INTO...") sempre. Non importa quale driver di database stai utilizzando.

Quindi, per progetti più grandi o portatili è preferibile PDO. Anche Zend Framework utilizza DOP.

Iniezione SQL

Iniezione SQL

L'SQL injection è una tecnica in cui utenti malintenzionati possono iniettare comandi SQL in un'istruzione SQL, tramite l'input di una pagina Web.

I comandi SQL inseriti possono alterare l'istruzione SQL e compromettere la sicurezza di un'applicazione web.

Le istruzioni preparate PDO sono sufficienti per impedire l'iniezione di SQL?

La risposta breve è NO PDO prepara non ti difenderà da tutti i possibili attacchi SQL-Injection. Attacchi esempio

Come si usa la DOP?

Un esempio:

$stmt = $dbh->prepare("SELECT * FROM tables WHERE names = :name");
$stmt->execute(array(':name' => $name));

Riferimenti