Jump to content
caioaurelio

Injection no PDO é realmente impossivel?

Recommended Posts

Fala galera.

 

Gostaria de saber se de fato é impossível fazer SQL injection no PDO quando está sendo utilizando prepare(), acham necessário fazer o escape de dados com addslashes() ou htmlentities() como um adicional de segurança?

 

Desenvolvi uma aplicação utilizando PDO dessa forma mas fico em dúvida se somente ele já impediria.

 

Agradeço a ajuda!

Share this post


Link to post
Share on other sites

Veja, não importa se você está utilizando PDO, MySQLi ou o que seja; independentemente da tecnologia, você deve, absolutamente sempre, validar o input e filtrar o output. Isso é regra básica de segurança da informação.

 

Então se o seu campo é esperado receber um número, não jogue direto no PDO; valide se o input é mesmo um número. Se o campo é esperado receber uma idade, não jogue direto no PDO; valide se é uma idade mesmo; não saia aceitando 2 anos ou 200 anos.

 

SEMPRE valide o input e filtre o output.

  • +1 1

Share this post


Link to post
Share on other sites

Sim, tenho consciência disso, a minha dúvida maior é em relação ao caso de texto se eu utiliza htmlentities() e gravar isso no banco de dados posteriormente e for efetuar uma consulta ou utilizar ele para comparação.

 

Então utilizar addslashes() ou htmlentities() é realmente necessário, levando em consideração que utilizo prepare() e vou fazer a checagem desses dados posteriormente antes da entrada no DB?

Share this post


Link to post
Share on other sites

Repetindo: valide sempre o input e filtre sempre o output.

 

No caso de texto informado pelo usuário, se não há validação, como é o caso de biografia e tal, sanitize a entrada e depois filtre a saída. Por exemplo:

 

<?php
//...
$bio = filter_input(INPUT_POST, 'bio', FILTER_SANITIZE_STRING);

if (empty($bio)) {
   // opz, problemas com a bio
}

 Depois de inserido, filtre o valor antes de exibi-lo:

<?php
//...
echo filter_var($bio, FILTER_SANITIZE_SPECIAL_CHARS);

