Ir para conteúdo

POWERED BY:

Arquivado

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

fsphp

Evitando SQL injection

Recommended Posts

Olá pessoal,

 

Estava lendo no Manual do Php sobre como evitar SQL Injection e teve um comentário dizendo que uma forma simples contra isso é converter as entradas em binários, não sei se entendi corretamente, mas acho que ele quis dizer que para cada caracter digitado você o modifica e insere no seu db de forma filtrada.

 

I think that easy way to protect against SQL injection is to convert inputted data into binary format, so that whatever input is, in sql query it will consist only of 1s and 0s.

Seria mais ou menos isso:

 

function anti_injection($string)
 {
$string = str_replace("a", "0", $string);
$string = str_replace("b", "1", $string);
 $string = str_replace("c", "00", $string);
 $string = str_replace("d", "11", $string);
 $string = str_replace("e", "01", $string);
 $string = str_replace("f", "10", $string);
 $string = str_replace("g", "000", $string);
 $string = str_replace("h", "111", $string);
 $string = str_replace("i", "001", $string);
 $string = str_replace("j", "010", $string);
 $string = str_replace("k", "100", $string);
 $string = str_replace("l", "110", $string);
 $string = str_replace("m", "101", $string);
 $string = str_replace("n", "011", $string);
 $string = str_replace("#", "0000", $string);
 $string = str_replace("*", "1111", $string);
 $string = str_replace("--", "0001", $string);
 $string = str_replace(";", "0010", $string);
 $string = str_replace("=", "0100", $string);
 $string = str_replace("<", "1110", $string);
 $string = str_replace(">", "1101", $string);
 $string = trim($string);
 $string = strip_tags($string);

 return $string;
 }

Obrigado a todos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma saída é esta:

 

$str = 'Beraldo';
$tam = strlen($str);

$newStr = '';
for ( $i = 0; $i < $tam; $i++ )
{
	$newStr .= 	'' .  ord($str{$i}) . ';';
}

echo $newStr;

Veja o HTML gerado.

 

Aqueles números são os códigos ASCII dos caracteres.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, que legal Beraldo!!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Nesse caso todos os caracteres que forem enviados para o db serão transformados em ASCII, isso elimina o SQL Injection? :huh:

 

Obrigado. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

PS: Algum moderador poderia incluir o código do Beraldo no LABORATÓRIO DE SCRIPTS no índice ligado à Anti SQL Injectio. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Beraldo,

 

Isso também vai resolver um problema que eu tinha quando o pessoal enviava fotos para a galeria de fotos do meu site e no computador deles as mesmas estavam nomeadas com acentos e cedilhas, o ftp sempre falhava e aparecia o link quebrado da imagem, aí eu tinha que pedir pro pessoal renomear e enviar.

 

Matou dois coelhos com uma cajadada!

 

BELO CÓDIGO, e simples!!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse lance de usar código ASCII parece ser bom para exibir e-mails em sites.

 

Por enquanto, creio que poucos bots de spam estão fazendo a conversão de ASCII para caractere, para buscar e-mails em códigos-fonte... hehe

mas isso pode mudar logo logo, se todos passarem a converter e-mails para códigos ASCII.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como assim Beraldo, não entendi sua colocação, dá pra traduzir? Isso não afeta a segurança dos dados enviados ao db, ne? Somente que os bots de spam vão varrer até códigos em ASCII, é isso? :wacko:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que afetaria a segurança? Fica até desumano conseguir ler o conteúdo, afinal, tem que usar uma linguagem para decodificar.

Eu nunca usei isso num sistema, pois nunca julguei necessário. Se você realmente quiser usar, pense bem no que deve ser convertido. Por exemplo, se o sistema aceitar HTML, terá de manter as tags intactas.

 

 

Quanto aos bots, eles buscam por e-mails em códigos-fontes de sites. Por isso o pessoal coloca:

 

email @ dominio . com

email at dominio dot com

...

 

É uma tentativa de esconder os endereços.

Mas os bots também evoluem, assim como os Pokemons... :P

Então logo eles poderão ler e-mails codificados em ASCII.

 

É triste pensar nisso, mas é verdade. http://forum.imasters.com.br/public/style_emoticons/default/cry.gif :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, Beraldo.

 

Agora, quanto ao que você falou:

 

Por exemplo, se o sistema aceitar HTML, terá de manter as tags intactas.

Os SGBD não restringem o conteúdo que armazenam, né? Não vão interferir nele caso sejam tags html, correto? No caso terei que selecionar o tipo de COLLATION como ASCII, ou não tem nada a ver, tipo pode ser utfb, latin, etc?

 

Agora, outra coisa, se transformar tudo em binário, como comentaram no manual do php, sendo esses binários de acordo com uma forma determinada por mim, é uma boa alternativa?

 

Obrigado pelos ensinamentos! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu disse, eu nunca usei o que eu sugeri. Teoricamente, não há uma codificação específica para o banco. Pode usar utf8 normalmente, eu acho. Tem que testar. Mas não deve ter problemas, pois é simplesmente um conjunto de números.

 

 

Não lembro se o PHP tem uma função para converetr caractere ASCII para binário. Deve ter; tem que dar uma pesquisada.

Mas tem que ver, também, se o HTML converte o binário para caractere ASCII.

 

Não entendi de onde vem esses números. 'a' é '0'? não faz sentido. 'a' é 97, em decimal, na tabela ASCII. Em binário, seria 0110 0001 , não 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

sempre usei esse... é mais simples.. mas acredito eu que funcione...

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

ou isso pode não ser totalmente seguro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

e depende do idioma

 

Imagine usar essa função num site em inglês.

 

SELECT, FROM... tudo isso seria simplesmente removido. O texto ficaria sem sentido

 

Nã é necessário remover paalavra alguma. Basta saber como tratar os dados.

 

Basicamente, basta escapar aspas. Nem precisa converter para código ASC ou binário

 

Vejam a discussão deste tópico:

http://forum.imasters.com.br/index.php?showtopic=276729

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi de onde vem esses números. 'a' é '0'?

Esse foi um exemplo que dei, pois não sabia qual a correspondência do alfabeto com os binários. Seria uma função para enviar ao db os valores segundo um critério próprio, escolhido pelo programador, e depois, a função inversa para filtrar e jogar do banco para a tela. Será que funciona?

 

 

'a' . Em binário, seria 0110 0001 , não 0

você tem essa tabela de binários?

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.