Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O que é PDO, como está relacionado com injeção de SQL e por que devo usar isso?


PDO - Objetos de dados PHP é uma camada de acesso ao banco de dados que fornece um método uniforme de acesso a vários bancos de dados.

Ele não leva em conta a sintaxe específica do banco de dados, mas pode permitir que o processo de troca de bancos de dados e plataformas seja bastante simples, simplesmente trocando a string de conexão em muitos casos.



Instruções preparadas/consultas parametrizadas são suficientes para evitar a injeção de primeira ordem nessa instrução. Se você usar SQL dinâmico não verificado em qualquer outro lugar em seu aplicativo, ainda estará vulnerável à injeção de segunda ordem.

A injeção de segunda ordem significa que os dados passaram pelo banco de dados uma vez antes de serem incluídos em uma consulta e é muito mais difícil de obter. AFAIK, você quase nunca vê ataques reais de segunda ordem, pois geralmente é mais fácil fazer engenharia social para entrar.

PDO é um pouco mais lento que o mysql _*. Mas tem uma grande portabilidade. O PDO fornece uma interface única em vários bancos de dados. Isso significa que você pode usar vários bancos de dados sem usar mysql_query para mysql, mssql_query para SQL Server etc. Basta usar algo como $db->query("INSERT INTO...") sempre. Não importa qual driver de banco de dados você está usando.

Assim, para projetos maiores ou portáteis, o PDO é preferível. Mesmo Zend Framework usa DOP.

Injeção de SQL

Injeção SQL

A injeção de SQL é uma técnica em que usuários mal-intencionados podem injetar comandos SQL em uma instrução SQL, por meio de entrada de página da web.

Comandos SQL injetados podem alterar a instrução SQL e comprometer a segurança de um aplicativo da web.

As instruções preparadas pelo PDO são suficientes para evitar a injeção de SQL?

A resposta curta é NÃO, A preparação do PDO não o defenderá de todos os possíveis ataques de injeção de SQL. Ataques exemplo

Como usar o PDO?

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

Referências