Ir para conteúdo

Arquivado

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

Fabyo

Anti SQL Injection

Recommended Posts

Eu esperimentei usar a funcao Anto SQL Injection e nao funcionou Fabyo... Eu a coloquei igual voce disse, recebendo a variavel do formulario, exemplo:

 

PHP

[*]

[*]$nome = anti_injection($_POST['nome']);

[*]

 

Quando tentava logar no sistema, ele transformava qualquer coisa que colocava tanto em nome como senha em ' A ' (sem aspas).

 

O que acontece?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nao gosto muito de usar o comando trim() no anti_injection.

Pq a propria senha do usuario pode querer colocar um espaco no comeco ou no final se ele acha mais seguro.

 

Mas o codigo esta muito bom

Compartilhar este post


Link para o post
Compartilhar em outros sites

essa função que eu fiz ja ta velha e quase obsoleta, mas eu criei uma versao nova pra quebrar o galho, com o mysqli do php5 nao temos mais problemas com sql injection = )

 

function anti_injection($txt)

{

$txt = get_magic_quotes_gpc() == 0 ? addslashes($txt) : $txt;

return preg_replace("@(--|\#|\*|;|=)@s", "", $txt);

}

 

o mysql entende como comentario ', # , /* */ e --

e ( ; ) ele encerra uma instrução sql e começa uma nova por isso é bom remover o ponto e virgula pois podem usar ela para executar um novo comando sql ignorando o atual do script

 

leiam:

 

http://dev.mysql.com/doc/mysql/pt/comments.html

 

http://dev.mysql.com/doc/mysql/pt/ansi-diff-comments.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tenho fiz um sisteminha legal pra sqçinjetion ... ve se é dahora

eu tbm uso ele pra filtrar palavras com palavrao essas coisas

 

PHP

[*]<?

[*]function filtra($texto) {

[*]

[*]$badchar[1] = "drop";

[*]$badchar[2] = "select";

[*]$badchar[3] = "delete";

[*]$badchar[4] = "update";

[*]$badchar[5] = "insert";

[*]$badchar[6] = "alter";

[*]$badchar[7] = "destroy";

[*]$badchar[8] = "table";

[*]$badchar[9] = "database";

[*]$badchar[10] = "drop";

[*]$badchar[11] = "union";

[*]$badchar[12] = "TABLE_NAME";

[*]$badchar[13] = "1=1";

[*]$badchar[14] = 'or 1';

[*]$badchar[15] = 'exec';

[*]$badchar[16] = 'INFORMATION_SCHEMA';

[*]$badchar[17] = 'TABLE_NAME';

[*]$badchar[18] = 'like';

[*]$badchar[19] = 'COLUMNS';

[*]$badchar[20] = 'into';

[*]$badchar[21] = 'VALUES';

[*]

[*]$y = 1;

[*]$x = sizeof($badchar);

[*]while ($y <= $x) {

[*]  $pos = strpos(strtolower($texto), strtolower($badchar[$y]));

[*]  if ($pos !== false) {

[*]  $texto = str_replace(strtolower($badchar[$y])"", strtolower($texto));

[*]  }

[*]  $y++;

[*]  }

[*]return $texto;

[*]}?>

 

pra chamar a função é

 

echo filtra($texto);

 

ve se é dahora ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

só uma dica você eliminando apostrofo e comentarios ja praticamente nao tem como ter sql injection dai nao precisa filtrar essas palavras do select

por exemplo se você filtrar só os comentarios e escapar as aspas

quando der um select ele ira buscar pelo nome e nao ira executar o select exemplo:

 

$nome = "select";

select * from tabela where nome = '$nome'

vai ficar:

select * from tabela where nome = 'select'

entendeu ele nao ira achar o nome select e nem os outros: drop, insert, delete, etc.

 

qualquer comando sql sera lido como uma string qualquer

 

agora sobre apostrofos:

 

$nome = "1' or 1 = '1";

select * from tabela where nome = '$nome'

reslutado:

select * from tabela where nome = '1' or 1 = '1'

 

agora escapando os apostrofos:

 

select * from tabela where nome = '\'1 or 1 = \'1'

 

pronto tbm nao vai achar essa string no banco e nao executara o comando sql e sim ira fazer uma simples busca

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu costumo injetar sqls em sistemas feitos em ASP, 50% deles passam numa boa, o que mais utilizo é sse:'; GRANT ALL PRIVILEGES ON *.* TO 'msstr'@'%' WITH GRANT OPTION; --cria um usuário chamado "msstr" com todas as permissões e acesso remoto, com isso obtém-se total controle do bd. E à partir do bd pode-se criar arquivos de script para ir fuçando no servidor inteiro.tudo por causa de uma simples brecha num sistema de loginou em algum campo de entrada.o PHP já vem configurado por padrão para usar o adslashes por isso é mais difícil burlar mesmos os sistemas mais simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz tempo q eu nao venho aki, nem sabia que jah tava obsoleta. Mas de qualquer maneira vou contribuir com meu code(alteracao):

 

