Ir para conteúdo

POWERED BY:

Arquivado

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

« Léo »

Anti SQL Injection

Recommended Posts

Fala Galera, blza?

 

Andei lendo bastante na internet sobre SQL Injection e como evitá-lo. Achei muito material bom, mas continuo com algumas dúvidas.

A principal é: Porque não utilizar o htmlentities?? Não é mais simples converter toda a entrada de informação em caracteres HTML ao recebê-la? Desta forma seria dispensável um tratamento posterior (na extração do banco, por exemplo) como o stripslashes. Estou errado?

 

Montei um arquivo com o seguinte código e pretendo utilizá-lo em todas as páginas do meu site afim de evitar o SQL Injection. Pf, deêm suas opniões, sugestões e correções:

 

function anti_sql_injection($v) {
		$r = htmlentities($v); // Converte tudo pra entidades HTML
		$r = str_replace("'", '′', $r); // Substitui a aspas simples por uma entidade HTML similar
		$r = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$r); // Remove comandos SQL [vlw Fabyo]
		$r = addslashes($r); // Por fim, caso tenha passado algo, insere as contrabarras
		return $r;
	}
	
	// Aplica o anti_sql_injection aos inputs
	$_GET 		= array_map('anti_sql_injection', $_GET);
	$_POST		= array_map('anti_sql_injection', $_POST);
	$_REQUEST	= array_map('anti_sql_injection', $_REQUEST);
	$_COOKIE	= array_map('anti_sql_injection', $_COOKIE);

Desde já, agradeço à atenção de todos!

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala João, tudo certo?

 

Então... eu já havia lido sobre a mysql_real_escape_string. No entanto, pelo que entendi, ela funciona +/- como a addslashes e eu gostaria de utilizar algo que não necessitasse de tratamento posterior, entende?

 

Exemplo:

Se eu inserisse com esta função o seguinte texto no banco: Este é o meu "teste"!

Iria ser gravado assim: Este é o meu \"teste\"!

 

Então eu precisaria usar o comando stripslashes (por exemplo) quando eu fosse imprimir esta info na tela.

Imagino que haja uma forma se validar as infos apenas na entrada dos dados. Por isso sugeri a conversão para as entidades HTML.

A validação que postei é mt falha?

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu inserisse com esta função o seguinte texto no banco: Este é o meu "teste"!

Iria ser gravado assim: Este é o meu \"teste\"!

 

Se você usar mysql_real_escape_string, Este é o meu "teste"! será gravado no banco exatamente como Este é o meu "teste"!

 

Simples assim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala João,

 

Agora entendi como se usa corretamente o comando indicado.

No entanto, estou tendo que implementar rotinas de segurança em um sistema já programado e, como o sistema adotou um pouco da "Orientação à Gambiarras", gostaria de saber se o código que postei poderia ser utilizado como paliativo para o mysql_real_escape_string, neste caso. Visto que alterar tooo... ooodas as querys do sistema ia levar mto tempo.

O que acha?

 

Obrigado pela atenção.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

baseado nas sua situação, acho que pode fazer algo assim:

 

function anti_sql_injection($v) {
		$r = htmlentities($v); // Converte tudo pra entidades HTML
		$r = str_replace("'", '′', $r); // Substitui a aspas simples por uma entidade HTML similar
		$r = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$r); // Remove comandos SQL [vlw Fabyo]
		$r = addslashes($r); // Por fim, caso tenha passado algo, insere as contrabarras
		return $r;
	}

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

 

function anti_sql_injection($v) {
		return mysql_real_escape_string($v);
	}

"simples assim.."

 

ou

 

function anti_sql_injection($v) {
		return addslashes($v);
	}

 

pessoalmente prefiro "addslashes" pois já experimentei problemas com "mysql_real_escape_string".

 

não lembro exatamente agora, mas o que ocorria é que não estava convertendo o caracter ' (single quote) em determinadas situações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala hinom, blza?

 

Desculpa a ignorancia, mas eu devo declarar uma fonte seguida da outra?

não entendi bem... tentei colocar assim, no entanto, da erro de "redeclaração" de função:

Fatal error: Cannot redeclare anti_sql_injection() (previously declared in C:\wamp\www\trata_erros\classes\TrataInputs.php:3) in C:\wamp\www\trata_erros\classes\TrataInputs.php  on line 13

Sobre o addslashes, não gostaria de usar para nao precisar tratar a saida das infos do banco.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não deve redeclarar uma função assim.

O @hinom te disse para usar uma ou outra.

 

Eu nunca tive de tratar a saída, usando tanto addslashes como mysql_real_escape_string;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei aqui o addslashes numa query e realmente a info vai pro banco corretamente. No entanto, tenho certeza q ja enfrentei problemas com ele em circunstâncias parecidas.

 

Bom, já percebi que preciso estudar ainda mais esta questão. (rs)

Sobre o codigo que postei, imagino que ele também seja bom pra envitar o HTML Injection, correto?

 

Aplicando ele neste caso, acham q posso vir a ter algum problema?

 

Agradeço a atenção de todos! ;)

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei aqui o addslashes numa query e realmente a info vai pro banco corretamente. No entanto, tenho certeza q ja enfrentei problemas com ele em circunstâncias parecidas.

provavelmente devido a configurações do ambiente.

no php tem uma função magic_quotes, a qual atualmente está em desuso e será completamente removida da versão php6

 

 

Sobre o codigo que postei, imagino que ele também seja bom pra envitar o HTML Injection, correto?

??

isso é outro assunto.

é bom não misturar SQL Injection com XSS injection, html, etc...

 

basicamente, quando precisar exibir dados, provindos do usuário, sob o formato HTML, é boa prática utilizar algum filtro que elimine possíveis caracteres maliciosos.

Uma função específica do PHP é strip_tags

 

Evite criar aqueles monstros de SQL injection, que misturam vários filtros que nao tem nada a ver com SQL.. infelizmente, hoje em dia existem centenas de blogs que só copiam e colam códigos sem saber o que estão fazendo.. Simplesmente copiam conteúdo de um outro blog que também copiou de outro que também não sabe nada do que está fazendo.

O resultado está aí. Uma grande confusão e milhares de profissionais mal informados sobre o assunto.

 

Inclusive, é um assunto já resolvido há mais de 10 anos e continuam criando monstros de sete cabeças.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Hinon, valeu pelo toque!

 

Sobre o XSS Injection, imaginei que a minha htmlentities já seria o bastante para inibir inserções HTML no site.

 

Enfim, o que estou buscando é um include unico que me deixe tranquilo para manipular as infos no restante do código. ;)

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Willian, então.

 

Conforme o João tmb indicou, dei uma olhada no PDO e pretendo usa-lo daqui para frente. No entanto, este projeto já está pronto e sem tratamento de segurança. Por isso, seria muito desgastantes mudar o relacionamento com o banco do site inteeeiro. Então estou buscando um include que impeça o usuário malicioso de manipular o site de qqr forma.

 

De qqr forma, valeu pela dica e atenção.

 

Abs

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.