Como Consertar um Zíper Separado

Como Evitar uma Injeção de SQL em PHP

Este artigo irá ensiná-lo a evitar ataques de injeção de SQL (SQL injection) utilizando as Declarações Preparadas do PHP. A injeção de SQL é um dos tipos mais comuns de vulnerabilidade encontrados nas aplicações WEB de hoje, mas as declarações preparadas utilizam parâmetros vinculados que não combinam variáveis com strings SQL, tornando impossível para o atacante a modificação da declaração SQL.

As declarações preparadas combinam as variáveis com a declaração SQL pré-compilada, e isso faz com que o código SQL e as variáveis sejam enviados separadamente. Depois, as variáveis são interpretadas como meras strings, e não como parte da declaração SQL. Ao utilizar os métodos abaixo, você não precisará utilizar outras técnicas de filtragem de ataques de injeção de SQL, como o mysql_real_escape_string().[1]

editarPassos

editarEntendendo uma injeção de SQL

  1. Uma injeção de SQL é um tipo de vulnerabilidade explorado em aplicativos que utilizam um banco de dados SQL. A vulnerabilidade ocorre quando uma entrada do usuário é utilizada em uma declaração SQL:
  2. O que o usuário digitar na variável URL será atribuído à variável . Depois, ela é utilizada diretamente na declaração SQL, possibilitando que o usuário modifique a declaração.
  3. Assim, o banco de dados SQL receberá a declaração da seguinte maneira:
    • Esse é um código SQL válido, mas em vez de retornar a senha de um usuário, essa declaração retornará a senha de todas as senhas da tabela tbl_user. Com certeza, você não vai querer esse tipo de vulnerabilidade nos seus programas.

editarUtilizando o mySQLi para criar Declarações Preparadas

  1. Crie uma requisição SELECT no mySQLi.
    Utilize o código abaixo para selecionar (SELECT) dados de uma tabela usando as declarações preparadas do mySQLi.

    $name = $_GET['username'];
     
    if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) {
     
        // Vincule uma variável ao parâmetro como string. 
        $stmt->bind_param("s", $name);
     
        // Execute a declaração.
        $stmt->execute();
     
        // Recupere as variáveis da requisição.
        $stmt->bind_result($pass);
     
        // Recupere os dados.
        $stmt->fetch();
     
        // Mostre os dados.
        printf("Password for user %s is %s\n", $name, $pass);
     
        // Feche a declaração preparada.
        $stmt->close();
     
    }
    


    • Observação: a variável é o objeto de conexão mySQLi.


    2542820 1.jpg
  2. Criando uma requisição INSERT no mySQLi. Utilize o código abaixo para inserir (INSERT) dados na tabela utilizando as declarações preparadas do mySQLi.

    $name = $_GET['username'];
    $password = $_GET['password'];
     
    if ($stmt = $mysqli->prepare("INSERT INTO tbl_users (name, password) VALUES (?, ?)")) {
     
        // Vincule as variáveis ao parâmetro como strings. 
        $stmt->bind_param("ss", $name, $password);
     
        // Execute a declaração.
        $stmt->execute();
     
        // Feche a declaração preparada.
        $stmt->close();
     
    }
    


    • Observação: a variável é o objeto de conexão mySQLi.


    2542820 2.jpg
  3. Criando uma requisição UPDATE no mySQLi. Use o código abaixo para atualizar (UPDATE) os dados em uma tabela utilizando as declarações preparadas do mySQLi.

    $name = $_GET['username'];
    $password = $_GET['password'];
     
    if ($stmt = $mysqli->prepare("UPDATE tbl_users SET password = ? WHERE name = ?")) {
     
        // Vincule as variáveis ao parâmetro como strings. 
        $stmt->bind_param("ss", $password, $name);
     
        // Execute a declaração.
        $stmt->execute();
     
        // Feche a declaração preparada.
        $stmt->close();
     
    }
    

    • Observação: a variável é o objeto de conexão do mySQLi.


    2542820 3.jpg
  4. Criando uma requisição DELETE no mySQLi. Utilize o script abaixo para deletar (DELETE) dados de uma tabela usando as declarações preparadas do mySQLi.

    $name = $_GET['username'];
    $password = $_GET['password'];
     
    if ($stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE name = ?")) {
     
        // Vincule a variável ao parâmetro como string. 
        $stmt->bind_param("s", $name);
     
        // Execute a declaração.
        $stmt->execute();
     
        // Feche a declaração preparada.
        $stmt->close();
     
    }
    


    • Observação: a variável é o objeto de conexão do mySQLi.


    2542820 4.jpg

editarFontes e Citações


Erro de citação <ref> tags exist, but no <references/> tag was found


$2

Comentários