| SQL injection - Joomla e segurança (artigo 3) |
|
|
|
|
Qualquer SGBD (Sistema Gerenciador de Bancos de Dados Relacional) entende apenas uma linguagem: SQL (Structured Query Language) ou linguagem de consulta estruturada. CREATE, DELETE, UPDATE e SELECT são apenas alguns dos comandos mais utilizados nesta linguagem, mas não está no escopo do nosso artigo, ensinar SQL e sim apresentar-lhe o SQL INJECTION.
uma das mais formas mais comuns e efetivas de ataque na internet é o SQL Injection. No SQL Injection, um hacker tenta enviar códigos SQL via consultas SQL não autorizadas e filtradas. O código SQL do hacker pode não ter nenhum retorno em termos de informações de segurança ou simplesmente executar um processo de destruição absoluta. Existem precauções básicas que você deve tomar, para proteger os dados que serão recebidos através de formulários, principalmente se foi você quem o desenvolveu. A regra básica é tratar e validar os dados que serão recebidos e se assegurar que o seu código nunca irá recber os dados de uma forma bruta, ou seja, sem o devido tratamento.
Você pode tratar os dados de várias formas, desde limite de caracteres aceitos com maxlenght e size até scripts em javascript, para fazer a validação a nível cliente e scripts PHP, para validação a nível provedor. Todos os dados enviados, devem ser processados e validados antes de serem utilizados pela aplicação. Campos de texto em formulário sem filtragem por exemplo, um formulário HTML podem aceitar um campo para um nome. Enquanto um usuário normal iria simplesmente digitar o seu nome no campo de texto do formulário, o hacker injeta código SQL para tentar executar uma consulta não autorizada ao banco de dados. Se no código do script PHP que vai receber os dados do formulário você setou a variável $name do tipo Get ou Post nome, que é o campo do formulário, a consulta normal ao banco de dados seria algo isto: $sql="Select * FROM jos_users WHERE name =' " . $name. " ';"; o hacker então digitaria algo parecido com o que segue: dummytext ' OR ' a ' = ' a o código SQL gerador a partir desta injeção seria algo parecido com isto: select * FROM jos_users WHERE name = 'dummytext' OR ' a ' = ' a ' ; quando a consulta enviada pelo hacker é executada, o teste ' a ' = ' a ' retornaria um valor real para cada linha e a consulta apresentaria a lista de todos os usuários existentes na tabela jos_users! O mais assustador é que qualquer código SQL válido, ou seja, sem erro de sintaxe, pode ser injetado, como mostrado no código a seguir: dummytext ' ; DROP table jos_users; SELECT * FROM jos_poll where title = ' o código acima iria destruir completamente a tabela de usuários do Joomla. Uma rotina simples de tratamento e validação do campo de texto do formulário, permitiria eliminar qualquer perigo de um ataque deste tipo.
Manuseando campos de texto em Joomla e PHP Joomla inclui rotinas para gerar caracteres de escape para quaisquer caracteres (string) que não podem ser armazenados adequadamente dentro de um banco de dados. Por exemplo, a plica ( ' ) não pode ser armazenada na declaração SQL padrão de inserção sem modificação. Portanto, uma sequência de caracteres de escape com barra invertida ( \ ) permite a inclusão de caracteres especiais no MySql. Assim, uma barra invertida seguida pela citação ( \ " ) seria o único meio de armazenar os dados no campo do banco de dados. A seqüência de caracteres de escape fornecidos pelo próprio sistema invalida o ataque via injection, porque os caracteres digitados pelo hacker não serão entendidos pelo sistema como um comando SQL, será apenas um caracter literal comum a ser armazenado no banco de dados. O provável resultado dessa consulta seria o retorno de um erro, uma vez que não existem registros correspondentes a esse valor seria encontrado.Para o código PHP, você pode usar um banco de dados específicos de cada método para gerar uma string que cria códigos para escapar de caracteres especiais. Para o MySQL, PHP inclui a função mysql_real_escape_string () O uso da função fica parecido com isto: $name = mysql_real_escape_string($name); joomla fornece um método getEscaped () que irá retornar a string independentemente de sequência de escape de caracteres. Embora Joomla atualmente só suporta MySQL (previsto suportar ORACLE a partir da versão 6), você pode obter com o objeto JDatabase, a string que escapou e seria algo parecido com isto: $db =& Jfactory::getDBO(); $name = $db->getEscaped($name) ; Voltando aos ataques, no primeiro exemplo de ataque via SQL Injection, com os caratceres de escape, teríamos a seguinte seqüência inofensiva: dummytext \ ' or \'a \ ' = \' a O segundo exemplo ficaria assim: dummytext\' ; Drop Table jos_users; select * from jos_polls where title = \ ' Existe uma diretiva do PHP conhecida como "magic quotes", que irá adicionar automaticamente barras para todos os campos recebidos de fonte externa (como um navegador da web). Na versão 6 do PHP, esta diretiva foi eliminada. Portanto, é melhor ficar atento(a) aos códigos, principalmente de extensões de terceiros, para que seja executado de forma segura e caso esteja hospedando o Joomla em servidores com PHP 4.x (a maioria dos baratinhos ainda utilizada esta versão antiga do PHP) verifique a magiq quotes. ELA DEVE ESTAR LIGADA, ou seja, magiq_quotes = ON Tipos não esperados Até o próximo artigo Artigo traduzido e adaptado por Júlio Coutinho. O original, está publicado no capítulo 14 do livro Professional Joomla - Programador para Programador, de Dan Rahmel. |
Voltar
Como publicar meu site Joomla?
Uma vez que o website foi completamente testado, no ambiente de teste, você vai precisar implantá-lo em um ou mais servidores de produção. A transição do servidor de teste (esteja ele local ou não)é uma tarefa que exige uma atenção especial e basicamente é composta de ações a serem tomadas em ordem cronológica para que de tudo certo. Leia +