<!--PHP-Head--><div class='codetop'>CODE</div><div class='codemain'><!--PHP-EHead--><?php

 

 

 function anti_injection_array($array)

 {

 foreach($array as $chave => $valor){

 // remove palavras que contenham sintaxe sql

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

 $valor trim($valor);//limpa espaços vazio

 $valor strip_tags($valor);//tira tags html e php

 $valor addslashes($valor);//Adiciona barras invertidas a uma string

 $return["$chave"] = $valor;

 }

 return $return;

 }

 

?>

</span><!--PHP-Foot--></div><!--PHP-EFoot-->

 

 

Exemplo:

<!--PHP-Head--><div class='codetop'>CODE</div><div class='codemain'><!--PHP-EHead--><?php

 

// Todos os dados do form limpos pra uso, nao precisa fazer um por um  :)/>

extract(anti_injection_array($_POST));

//OU

$_POST anti_injection_array($_POST); 

 

 

?>

</span><!--PHP-Foot--></div><!--PHP-EFoot-->

Compartilhar este post


Link para o post
Compartilhar em outros sites

JuSeH,nao funcionou em todos os campos do meu form nao... alguns nao pegaram as variaveis... pq? alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual é o link do manual que fala sobre injections?? to procurando lá e não achei...Pode passar?Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php function anti_injection_array($array) { foreach($array as $chave => $valor){ // remove palavras que contenham sintaxe sql $valor = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$valor); $valor = trim($valor);//limpa espaços vazio $valor = strip_tags($valor);//tira tags html e php $valor = addslashes($valor);//Adiciona barras invertidas a uma string $return["$chave"] = $valor; } return $return; }?>
Somente complementando: se por exemplo o valor recebido de um item do post for array?? ai vai dar pau...heheh...

O certo seria:

<?php function anti_injection_array($array) {	foreach($array as $chave => $valor)	{		if (is_array($valor))		{			anti_injection_array($valor);		}		else		{			// remove palavras que contenham sintaxe sql			 $valor = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$valor);			 $valor = trim($valor);//limpa espaços vazio			 $valor = strip_tags($valor);//tira tags html e php			 $valor = addslashes($valor);//Adiciona barras invertidas a uma string			 $return["$chave"] = $valor;		}	}	return $return; }?>

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi galera...

meu amigo esta tendo problema com SQL INJECT,

ele tem um servidor de um jogo chamado MU

tem alguns caras que conseguem invadir o SQL e se EDITAR no jogo..

eles estao conseguindo dar SQL INJECT(pelo site na area de logar,criar conta,etc)

eu queria saber se vcs podem ajudar..

por exemplo eu presisava de 1 codigo que blokiase o SQL INJECT,ou algo assim...

QUALQUER COISA Q IMPEDISEM ELES DE FAZER ISSO...

SE ALGUEM PODE ME AJUDA POR FAVOR POSTE ALGO AKI..

MUITO OBRIGADO! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif/>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Queria saber sobre as tags para PostgreSQL, tem que se tomar o mesmo cuidado, ou elas são ja seguras como mysqli?Obrigado =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eu usava assim...

$xa = getenv('REMOTE_ADDR');$badwords = array(";","'","\"","*","union","del","DEL","insert","update","=","drop","sele","$");foreach($_POST as $value)foreach($badwords as $word)if(substr_count($value, $word) > 0)die("Aviso!<br />Não utilize caracteres especiais");

Ele busca todos os dados q sao enviados por fomulários...

Mas gostei desse do Fabyo, o chato é lembrar de colocar a função em todos os campos...

Vou tentar juntar os dois...

Compartilhar este post


Link para o post
Compartilhar em outros sites

AmigosSou iniciante em PHP e estou assustado com este negocio de códigos maliciososEntendi que tenho que colocar a função no inicio da pagina e quando receber os dados do formulário deve tratá-lo como no exemplo:$dados = anti_injection($_POST["dados"]);Caso eu tenha mais de um formulário na pagina, como devo proceder?Como funcionam estes códigos maliciosos, o Eclesiastes postou algo assim:Exemplo: 1' OR 1='1Isso é um código malicioso é inserido no campo do formulário? Como funciona. Como se proteger?Obrigado pela atenção amigos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço para chamar esta função?

 

respostas:

 

$variavel = anti_injection($variavel);

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal vamos dar mais continuar com esse assunto que afeta a muita gente...Uma duvida so se pode invadir um banco de dados usando sql injection por campos de formularios?

Compartilhar este post


Link para o post
Compartilhar em outros sites

GaleraEstou começando a ter problemas com SQL INJECTION e realmente gostaria de me informar sobre issoEstou num estagio de lammer pra ser sinceroQuem puder ajudar indicando um TUTO ou coisa do tipo[]'s

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.