Jump to content
Fórum Script Brasil
  • 0

Função Anti SQL Injection


dedas

Question

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 to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

  • 0

p**** brother, pensei pra c****** e não consegui sair do lugar :T Toda vida que tentava colocar minha função dentro da função dava esse erro

Fatal error: Maximum function nesting level of '100' reached, aborting!

Não sei mais o que fazer D:

Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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);
        }#
    }
    
}

Edited by dedas
Link to comment
Share on other 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 to comment
Share on other 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;
    }

Edited by Jefferson Oliveira
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...