Ir para conteúdo
Fórum Script Brasil
  • 0

Função Anti SQL Injection


dedas

Pergunta

Ae galera, beleza ? Estou desenvolvendo um sistema onde possui vários formulários.Devido ao grande número de formulários, fiquei meio receoso em não tentar criar uma função que dificultasse a ação de crackers em meu sistema.Começei a estudar sobre SQL Injection semana passada, então, não sei se esta função está pronta para dificultar a ação deles.Peço que vocês analisem, dêem suas opniões e se quiserem, modifique-a.

/*
Desenvolvida por: Dorian Sampaio Neto
Data:16/04/2012
*/
class SqlInjection{
    
    function AntiSqlInjection($valor){
        if(!empty($valor)){#
            $valor = addslashes($valor);
            $filtros = array(
                
                1 => "'",
                2 => "=",
                4 => "select",
                5 => "order by",
                6 => "/*",
                7 => "union",
                8 => "union all select",
                9 => "@@version",
                10 => "hex",
                11 => "unhex",
                12 => "from",
                13 => "limit",
                14 => "where",
                15 => "insert",
                16 => "delete",
                17 => "update",
                18 => "having",
                21 => "like",
                22 => "*",
                23 => "null"
                
            );
            for($x=1;$x<=round(count($filtros));$x++){
                $valor = str_ireplace($filtros[$x], "", $valor);
            }
            return trim($valor);
        }#
    }
    
}

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

E se o usuário digitar

insfromert

O script irá tirar o 'from', e ficará o insert...

Tens de fazer uma funçãosinha recursiva pra ir substituindo enquanto houver palavras-chave SQL.

Link para o comentário
Compartilhar em outros sites

  • 0
E se o usuário digitar

insfromert

O script irá tirar o 'from', e ficará o insert...

Tens de fazer uma funçãosinha recursiva pra ir substituindo enquanto houver palavras-chave SQL.

Hmmmm, entendi ! Quando chegar do trabalho faço os ajustes e posto novamente :]

Link para o comentário
Compartilhar em outros sites

  • 0

Provavelmente sua função está sem uma condição de parada.

Você deve procurar uma palavra chave na string, e se houver, tire-a e chame novamente a função, senão, pare por aí.

Link para o comentário
Compartilhar em outros sites

  • 0
E se o usuário digitar

insfromert

O script irá tirar o 'from', e ficará o insert...

Tens de fazer uma funçãosinha recursiva pra ir substituindo enquanto houver palavras-chave SQL.

mJi, boa.. mas e se ele colocar 4 variações de cada termo

no caso do from

"from",

" from "

"from "

" from"

só que uma palavra vomo esta que colocou acho que vai retornar em branco

Link para o comentário
Compartilhar em outros sites

  • 0

Galera, depois de muuuuito pensar e muuuuuito tentar eu acho que cheguei +/- onde eu queria...Fiz o lance da recursividade(como o mJi sugeriu) e deu +/- certo.Agora, quando eu coloco insfromert a função elimina o from e o insert.Mas quando eu coloco unhex, a função retira apenas o hex ficando un.Dei uma verificada com os outros e não encontrei nenhum erro.Também percebi que o * não é retirado.

Esses ajustes que eu fiz na função não minha agradaram muito não, pois eu não entendi muito bem o que eu fiz.Eu achei que colocando uma função onde se dentro de $valor existir algum tipo de filtro e isso fosse verdade, a função continuaria o loop.Senão, ela pararia.Para fazer isso, usei o continue e break dentro dessa condição.Não me retornou nada de diferente.

Não quero que alguém me diga como fazer, queria apenas que me explicassem o porque do continue e do break não ter funfando, pois até onde eu estudei, o continue serve para que quando ele seja acionado, ele faz com que o loop continue e o break faz com que o loop pare.Eu acho que a lógica é perfeita.Existe o loop for, onde ele chama cada chave da array, depois, ele faz uma condição onde se existir algum filtro no $valor for verdade, ele troca esse $valor por vazio e continua o loop.Senão, ele para o loop e vai para a próxima chave.

Aqui é a função que NÃO deu certo e que eu não entendi o porque de não ter dado certo.

class SqlInjection{
    
    function AntiSqlInjection($valor){
        if(!empty($valor)){#
            $valor = addslashes($valor);
            $filtros = array(
                
                1 => "'",
                2 => "=",
                4 => "select",
                5 => "order by",
                6 => "/*",
                7 => "union",
                8 => "union all select",
                9 => "@@version",
                10 => "hex",
                11 => "unhex",
                12 => "from",
                13 => "limit",
                14 => "where",
                15 => "insert",
                16 => "delete",
                17 => "update",
                18 => "having",
                21 => "like",
                22 => "*",
                23 => "null"
                
            );
            for($x=1;$x<=round(count($filtros));$x++){
                if(stristr($valor, @$filtros[$x]) == true){
                    $valor = str_ireplace(@$filtros[$x], "", $valor);
                    continue;
                }else{
                    break;
                }
            }
            return trim($valor);
        }#
    }
    
}
Aqui é a função que DEU +/- certo.
ass SqlInjection{
    
    function AntiSqlInjection($valor){
        if(!empty($valor)){#
            $valor = addslashes($valor);
            $filtros = array(
                
                1 => "'",
                2 => "=",
                4 => "select",
                5 => "order by",
                6 => "/*",
                7 => "union",
                8 => "union all select",
                9 => "@@version",
                10 => "hex",
                11 => "unhex",
                12 => "from",
                13 => "limit",
                14 => "where",
                15 => "insert",
                16 => "delete",
                17 => "update",
                18 => "having",
                21 => "like",
                22 => "*",
                23 => "null"
                
            );
            for($x=1;$x<=round(count($filtros));$x++){
                if(stristr($valor, @$filtros[$x]) == true){
                    $valor = str_ireplace(@$filtros[$x], "", $valor);
                    return $this->AntiSqlInjection($valor);
                }
            }
            return trim($valor);
        }#
    }
    
}

Editado por dedas
Link para o comentário
Compartilhar em outros sites

  • 0
Só uma pergunta, você está fazendo isso tudo para usar em produção ou apenas para estudar?

PDO com Prepared statements resolveria os seus problemas.

Um abraço.

Cara, to fazendo para estudar e para usar em meu sistema :] Acho interessante essas bibliotecas, em meu sistema eu uso o PHPMailer.Dei uma lida sobre SQL Injection e achei interessante o assunto.Vi que muitos fizeram suas próprias funções, então achei que seria interessante eu estudar para aprender mais sobre as funções do php, sobre recursividade(não sabia nem que isso existia, se eu não tivesse tentando fazer a função não saberia usar esse recurso), laços de repetição, lógica, etc.Enfim, é isso :]

Link para o comentário
Compartilhar em outros sites

  • 0

Dorian Meu caro, como vai?

Bastaria apenas um preg_replace();

As vezes programar tem que ser descomplicado, pra ser um bom programador tem que fazer muita coisa em poucas linhas,

Meus parabéns, estou orgulhoso de você, evoluio bastante!!

Só não passa de mim certo!! ^^

Abraços meu colega.

function anti_sql_injection($sql)
    {
    $seg = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); //remove palavras que          contenham a sintaxe sql
    $seg = trim($seg); //limpa espaços vazios
    $seg = strip_tags($seg); // tira tags html e php
    $seg = addslashes($seg); //adiciona barras invertidas a uma string
    return $seg;
    }

Editado por Jefferson Oliveira
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...