Como prevenir injeção de SQL em PHP (com imagens)

Índice:

Como prevenir injeção de SQL em PHP (com imagens)
Como prevenir injeção de SQL em PHP (com imagens)

Vídeo: Como prevenir injeção de SQL em PHP (com imagens)

Vídeo: Como prevenir injeção de SQL em PHP (com imagens)
Vídeo: 04 DICAS SIMPLES PARA ESCONDER OS FIOS DA TV! • LARISSA REIS ARQUITETURA 2024, Maio
Anonim

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

    2542820 1
    2542820 1

    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

    2542820 2
    2542820 2

    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

    2542820 3
    2542820 3

    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

    2542820 4
    2542820 4

    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 (); }

Recomendado: