Edultra 13 Denunciar post Postado Janeiro 21, 2009 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 parao 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. Eucontrolo 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 decaracteres 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
Motta 645 Denunciar post Postado Janeiro 21, 2009 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
hgb7 3 Denunciar post Postado Janeiro 21, 2009 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
Edultra 13 Denunciar post Postado Janeiro 22, 2009 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