Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Duvida sobre SQL injection com PDO.

Olá,

Pois bem, fiz o curso utilizando o PDO, e com o PDO não tive o problema do SQL injection( naquela estrutura de entrada vista na aula -> ... 'or' id=1' .... ). Gostaria de saber se preciso fazer algum tratamento com alguma função similar a do mysqli, sendo que no PDO, ou quando chamo o método prepare ele já faz este tratamento ?

5 respostas

Oi Paulo, tudo bem?

Poderia colocar o código aqui de como você fez para que eu possa dar uma olhada e ver se você corre algum tipo de risco de SQL Injection?

Não conheço muito de PDO, mas em geral essas bibliotecas que abstraem o SQL direto já resolvem isso. Mas colocando seu código poderei ter uma ideia melhor.

Abraço

<?php
include("conecta.php");


function listaProduto($con)
{
    $sql= "select p.*, c.nome as Categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id order by p.id";
    $stmt = $con->prepare($sql);
    $stmt->execute();
    $produtos = array();

    while($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        array_push($produtos,$result);
    }
    return $produtos;
}


function insereProduto($con, Produto $produto)
{
    $stmt = $con->prepare("INSERT INTO produtos(nome,preco,descricao,categoria_id,usado) VALUES (?,?,?,?,?)");
    $stmt->bindParam(1,$produto->nome);
    $stmt->bindParam(2,$produto->preco);
    $stmt->bindParam(3,$produto->descricao);
    $stmt->bindParam(4,$produto->categoria_id);
    $stmt->bindParam(5,$produto->usado);

    return $stmt->execute();
}


function deletaProduto($con,$id)
{
    $stmt = $con->prepare("delete from produtos where id= ?");
    $stmt->bindParam(1,$id);
    $stmt->execute();
}


function buscaProduto($con, $id)
{
    $sql = "select * from produtos where id= ?";
    $stmt = $con->prepare($sql);
    $stmt->bindParam(1,$id);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    return $result;
}

function alteraProduto($con,Produto $produto)
{
    $sql = "update produtos set nome=?,preco=?, descricao=?, categoria_id=?, usado=? where id=?";

    $stmt = $con->prepare($sql);
    $stmt->bindParam(1,$produto->nome);
    $stmt->bindParam(2,$produto->preco);
    $stmt->bindParam(3,$produto->descricao);
    $stmt->bindParam(4,$produto->categoria_id);
    $stmt->bindParam(5,$produto->usado);
    $stmt->bindParam(6,$produto->id);

    return $stmt->execute();
}

Aqui mando um dos 'php's' que interagem com o banco de dados, no caso fazendo a interação com tudo que diz respeito ao produto.

<?php
include("conecta.php");


function listaProduto($con)
{
    $sql= "select p.*, c.nome as Categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id order by p.id";
    $stmt = $con->prepare($sql);
    $stmt->execute();
    $produtos = array();

    while($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        array_push($produtos,$result);
    }
    return $produtos;
}


function insereProduto($con, Produto $produto)
{
    $stmt = $con->prepare("INSERT INTO produtos(nome,preco,descricao,categoria_id,usado) VALUES (?,?,?,?,?)");
    $stmt->bindParam(1,$produto->nome);
    $stmt->bindParam(2,$produto->preco);
    $stmt->bindParam(3,$produto->descricao);
    $stmt->bindParam(4,$produto->categoria_id);
    $stmt->bindParam(5,$produto->usado);

    return $stmt->execute();
}


function deletaProduto($con,$id)
{
    $stmt = $con->prepare("delete from produtos where id= ?");
    $stmt->bindParam(1,$id);
    $stmt->execute();
}


function buscaProduto($con, $id)
{
    $sql = "select * from produtos where id= ?";
    $stmt = $con->prepare($sql);
    $stmt->bindParam(1,$id);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    return $result;
}

function alteraProduto($con,Produto $produto)
{
    $sql = "update produtos set nome=?,preco=?, descricao=?, categoria_id=?, usado=? where id=?";

    $stmt = $con->prepare($sql);
    $stmt->bindParam(1,$produto->nome);
    $stmt->bindParam(2,$produto->preco);
    $stmt->bindParam(3,$produto->descricao);
    $stmt->bindParam(4,$produto->categoria_id);
    $stmt->bindParam(5,$produto->usado);
    $stmt->bindParam(6,$produto->id);

    return $stmt->execute();
}

**Aqui mando um dos 'php's' que interagem com o banco de dados, no caso fazendo a interação com tudo que diz respeito ao produto.

Paulo, ao usar bindParam ou bindValue o PDO já evita o SQL Injection

solução!

Oi Paulo,

Dei uma pesquisada e realmente o PDO já evita SQL inject, desde que você passe os parâmetros da forma como está fazendo mesmo. Em geral o problema é concatenar texto com valores passados pelo usuário. Algo como:

$sql = 'select * from usuario where login = ' + $login;

Isso pode gerar problema, pois o usuário pode digitar outros comandos SQL.

Outra coisa que percebi é que está usando o PDO do modo estruturado. Tente usar no modo objetos, apenas para uma melhor organização e se achar que vale a mudança. Senão, pode continuar da forma que está.

Aqui a documentação: http://php.net/manual/pt_BR/book.pdo.php

Abraço