Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andrey Knupp Vital

Filtro de Injection ..

Recommended Posts

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça como preferir. Você já sabe o que é o certo e o que é o errado. Agora você só precisa decidir.

Um (int) não mata ninguém, muito menos em PHP

 

É importante saber trabalhar com tipos de variáveis. É uma pena o PHP ser tão fracamente tipado. Se um dia você for para Python, por exemplo, terá problemas. Se for para C++/Java, terá sérios problemas.

 

"É ruim. Não tem: tipagem. Na versão 4, você usa variáveis não declaradas e tem POO muito incompleta, alias, nem tem. Ah! tem uma sintaxe muito feia. Use ASP.net ou JSP"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma função que acredito que resolva o problema mesmo no caso do exemplo do amigo William.

Basta você atribuir a aspa simples no tipo string (dentro da função). Assim caso o usuário passe

uma string o valor não será gravado em um tipo int.

 

É um automatização do casting. ^_^

 

function antiInjection ($var,$q='') {
   if (!is_array($var)) {
       switch (gettype($var)) {
           case 'double':
           case 'integer':
               $return = $var;
               break;
           case 'string':
               $temp = (substr_count($var,',')==1) ? str_replace(',','*;*',$var) : $var;
               if (!empty($temp)) {
                   if (is_numeric(str_replace('*;*','.',$temp))) {
                       $temp = str_replace('*;*','.',$temp);
                       $return = strstr($temp,'.') ? floatval($temp) : intval($temp);
                   } elseif (get_magic_quotes_gpc()) {
                             $return = (empty($q)) ? '\''.str_replace('*;*',',',$temp).'\'' : '\'%'.str_replace('*;*',',',$temp).'%\'';
                   } else {
                       $return = (empty($q)) ? '\''.addslashes(str_replace('*;*',',',$temp)).'\'' : '\'%'.addslashes(str_replace('*;*',',',$temp)).'%\'';
                   }
               } else {
                   $return = $temp;
               }
               break;
           default:
               $return = 'Erro: O Tipo da Variável é Inválido!';
       }
       return $return;
   } else {
       return array_map('antiInjection',$var);
   }
}

Abaixo vai um exemplo de teste

 

$x = array('16','1,6','1,2,1',1.3,30,'12 teste');

echo '<pre>';
echo var_dump(antiInjection($x)).'<br />'.gettype($x).'<br />'.gettype(antiInjection($x));

Ai no momento de fazer a query ao invés de:

 

$sql = "SELECT * FROM tabela WHERE nome = '{$nome}' AND id = $id";

Seria:

 

$sql = "SELECT * FROM tabela WHERE nome = {$nome} AND id = $id";

Assim quando o usuário passar uma string como 0 UNION a própria função vai colocar as aspas, evitando o injection. Ex:

 

$sql = "SELECT * FROM tabela WHERE nome = 'periscuelo' AND id = '0 UNION SELECT...'";

Utilizando $y = array_map('antiInjection',$_POST); por exemplo poderia assegurar que $y fosse confiável para usar

nas queries e os erros de tipagem no caso do default exemplificado no switch da função, podem ser tratados antes

de executar a query.

 

Sabemos que fazer query com aspas em campo que deveria ser inteiro não é correto, porém a função não adiciona aspas sempre.

Somente quando o valor é uma string, ou seja, se houver uma tentativa de injection com uma string onde o tipo deveria ser inteiro,

o próprio MySQL vai gerar o erro.

 

A intenção é realmente previnir injections de uma forma mais simples.

 

Não é uma função de ultima geração a laser mas quebra o galho quando

se quer automatizar o casting das variáveis ^_^

 

Me digam caso eu tenha esquecido alguma brecha por favor.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

"É ruim. Não tem: tipagem. Na versão 4, você usa variáveis não declaradas e tem POO muito incompleta, alias, nem tem. Ah! tem uma sintaxe muito feia. Use ASP.net ou JSP"

 

Se usar PHP corretamente não tem problema.

Mas aprender PHP dcomo primeira linguagem de programação pode gerar problemas.

Forçar uma "falsa tipagem" no PHP é útil e seguro

 

 

@Periscuelo,

 

tentei ler seu codigo duas vezes, mas desisti. Que confusão. pra que tudo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

hahahaha eu avisei que não era uma função de ultima geração beraldo rsss.

 

Isso tudo ai é pra forçar o bendito POST ou GET que vira tudo string

a ser do tipo correto. O que for float mesmo que sejá escrito 1,2 vai virar 1.2.

O que for array continuará a ser um array com valores tipados.

E o restante também será forçado. Assim você não é obrigado a tipar tudo a mão.

 

E evita o exemplo de injection do amigo William.

 

Você chegou a testar a função?

 

Ela não remove as escritas de MySQL (SELECT,INSERT,UPDATE e etc), transforma float 1,2 em 1.2

mas não remove a vírgula caso não seja uma string numerica e impede que os tipos sejam confundidos

pelo PHP forçando a tipagem correta para cada dado. Caso seja do tipo string também escapa as aspas.

 

Basicamente visa remover os Sql Injections mesmo.

 

Se preferir eu posso editar a função comentando a mesma ^_^

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.