Como impedir a injeção de SQL no PHP

Como impedir a injeção de SQL no PHP

Este tutorial ajudará você a impedir o SQL injete no PHP. Neste tutorial primeiro, verifique um exemplo básico de processo de injeção de SQL. Como os usuários podem roubar dados do seu site usando a injeção SQL? Este tutorial também inclui métodos para impedir a injeção de SQL usando drivers PHP-MYSQLI e PHP-PDO.

Exemplo simples de injeção SQL

Por exemplo, um site para um banco para o banco. Você forneceu uma interface da web aos clientes bancários para visualizar o número e o saldo de sua conta. O site do seu banco usa URL como http: // Exemplo.com/get_account_details.php?conta_id = 102 Para buscar detalhes do banco de dados.

Por exemplo get_account_details.php tenha código algo como abaixo.

$ accountId = $ _Get ['Account_id']; $ query = "selecione AccountNumber, saldo de contas onde conta = $ conta";
12$ accountId = $ _Get ['Account_id']; $ query = "Selecione AccountNumber, saldo das contas onde conta = $ accountId";

Os clientes AccountId são passados ​​pela String de consulta como conta_id. Como o URL acima, se o ID da conta de um usuário 102 e ele passou na sequência de consultas. O script PHP criará uma consulta como abaixo.

$ query = "selecione AccountNumber, saldo de contas onde conta = 102";
1$ query = "selecione AccountNumber, saldo de contas onde conta = 102";
Detalhes buscados para conta especificada.

Os detalhes do Number e do saldo da conta são buscados para o AccountId 102 e fornecidos aos clientes como exibição na captura de tela acima.

Vamos assumir outro cenário - um cliente mais inteligente passou por conta_id como 0 ou 1 = 1 na string de consulta. O que vai acontecer agora? O script PHP criará uma consulta como abaixo e executado no banco de dados.

$ query = "selecione AccountNumber, saldo de contas onde conta = 0 ou 1 = 1";
1$ query = "selecione AccountNumber, saldo de contas onde conta = 0 ou 1 = 1";
Detalhes buscados para todas as contas

Veja a consulta criada pelo script e o resultado retornado pelo banco de dados. Você pode ver que esta consulta retornou o número de contas e o saldo disponível.

Isso é chamado de injeção de SQL. Este é o cenário simples, pode haver vários métodos para fazer injeções de SQL. Abaixo o tutorial ajudará você a prevenir a injeção de SQL usando o driver php mysqli e o driver pdo php.

#1. Usando o driver php-mysqli

Você pode usar declarações preparadas para driver php-mysqli para evitar esse tipo de injeção de SQL. Use o código PHP abaixo que impedirá a injeção de SQL.

$ accountId = $ _Get ['Account_id']; if ($ stmt = $ mysqli-> preparar ('selecione AccountNumber, saldo de contas em que conta AccountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> Execute (); $ resultado = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // faça algo aqui $ stmt-> close ();
12345678910111213141516$ accountId = $ _Get ['Account_id']; if ($ stmt = $ mysqli-> preparar ('selecione AccountNumber, saldo de contas em que conta AccountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> Execute (); $ resultado = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // faça algo aqui $ stmt-> close ();

#2. Usando o driver php-pdo

Você pode usar o driver PHP-PDO preparar declarações para evitar esse tipo de injeção de SQL. Use o código PHP abaixo que resolverá as injeções SQL.

$ accountId = $ _Get ['Account_id']; if ($ stmt = $ pDO-> preparar ('selecione a conta, saldo de contas em que accountId =: accountId')) $ stmt-> execute (array ('nome' => $ name)); foreach ($ stmt como $ row) // faça algo aqui $ stmt-> close ();
123456789101112$ accountId = $ _Get ['Account_id']; if ($ stmt = $ pDO-> preparar ('selecione a conta, saldo de contas em que accountId =: accountId')) $ stmt-> execute (array ('nome' => $ name)); foreach ($ stmt como $ row) // faça algo aqui $ stmt-> close ();