Ir para conteúdo

POWERED BY:

Arquivado

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

thiago_php

sql injection

Recommended Posts

E ai pessoal tenho uma duvida sobre sql injection gostaria q alguem me explica se essa parte desse codigo o q ele faz

 

$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);

 

tirei de um post aqui do imasters sobre sql injection se puderem me explicar essa parte q nao entendi agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha, o Fabyo poderá te explicar melhor porque foi ele que criou a devida função, eu inclusive uso muito ela nos meus script's, valeu Fabyo.Mas o que pega nessa linha é o seguinte, ele usa expressões regulares pra buscar as palavras from, select, insert, delete, where, drop table, e show tables e os caracteres #, \* e \\, e remove eles do codigo, pra dessa forma evitar que seja passado algum comando pro script.Se eu estiver errado, por favor me corrijam.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Diego, sua explicação está correta, só que essa função só pode ser usada em sistemas que não utilizem palavras em inglês, pois do contrário, você corre um sério risco do usuário escrever umas destas palavras em seu texto que, provavelmente, não tenha nada haver com sql.Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você lembrou bem cara.Mas agora surge a pergunta, então como proteger sistemas que serão usados por usuarios em ingles com o comando acima??? Ou existe algum que eu possa substituir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo depende do tipo de dado que você espera... por exemplo, se for uma string, um escape nas aspas e possíveis wildcards (como "%" e "_") deverá resolver.

 

Se for um inteiro, basta forçar o valor da variável para integer através de um cast ou da função intval.

 

Se for uma string no formato DATE, pode-se utilizar expressões regulares pra fazer a validação. Ou simplesmente escapar as aspas... mas aí poderia dar um erro em nível de execução da query, caso os dados não estejam no formato esperado para o campo.

 

E por aí vai... sempre faça a pergunta: "que tipo de dado eu espero que venha nessa variável?", validando a partir disso... e nunca, nunca mesmo, jogue uma variável diretamente na query sem fazer qualquer tratamento.

 

[]'s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensando no fato que o Jonas me disse sobre usuarios que podem postar um texto em ingles eu fiz uma função aqui, nos meus testes funcionou legal, mas queria saber o vocês acham.

 

<?phpfunction anti_injection($sql) {	// Caso a diretiva magic quotes gpc esteja ativa desfaz os escapes automaticos	if (get_magic_quotes_gpc()){		$sql = stripslashes($sql);	}	// Checa se existe a função de tratamento de query e aplica a mesma na string	if (function_exists("mysql_real_escape_string")) {		$sql = mysql_real_escape_string($sql);	}	elseif (function_exists("mysqli_real_escape_string")) {		$sql = mysqli_real_escape_string($sql);	}	// Caso não exista nenhuma das duas funções acima usa addslashes	else {		$sql = addslashes($sql);	}	// Retorna a string tratada	return $sql;}?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);

Thiago, a função sql_regcase() é insensível a maiúsculas e minúsculas, ou seja, ela vai aceitar de qualquer jeito. Quer dizer, "regular case" ou, de uma certa forma "caixa alta ou baixa", que é nada mais nada menos que maiúscalas ou minúsculas.

 

Já a preg_replace() vai substituir, trocar (replace), da espressão regular (reg), todos os valores separados na função pela barra (|), por aquilo que vier no outro campo, que nesse caso é "" (vazio), da variável "$sql".

 

Quanto à questão de um texto em inglês, a função vai retirar essas palavras dele. Não sei como seria nesse caso. Acho que o pessoal pode dar uma idéia melhor de como proceder. B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um idéia rápida é utilizar alguma classe para abstração de dados, como o PEAR DB ou o ADODB, essas classes além de facilitar a eventual troca de banco de dados, faz todo esses tratamentos que estamos dicutindo aqui, é uma idéia, pois sei que tem gente que não gosta de utilizar esse tipo de classe, eu particularmente recomendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

precisam prestar atenção em umas coisas, primeiro se o magic_quote esta ativado se você pretende usar por exemplo mysql_escape_string iria dar erro porque ele ja foi escapado, entao precisa testar antes e desfazer a função addslashes assim:

 

if (get_magic_quotes_gpc()) {
$campo = stripslashes($campo);
}

 

ou num formulario para receber todos os dados e testar:

if ( get_magic_quotes_gpc() ) { 
  $_POST = array_map('stripslashes', $_POST); 
}

 

depois mais um teste:

 

   
function escape($campo) {
if(version_compare(phpversion(),"4.3.0")=="-1") {
$campo = mysql_escape_string($campo);
  } else {
$campo = mysql_real_escape_string($campo, $cnn);
  } 
return $campo
}

 

porque mysql_real_escape_string nao existe antes do php 4.3.0

 

e mais uma função para passar os dados com segurança :

 

$nome = escape($_POST["nome"]);
$senha = escape($_POST["senha"]);

$sql= sprintf("select count(*) as total FROM usuarios where  nom = '%s' AND senha= md5('%s')", $nome, $senha); 
mysql_query($sql);

 

http://br.php.net/manual/pt_BR/function.my...cape-string.php

http://br.php.net/manual/pt_BR/function.my...cape-string.php

 

Jonas Rodrigues, acho legal usar ADOdb, mas pra coisas simples nao compensa, as vezes a pessoa só quer fazer um sistema de login dai ela precisa fazer algo simples e seguro e tbm nao é bom depender de programas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí pessoal, Respondendo à pergunta colocação do Jonas Rodrigues, encontrei uma forma de resolver isso, só um pouco trabalhoso, mas que ajuda nas questões básicas.Você faz alguns textos do tipo "where", 'create', 'drop', etc em arquivos gif e usa a função str_replace, pedindo para substituir a palavra pela imagem correspondente.Eu testei e funcionou desse jeito, vejam:$string = str_replace("where", "<img src='where.gif' />", $string);

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.