Ir para conteúdo

POWERED BY:

Arquivado

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

Edultra

SQL Injection - Como Evitar

Recommended Posts

Mais um artigo interessante que recebi, bem util para evitar ataques ao banco de dados.

 

Autor: Herbert Araujo

 

O SQL-Injection é um ataque que visa enviar comandos nocivos à base de

dados através dos inputs dos formulários ou através da query string

(URL).

 

Caso o seu site não esteja "vacinado" contra o SQL-Inject um ataque bem

sucedido pode, entre outras coisas, dropar (apagar) uma tabela do banco;

deletar todos os dados da tabela; conseguir senhas caso existam na

tabela; inserir caracteres inválidos no banco; etc.

 

Regra: Valide sempre todo e qualquer tipo de dado que as páginas do site

estiverem esperando, seja via formulário (post) ou via query string

(get).

 

Bom, vamos à função:

 

Primeiro declaro a função, note que recebe um parâmetro. Esse parâmetro

é o texto que vou validar. Como disse esse texto pode vir de um

formulário ou passado através da URL.

<?php 
function validatxt($txt) { 
	$inject=0;
Aqui declaro um array com as palavras que são consideradas nocivas para

o banco, ou seja, comandos SQL. Todas as palavras do array serão

recusadas. Você pode acrescentar outras palavras, por exemplo, se o seu

formulário for de cadastro, você pode usar a função para barrar algumas

palavras que não queira cadastrar no banco como palavras reservadas ou

palavrões.

 

Note que existe um espaço antes e depois de cada comando do sql. Isso é

proposital já que a palavra sozinha, por exemplo "update" não causaria

nenhum mal ao banco, se o comando fosse usado teria que ser feito da

seguinte maneira: "update set...", teria um espaço entre o comando e o

nome da talela.

$badword = array(" select","select "," insert"," update","update ","
delete","delete "," drop","drop "," destroy","destroy ");
Agora eu faço um loop para percorrer todo o meu array de palavras. Eu

controlo o loop com a função sizeof(), que mostra quantos índices

(palavras) tem meu array. A função substr_count() verifica se a minha

palavra atual $badword[$i] está contida no texto que foi passado para a

validação. Se a função retornar true então existe uma palavra do meu

array dentro do texto passado. Nesse caso eu altero o valor da variável

$inject para 1.

 

for ($i=0;$i<sizeof($badword);$i++)
{ 
  if (substr_count($txt,$badword[$i])!=0)
   { 
	 $inject=1; 
   } 
}

Aspas, apóstrofe, sinal de menor ou de maior ou outros caracteres também

devem ser validados pois são caracteres que não devem ser levados ao

banco. Ao contrário do meu array de palavras inválidas eu declaro um

array de caracteres válidos. Todo caractere que não faz parte do meu

array será recusado pela função. Aqui você também pode acrescentar ou

retirar caracteres conforme a sua necessidade. Note que o último

caractere é um espaço em branco, isso é importante para que a função

aceite palavras compostas (guarda chuva é uma palavra composta). Se

quiser recusar esse tipo de palavra retire o espaço do final do array.

$charvalidos =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ÁÀÃÂÇÉÈÊÍ
ÌÓÒÔÕÚÙÜÑáàãâçéèêíìóòôõúùüñ!?@#$%&(){}[]:;,.- ";
A função strlen() controla o meu loop, ela retorna o número de

caracteres que a palavra que estou validando tem. A substr() retorna uma

parte da palavra, nesse caso um caractere, é por aqui que eu percorro

letra por letra da palavra a ser validada. Com a substr_count() eu

verifico se o caractere é aceito ou não, se não for eu altero valor da

variável $inject para 1.

 

for ($i=0;$i<strlen($txt);$i++)
{ 
  $char = substr($txt,$i,1); 
   if (substr_count($charvalidos,$char)==0)
	 { 
	   $inject=1; 
	 } 
}
Retorno a variável $inject para informar à minha página se a palavra é

inválida ou tem algum caractere inválido.

return($inject); 
// Fim da função 
} 
?>

Ficou um pouco extenso mas foi necessário. Se ficou alguma dúvida me

mande um e-mail. Espero que a função venha a ser útil para alguém.

 

Nesse link coloquei um exemplo funcional:

<http://www.php.locaweb.com.br/araujo/inject.php>

http://www.php.locaweb.com.br/araujo/inject.php

 

Aqui você faz o download do script pronto:

<http://www.phpbrasil.com/scripts/script.php/id/1359>

http://www.phpbrasil.com/scripts/script.php/id/1359

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal , só acho que :

 

1) Deveria estar na parte de php pois é mais linguagem que sql em si.

 

2) Faltar citar a fonte do artigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço para testar na barra de endereço, se está tudo certo? :)

O que posso colocar para testar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal , só acho que :

 

1) Deveria estar na parte de php pois é mais linguagem que sql em si.

Ok mota pode mover.

2) Faltar citar a fonte do artigo.

Recebi por e-mail e as unicas fontes eram as abaixo do artigo.

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.