;)

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Diego Carlos
      Bom dia
      Estou com um problema, da seguinte forma tenho essa instrução simples para inserir no banco de dados
      $login = 'diego'; $sqlBilling = 'INSERT INTO BILLING.dbo.tbl_personal_billing (ID, BillingType) VALUES (CONVERT (binary(13), ?), ?)'; $registroBilling = $con->prepare($sqlBilling); $registroBilling->bindValue(1, $login); $registroBilling->bindValue(2, 2); $registroBilling->execute(); ela inseri normal, porem quando vou chegar ela no banco de dados ele esta salvando dessa forma
      d i e g o
      porem se eu executo a mesma instrução direto no banco de dados
       
      INSERT INTO BILLING.dbo.tbl_personal_billing (ID, BillingType) VALUES (CONVERT (binary(13), 'diego'), 2) ele inseri normal
      já fiz de tudo coloquei parâmetro na frente do bindValue passando que diego e um STR
      $registroBilling->bindValue(1, $login, PDO::PARAM_STR); já tentei fazer sem o prepare, fazendo direto pela qurey
      $registroBilling = $con->query('INSERT INTO BILLING.dbo.tbl_personal_billing (ID, BillingType) VALUES (CONVERT (binary(13), 'diego'), 2)'); mesmo resultado
      já fiz no php 7.1 no php 5.6 os dois da a mesma coisa, e o sql e o sqlserver 2008
      ai me restou pedir ajuda rs se puder me ajudar agradeço
    • By rapi
      Não estou conseguindo inserir dados em uma tabela n:m
      Codigo do formulario: 
      <?php session_start(); ?> <!DOCTYPE html> <html> <head> <meta charset ="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="../_css/botoes.css"> <link rel="stylesheet" type="text/css" href="../_css/formulario.css"> <title>Cadastro de Pedido/Produto</title> </head> <body> <!-- Menu --> <nav class="navbar navbar-expand-lg navbar-light bg-primary"> <div class="data" style="text-align:right;"> <script type="text/javascript" src="../js/data.js"></script> </div> <div class="container"> <div class="collapse navbar-collapse" id="navbarSite"> <ul class="navbar-nav mr-auto mb-0 mx-auto"> <li class="nav-item"> <a class="nav-link" href="../index.php">Inicio</a> </li> <li class="nav-item"> <a class="nav-link" href="../read/listarPedidoProduto.php"> Tabela </a> </li> </ul> </div> </div> <div class="hora"> <label ID="Clock">00:00:00</label> <script type="text/javascript" src="../js/hora.js"></script> </div> </nav> <!--Fim do menu--> <div class="container"> <h1 class="text-center"> Cadastro de Pedido Produto</h1> <form method="post" action="processaPedidoProduto.php" class="form-signin"> <input type="text" name="pedido_numero" class="form-control" placeholder="Numero do Pedido"> <br><br> <input type="text" name="produto_codigo" class="form-control" placeholder="Codigo do Produto"><br><br> <input type="text" name="quantidade" class="form-control" placeholder=" Quantidade Pedida"><br><br> <input type="submit" name="enviarCadastro" value="Cadastrar" class="form-control btn btn-estilo"><br><br> <input type="reset" value="Apagar" class="form-control btn btn-estilo"> </form> <div class="container text-center"> <?php if(isset($_SESSION['msg'])){ echo $_SESSION['msg']; unset($_SESSION['msg']); } ?> </div> </div> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script> <script src="../js/personalizado.js"></script> </body> </html> Codigo que envia os dados para o banco:
      <?php session_start(); include("../conexao.php"); $pedido_numero =$_POST['pedido_numero']; $produto_codigo =$_POST['produto_codigo']; $quantidade =$_POST['quantidade']; $sql = "INSERT INTO pedido_produto(pedido_numero, produto_codigo, quantidade) VALUES($pedido_numero, '$produto_codigo', $quantidade)"; if($conexao->exec($sql)){ $_SESSION['msg'] = "<p style = 'color:green;'>Cadastro Realizado com sucesso!</p>"; }else{ $_SESSION['msg'] = "<p style = 'color:red;'>Erro: Cadastro falhou!</p>"; } header("Location: cadastrarPedidoProduto.php"); ?> codigo da tabela em questão:
      CREATE TABLE IF NOT EXISTS `pedido_produto` ( `pedido_numero` INT NOT NULL, `produto_codigo` VARCHAR(45) NOT NULL, `quantidade` INT NOT NULL, PRIMARY KEY (`pedido_numero`, `produto_codigo`), INDEX `fk_produto_codigo_idx` (`produto_codigo` ASC) , INDEX `fk_pedido_numero_idx` (`pedido_numero` ASC) , CONSTRAINT `fk_produto_pedido` FOREIGN KEY (`pedido_numero`) REFERENCES .`pedido` (`numero`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_produto_codigo` FOREIGN KEY (`produto_codigo`) REFERENCES .`produto` (`codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;  
      Estou conseguindo visualizar e deletar os dados, mas inserir e atualizar, não estou conseguindo.
      Obs: tenho outras 3 tabelas e utilizo o mesmo comando para inserir e elas inserem tudo certinho
    • By TheRonaldoStar
      Olá. eu gostaria de tirar uma dúvida que já faz exatamente 1 dia que eu estou fazendo pesquisas e nada.
      Minha dúvida é a seguinte, Estou fazendo um aplicativo de mensagem por browser se e que pode se chamar assim.
      Tipo eu tenho o loby de mensagem semelhante ao Whatsapp e quando a pessoa clica em conversas eu faço a consulta via ajax
      Nesta consulta eu só informo o meu id ou seja o id do usuário logado. e na pagina php eu faço a seguinte consulta no banco de dados:
      Procurar por todas as mensagens da tabela: privado, Nesta consulta me retorna todas as mensagens cujo meu id existe como na coluna: Para, com o status da mensagem valor 0
      Ou seja 0= Disponível e 1 seria deletada. este e o código usado:
       
      $sql = $db->prepare("SELECT * FROM privado WHERE Para = '$ID_user' AND Status = '0' ORDER BY id DESC");
      $sql->execute();
       
      Continuando;
      Após o fazer esta consulta coloquei para listar tudo com o while, colocando todos os id dos usuários em uma variável e dentro deste mesmo while eu faço
      Outra consulta por os usuários informado pela variável id da pessoa que mandou. e isso ocorre com sucesso, ou seja eu consigo fazer quase tudo que eu quero.
      Procurei pelas mensagem, pesquisei por estes usuários mostro: Nome, foto, e a mensagem; Este e o código usado:
       
      while($dados = $sql->fetch(PDO::FETCH_OBJ)){
              $ID_De = ($dados -> De);
              $U_mensagem = ($dados -> Texto);
              $sql1 = $db->prepare("SELECT * FROM usuarios WHERE id = '$ID_De' ORDER BY id DESC");
              $sql1->execute();
              
              while($dados1 = $sql1->fetch(PDO::FETCH_OBJ)){
                  $Foto = ($dados1 -> foto == "") ? "defaut.png" : $dados1 -> foto;
                  $Nome = ($dados1 -> nome);
                  echo "Nome: ".$Nome."<br>Foto: ".$Foto."<br>Mensagem: ".$U_mensagem."<br><br>";
              }
          }
       
      No final fica tudo assim:
       
      Nome: Moderador
      Foto: user_3.png
      Mensagem: Mensagem do moderador

      Nome: Ronaldo
      Foto: user_1.png
      Mensagem: Como vai você?

      Nome: Ronaldo
      Foto: user_1.png
      Mensagem: Olá
       
      Mas no final das contas eu gostaria de saber somente uma coisa para que meu projeto funcione como quero:
      Eu quero que a listagem da ultima mensagem de cada usuário não todas as mensagem daquele usuário, ou seja somente da ultima mensagem de cada um usuário
       
      "Tabela nome: usuários
      Colunas: [ id, De, Para, Texto, Status ]" 
       
      Este e o código completo da pagina:
       
      <?php
          $Hostname = "localhost";
          $Database = "servidor_app";
          $Charset = "utf8";
          $Username = "root";
          $Password = "";
          $db = new PDO('mysql:host='.$Hostname.';dbname='.$Database.';charset='.$Charset.'', $Username, $Password);
          $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          
          $URL_ATUAL= "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
          parse_str(parse_url($URL_ATUAL, PHP_URL_QUERY), $vamos_ver);
          $ID_user = $vamos_ver['id'];
          $sql = $db->prepare("SELECT * FROM privado WHERE Para = '$ID_user' AND Status = '0' ORDER BY id DESC");
          $sql->execute();
          while($dados = $sql->fetch(PDO::FETCH_OBJ)){
              $ID_De = ($dados -> De);
              $U_mensagem = ($dados -> Texto);
              $sql1 = $db->prepare("SELECT * FROM usuarios WHERE id = '$ID_De' ORDER BY id DESC");
              $sql1->execute();
              while($dados1 = $sql1->fetch(PDO::FETCH_OBJ)){
                  $Foto = ($dados1 -> foto == "") ? "defaut.png" : $dados1 -> foto;
                  $Nome = ($dados1 -> nome);
                  echo "Nome: ".$Nome."<br>Foto: ".$Foto."<br>Mensagem: ".$U_mensagem."<br><br>";
              }
          }
      ?>
       
      Pro favor preciso de ajuda urgente.
      Atenciosamente,
      ~Ronaldo
    • By Drims
      Tenho uma consulta que, as vezes, seu conteúdo (enviado via parâmetro) pode ser nulo e em outras é um número inteiro e, lógico, quando o conteúdo é nulo - da forma que a consulta foi construída - não funciona. Alguma ideia?

       
      public function ProcurarAfastado($patente, $cargo){ $sql = "select * from vwPessoal where pe_status = 'A' and pe_des_motivo is not NULL and pa_patente = :pa and ca_cargo = :ca order by pe_nome"; try{ $stmt = $this->pdo->prepare($sql); $stmt->bindValue(":pa", $patente); $stmt->bindValue(":ca", $cargo); $stmt->execute(); $ret = $stmt->fetchAll(); return $ret; } catch (Exception $e) { print "Ocorreu um erro ao tentar executar esta ação, foi gerado um LOG do mesmo, informe a Central.</br>"; } }  
    • By afetur
      Olá,
      Estou precisando inserir alguns dados diretamente no banco saindo dos campos inputs. Preciso que cada item do array seja
      cadastrado no banco, por exemplo o cliente vai comprar 3 ingressos, que os nomes dos 3 ingressos apareçam um a um nos registros.
       Ajustei os códigos abaixo, mas não funciona. Primeiro veja como está o html:
      <label for="nomeingresso">Ingresso:</label> <input type="text" id="ingresso" name="ingresso[]" placeholder="Ex.: Ingresso Conferência" class="form-control name_list" value="<?php echo $row_ingressos['ingresso'];?>" readonly required /> <label for="valoringresso">Valor:</label> <input type="text" class="form-control" id="valor" name="valor[]" placeholder="Ex.: 1.150,00" value="<?php echo $row_ingressos['valor'];?>" readonly required> <label for="nomeingresso">Quantidade:</label> <input type="number" id="quantidade" name="quantidade[]" class="form-control name_list" value="" min="0" required /> <input name="idingresso[]" type="hidden" id="idingresso" value="<?php echo $row_ingressos['id_ingresso']; ?>">  
      Bom, no código abaixo só funciona se eu tirar o foreach, com ele o código não insere os dados no banco. Estou testando o cadastro
      apenas com o campo ingresso para ver se funciona para depois adicionar os campos valor e quantidade, portanto não insere.
       
      function salvarIngresso(){ $ingresso = $_POST['ingresso']; $valor = $_POST['valor']; $quantidade = $_POST['quantidade']; try { // begin the transaction $this->pdo->beginTransaction(); // our SQL statements foreach($ingresso as $key => $ing){ $this->pdo->exec("INSERT INTO evn_pedidos_ing (ing) VALUES ('$ing');"); } // commit the transaction $this->pdo->commit(); echo "New records created successfully"; } catch(PDOException $e) { // roll back the transaction if something failed $this->pdo->rollback(); echo "Error: " . $e->getMessage(); } }  
      A função de conexão é esta abaixo:
       
      function __construct(){ $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->usuario, $this->senha); }
      Para entender melhor qual é o passo a passo do que estou tentando fazer tem um link abaixo. Ao clicar no botão "Inscrever" surge
      o lightbox do Pagseguro, então ele automaticamente insere no banco. Vale ressaltar que só não funciona com o FOREACH, sem esta
      função o código cadastra normalmente, porém só leva o primeiro item do array.

      Agradeço pela ajuda.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.