Este wikiHow ensina como prevenir a injeção de SQL usando Prepared Statements em PHP. A injeção de SQL é uma das vulnerabilidades mais comuns em aplicativos da Web hoje. As instruções preparadas usam parâmetros vinculados e não combinam variáveis com strings SQL, tornando impossível para um invasor modificar a instrução SQL.
As instruções preparadas combinam a variável com a instrução SQL compilada, de forma que a SQL e as variáveis sejam enviadas separadamente. As variáveis são então interpretadas como meras strings e não como parte da instrução SQL. Usando os métodos nas etapas abaixo, você não precisará usar nenhuma outra técnica de filtragem de injeção de SQL, como mysql_real_escape_string ().
Passos
Parte 1 de 2: Noções básicas sobre injeção de SQL
Etapa 1. SQL Injection é um tipo de vulnerabilidade em aplicativos que usam um banco de dados SQL
A vulnerabilidade surge quando uma entrada do usuário é usada em uma instrução SQL:
$ name = $ _GET ['username']; $ query = "SELECT senha FROM tbl_user WHERE name = '$ name'";
Etapa 2. O valor que um usuário insere na variável de URL nome de usuário será atribuído à variável $ name
Em seguida, é colocado diretamente na instrução SQL, possibilitando ao usuário editar a instrução SQL.
$ name = "admin 'OU 1 = 1 -"; $ query = "SELECT senha FROM tbl_user WHERE name = '$ name'";
Etapa 3. O banco de dados SQL receberá a instrução SQL da seguinte maneira:
SELECIONE a senha em usuários_tbl ONDE nome = 'admin' OU 1 = 1 - '
-
Este é um SQL válido, mas em vez de retornar uma senha para o usuário, a instrução retornará todas as senhas na tabela tbl_user. Isso não é algo que você deseja em seus aplicativos da web.
Parte 2 de 2: Usando mySQLi para criar instruções preparadas
Etapa 1. Crie a consulta SELECT mySQLi
Use o código abaixo para SELECIONAR dados de uma tabela usando instruções preparadas mySQLi.
$ name = $ _GET ['username']; if ($ stmt = $ mysqli-> prepare ("SELECT senha FROM tbl_users WHERE name =?")) {// Vincule uma variável ao parâmetro como uma string. $ stmt-> bind_param ("s", $ name); // Execute a instrução. $ stmt-> execute (); // Obtenha as variáveis da consulta. $ stmt-> bind_result ($ pass); // Busque os dados. $ stmt-> fetch (); // Exibe os dados. printf ("A senha do usuário% s é% s / n", $ name, $ pass); // Feche a declaração preparada. $ stmt-> close (); }
Observação: a variável $ mysqli é o objeto de conexão mySQLi
Etapa 2. Crie a consulta INSERT mySQLi
Use o código abaixo para INSERIR dados em uma tabela usando instruções preparadas mySQLi.
$ name = $ _GET ['username']; $ senha = $ _GET ['senha']; if ($ stmt = $ mysqli-> prepare ("INSERT INTO tbl_users (nome, senha) VALUES (?,?)")) {// Vincule as variáveis ao parâmetro como strings. $ stmt-> bind_param ("ss", $ nome, $ senha); // Execute a instrução. $ stmt-> execute (); // Feche a declaração preparada. $ stmt-> close (); }
Observação: a variável $ mysqli é o objeto de conexão mySQLi
Etapa 3. Crie a consulta UPDATE mySQLi
Use o código abaixo para ATUALIZAR dados em uma tabela usando instruções preparadas mySQLi.
$ name = $ _GET ['username']; $ senha = $ _GET ['senha']; if ($ stmt = $ mysqli-> prepare ("UPDATE tbl_users SET password =? WHERE name =?")) {// Vincule as variáveis ao parâmetro como strings. $ stmt-> bind_param ("ss", $ senha, $ nome); // Execute a instrução. $ stmt-> execute (); // Feche a declaração preparada. $ stmt-> close (); }
Observação: a variável $ mysqli é o objeto de conexão mySQLi
Etapa 4. Crie a consulta DELETE mySQLi
O script a seguir mostra como EXCLUIR dados de uma tabela usando instruções preparadas mySQLi.
$ name = $ _GET ['username']; $ senha = $ _GET ['senha']; if ($ stmt = $ mysqli-> prepare ("DELETE FROM tbl_users WHERE name =?")) {// Vincule a variável ao parâmetro como uma string. $ stmt-> bind_param ("s", $ name); // Execute a instrução. $ stmt-> execute (); // Feche a declaração preparada. $ stmt-> close (); }