Siga-nos em...
Follow us on Twitter Follow us on Facebook Watch us on YouTube
Registro


HGIDC
Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 a 10 de 12
  1. #1

    Avatar de 14biss
    Data de Ingresso
    Jul 2010
    Localização
    Maceió
    Idade
    23
    Posts
    131
    Agradecido
    12
    Agradeceu
    8
    Peso da Avaliação
    11

    Padrão Evitando SQL Injection usando Prepared Statements - PHP+PDO

    Uma das maiores vulnerabilidades de sites, a injeção de SQL ([Somente usuários registrados podem vem os links. ]) é também, no caso do PHP, uma das mais fáceis de prevenir. Infelizmente, muitos não tomam as devidas precauções e acabam tendo os seus dados comprometidos.

    SQL Injection
    Antes de começar, vale a pena ilustrar como funciona um ataque típico de SQL Injection:
    Código PHP:
    // Temos esta consulta simples aonde os dados $username e $password vem de um formulário preenchido pelo usuário
    $query "SELECT * FROM tabela WHERE username = '$username'";
     
    // Se não houver validação correta um usuário mal-intencionado poderia colocar algum código SQL no lugar do username:
    $username "' OR 1'";
     
    // A consulta ficaria assim:
    $query "SELECT * FROM tabela WHERE username = "'' OR 1";
     
    // Como a expressão 'OR 1' sempre resulta em TRUE, a consulta retornaria os dados de todos os usuários no sistema 
    Convenhamos, o exemplo acima é bobo, mas serve para mostrar a teoria por trás da técnica de injeção de sql. Se ainda não se convenceu de que é necessário, veja um exemplo mais grave:
    Código PHP:
    // começamos com a mesma consulta
    $query "SELECT * FROM tabela WHERE username = '$username'";
     
    // desta vez, o código inserido é bem mal-intencionado mesmo...
    $username "'; DELETE FROM tabela WHERE 1 OR username = '";
     
    // a consulta final ficaria assim:
    $query "SELECT * FROM tabela WHERE username = ''; DELETE FROM tabela WHERE 1 OR username = ''";
     
    // ou seja, se executada, a consulta excluiria todos os registros da tabela 
    Validação sozinha não resolve!

    Você pode estar questionando se uma boa validação já não resolveria o problema, já que em ambos exemplos validar para aceitar somente letras funcionaria para bloquear ambas tentavas. Bom a resposta é: SIM e NÃO!

    Por mais que a validação ajude, mesmo usando expressões regulares complexas, há meios de burlá-la utilizando outros charsets e técnicas maliciosas. Segurança nunca é demais e não custa se prevenir para proteger os seus dados ou os dos seus clientes.

    O que são prepared statements?

    Nada mais são do que consultas “pré-prontas”… A diferença é que em lugar das variáveis você coloca um placeholder (marcador de lugar) e na hora da consulta informa a ordem das variáveis a serem substituidas.

    É mais fácil de explicar com um exemplo:
    Código PHP:
    // a interrogação vai no lugar da variável
    $query "SELECT * FROM tabela WHERE username = ?";
     
    // para fazer com vários parametros é a mesma coisa
    $query "SELECT * FROM tabela WHERE username = ? OR username = ?"
    Depois, é só informar o que vai no lugar dos respectivos ‘?’ e a consulta estará protegida! Isto funciona porque ao prepararmos a consulta, avisamos ao MySQL (ou outro [Somente usuários registrados podem vem os links. ] que suporte prepared statements) como é a consulta e exatamente aonde vão as variáveis. Repare que nem precisamos mais colocar aspas em volta da variável, pois ele já sabe que é uma variável e a trata de acordo.

    No PHP, a extensão [Somente usuários registrados podem vem os links. ]também suporta statements preparados, mas recomendo sempre utilizar o PDO pois ele facilita a migração para outros bancos, além de oferecer uma API concisa entre eles.

    Como Funciona com PDO
    Código PHP:
    // vamos partir do pressuposto que temos um objeto PDO instanciado e devidamente configurado e iremos trabalhar com a mesma consulta dos exemplos anteriores
    $query "SELECT * FROM tabela WHERE username = ?";
     
    // o método PDO::prepare() retorna um objeto da classe PDOStatement ou FALSE se ocorreu algum erro (neste caso use $pdo->errorInfo() para descobrir o que deu errado)
    $stmt $pdo->prepare($query);
     
    // agora que temos o statement preparado, precisamos "bindar" a variável
    $username "fulano";
     
    // utilizamos o método PDOStatement::bindValue() que aceita como parâmetros a posição do ? que a variável irá substituir (a primeira é 1) e a própria variável
    $stmt->bindValue(1$username);
     
    // executamos o statement
    $ok $stmt->execute();
     
    // agora podemos pegar os resultados (partimos do pressuposto que não houve erro)
    $results $stmt->fetchAll(PDO::FETCH_ASSOC); 
    Parece meio chato, ter que escrever tanto código a mais para executar uma simples consulta e se a questão da segurança não for motivo sufiente, que tal este: statements preparados são mais rápidos que consultas normais! Especialmente se a mesma consulta for executada diversas vezes durante um request (mudando ou não as variáveis).

    Como o assunto é extenso, incluirei algumas informações adicionais para esclarecer alguns itens, se não precisar de tanto detalhe técnico pode pular ao final!

    Informações Complementares

    • Há outro método para fazer “bind” das variáveis: o PDO::bindParam(), a síntaxe é exatamente a mesma mas ele recebe a variável por referência, enquanto PDO::bindValue() recebe por valor.
      .
    • Tanto o bindValue() quanto o bindParam() aceitam um terceiro parâmetro opcional que é o tipo da variável (PDO::PARAM_STR, PDO::PARAM_INT, etc)
      .
    • Se não gostou da sintaxe de colocar varias interrogações e depois substituir as variáveis de acordo com a posição da interrogação, também é possível utilizar placeholders nomeados:

    Código PHP:
    // em vez da interrogação utilizamos uma palavra prefixada de um ":"
    $query "SELECT * FROM tabela WHERE username = :usuario OR username = :administrador";
     
    // na hora de fazer bind fica mais claro qual variável vai aonde
    $stmt->bindValue(":usuario"$username);
    $stmt->bindValue(":administrador""admin");
     
    // este método também facilita fazer binds dentro de loops foreach aonde o placeholder é a chave e a variável é o valor
    foreach($variaveis as $k => $v){
        
    $stmt->bindValue(":$k"$v);

    E lembre-se, ignorar estas dicas na hora de criar um sistema é o famoso caso do “barato que sai caro”.
    Última edição por 14biss; 02-06-2011 às 12:28 AM.

    break $this->Fuck();

  2. #2


    Avatar de Litlle
    Data de Ingresso
    Jul 2010
    Localização
    Bh
    Idade
    26
    Posts
    255
    Agradecido
    231
    Agradeceu
    78
    Peso da Avaliação
    12

    Padrão

    Pdo é uma me*da, mais facil fazer uma classe de prepare retirando ou convertendo esses dados em ASCII.

  3. #3

    Avatar de 14biss
    Data de Ingresso
    Jul 2010
    Localização
    Maceió
    Idade
    23
    Posts
    131
    Agradecido
    12
    Agradeceu
    8
    Peso da Avaliação
    11

    Padrão

    Eu uso e adoro pdo (:
    Mas poderia dizer por que você acha que pdo é uma me*da?
    Última edição por 14biss; 01-06-2011 às 11:44 PM.

    break $this->Fuck();

  4. #4

    Avatar de sTreZ
    Data de Ingresso
    Feb 2010
    Localização
    Sampa
    Posts
    397
    Agradecido
    0
    Agradeceu
    0
    Peso da Avaliação
    12

    Padrão

    A manutenção do PDO é muito mais fácil do que das funções convencionais.

    Fora que serve para praticamente todos tipos de banco de dados, sendo necessário em alguns caso alterar as querys e não as funções do PHP tornando a manutenção rápida.

  5. #5


    Avatar de Litlle
    Data de Ingresso
    Jul 2010
    Localização
    Bh
    Idade
    26
    Posts
    255
    Agradecido
    231
    Agradeceu
    78
    Peso da Avaliação
    12

    Padrão

    Roda outros sql em pdo pra vocês ver...É uma me*da achar servidores com suporte a todas as extensões do pdo. So mais criar uma função de imprements baseado em ASCII para evitar inject.

  6. #6



    Avatar de Erick-Master
    Data de Ingresso
    Jul 2010
    Localização
    Lorencia :D
    Posts
    401
    Agradecido
    428
    Agradeceu
    152
    Peso da Avaliação
    16

    Padrão

    Eu concordo com o Litlle.

    Dependendo da forma que se trabalha com o PDO, fica 1 pouco pesado a operação do site.
    Fora que PDO não é liberado em todas as hospedagens, ainda mais o PDO MSSQL.

    É mais facio e garantido, desenvolver uma lógica de argumentos, e executando com os proprios comandos do MSSQL.

    Nunca usei PDO, mas pelo fato de ter pouco suporte, não venha a vontade do uso do mesmo.
    Meu ultimo sistema de MSSQL Controller, foi de 2 tipos de argumentos, nenhum deles bloqueia os chars ' " ; --, não retira eles, e nem converte em ASSIC.
    E sim, insira-os na query, não dando nenhum tipo de Inject ; D

    Código PHP:
    $username "'; DROP TABLE dbo.table2;--";

    $CTM_MSSQL = new CTM_MSSQL();
    $CTM_MSSQL->prepare("SELECT * FROM dbo.table WHERE username = ':username'", array(":username" => $username));
    $Build $CTM_MSSQL->execute(); 
    Segundo:

    Código PHP:
    $username "'; DROP TABLE dbo.table2;--";

    $CTM_MSSQL = new CTM_MSSQL();
    $CTM_MSSQL->addArgument($username);
    $Build $CTM_MSSQL->Query("SELECT * FROM dbo.table WHERE username = '%s'"); 
    Ambos com Anti-Inject ; D

    Att,
    Erick-Master - CTM TEAM Softwares

  7. #7

    Avatar de sTreZ
    Data de Ingresso
    Feb 2010
    Localização
    Sampa
    Posts
    397
    Agradecido
    0
    Agradeceu
    0
    Peso da Avaliação
    12

    Padrão

    Erick, você está usando Prepared Statements no seu "MSSQL Controller".

  8. #8



    Avatar de Erick-Master
    Data de Ingresso
    Jul 2010
    Localização
    Lorencia :D
    Posts
    401
    Agradecido
    428
    Agradeceu
    152
    Peso da Avaliação
    16

    Padrão

    @PhiL

    Não é assim não, seu professor pode ser isso tudo que você fala.
    Mas ele é o unico programador no mundo? Ele quem desenvolveu o php?
    Sabia que tem programadores que sabem até mais que os proprios desenvolvedores do php?

    Entenda uma coisa, conhecimento é unico, ninguem sabe tudo, ninguem sabe x%.
    Podemos saber fazer coisas que seu professor não sabe, como também ele pode saber fazer coisas que agente não sabe.

    Cada um tem sua forma de programar e pensar.
    Eu particularmente não sou a favor do PDO, seu professor pode até ser, mas eu não sou.
    PDO é 1 pouco pesado e não é todas as hospedagens que tem ele liberado.

    Chega na KingHost e pergunta se eles liberam o PDO, ja até sei a resposta, nem ionCube eles quiseram atualizar a pedido de clientes, e sim a vontade deles

    @sTreZ

    Se quiser te mando minha classe, ae vemos se uso PDO ; D

    Att,
    Erick-Master - CTM TEAM Softwares

  9. #9



    Avatar de Prøjë¢T
    Data de Ingresso
    Jul 2010
    Localização
    Sao Jose do Rio Preto
    Posts
    1.143
    Agradecido
    99
    Agradeceu
    39
    Peso da Avaliação
    25

    Padrão

    Obrigado 14Biss, como sempre nos ajudando e repassando o conhecimento.... Thanks.
    Última edição por Prøjë¢T; 08-10-2011 às 09:28 PM.

  10. #10

    Avatar de fuckYEA
    Data de Ingresso
    Jul 2011
    Localização
    Acre
    Posts
    35
    Agradecido
    0
    Agradeceu
    0
    Peso da Avaliação
    0

    Padrão

    Muito foda, eu curti a explicação, hoje em dia existem muitas possibilidades, pdo é utilizado sim, por grandes empresas ou não, é mais aceitavel por ser de facil manutenção e adaptação, mudar o banco de dados e etc.. Mas o que não quer dizer que outras bibliotecas sejam ruins. Cada programador programa e pensa de uma forma, também não prescisa se fazer uma carroça com chaci de ferrari né.

    Não sou o mestre do php, estou me aprofundando em poo, seu exemplo deu para ver um pouco do que essa incrivel biblioteca oferece, no livro em que estou lendo também tem um capitulo que aborda muito sobre pdo, mas não cheguei nessa parte ainda. Parabéns pelo artigo 14biss.



    ____
    EDIT:

    Só para completar aqui, quem programa para muonline não é ruim não, até mesmo ao contrario, já que muonline é elaborado por uma equipe e sua base é bem estruturada e etc.. Principalmente a database, que deve ter tabelas ligada outras e etc.. então para desenvolver sistemas assim, é presciso um bom conhecimento, já que não foi você que elaborou a estrutura da sql. Então, não acho que seja correto desmerecer alguns só por que trabalham em cima de um jogo, lembre-se um jogo pode ser muito mais complexo do que uma simples aplicação php mssql.
    Última edição por fuckYEA; 21-08-2011 às 03:02 AM.

 

 
Página 1 de 2 12 ÚltimoÚltimo

Informações de Tópico

Usuários Navegando neste Tópico

Há 1 usuários navegando neste tópico. (0 registrados e 1 visitantes)

Tópicos Similares

  1. |Tutorial| Tutorial SQL Injection Avançado
    Por Hazid no fórum Tutoriais
    Respostas: 6
    Último Post: 29-07-2012, 07:48 PM
  2. |Tutorial| Evitando trade bug's ou como dizem o famoso trade hacker!
    Por Cøłєridgє no fórum Tutoriais, dicas e macetes
    Respostas: 1
    Último Post: 23-08-2010, 12:01 AM
  3. |Tutorial| Evitando Bug Desconnect Por Players
    Por vinnymga no fórum Servers
    Respostas: 0
    Último Post: 19-02-2010, 05:20 PM
  4. |Tutorial| Evitando ataques de SQL Injection
    Por mend3 no fórum PHP
    Respostas: 0
    Último Post: 29-10-2009, 04:20 PM
  5. |Tutorial| Usando Telnet
    Por mend3 no fórum L2J | Tutoriais
    Respostas: 2
    Último Post: 14-09-2009, 02:38 PM

Tags para este Tópico

Marcadores

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •