sexta-feira, 26 de abril de 2013

Codificando os parâmetros de uma URL no PHP

Quando se utiliza o método GET os parâmetros de solicitação, codificados como pares de nome e valor, ficam visíveis na URL do script que trata a solicitação HTTP. Isto torna o GET menos seguro, comparado ao POST, porque os dados são enviados como parte da URL e assim, além da URL estar visível à qualquer um, pode ser adicionada no favoritos, armazenada no cache e permanecer no histórico do navegador.

Exemplo de URL com parâmetros no script PHP:

http://www.site.com/index.php?op=L&md=D&id=8

É comum utilizar parâmetros no script como meio de especificar as funções que serão executadas ou também como passagem de valores para variáveis ou funções. Se a navegação no site pode ser manipulada apenas adulterando o valor de um parâmetro na URL, ou se há alguma informação relativamente importante que precisa ser passada por parâmetro na URL, é uma boa medida proteger o site dos bisbilhoteiros. Uma solução é esconder os parâmetros da URL, adicionalmente com outras medidas de segurança.

Não quero neste artigo ditar regras de segurança para sites. Quero apenas mostrar uma solução simples e alternativa para proteger a URL, sem uso das ferramentas convencionais e sérias de criptografia. Nesta solução caseira, é usado uma combinação de comandos nativos do PHP para dar um certo efeito de criptografia.

Uma forma de esconder os parâmetros é codificá-los em caracteres ilegíveis. Somente o script que manipula a solicitação saberá decodificá-los, como se fosse uma criptografia.

Exemplo de URL com parâmetros codificados:

http://www.site.com/index.php?p=dpECApXucSffrhH0VfFOTWgfFyIErbMOTv4ZT5EEvEEWrE

Um método simples de codificação e decodificação é o Base64. O Base64 é um método para codificação de dados para transferência na Internet. Útil na transmissão de dados binários por meios que lidam apenas com texto, por exemplo, enviar arquivos por email. O Base64 codifica qualquer dado em uma sequência de caracteres dentre 64 caracteres distintos (A-Z, a-z, 0-9, + e /). Por exemplo, o texto "ola mundo", convertido para Base64 se torna "b2xhIG11bmRv". Existem diversas variações do Base64 mas não importa aqui.

Entretanto, o Base64 não é uma criptografia, é apenas uma codificação. Na codificação os dados são facilmente convertidos de uma representação para outra, sem a necessidade de uma chave, apenas do algoritmo. O algoritmo Base64 é bastante comum e seu uso é fácil de ser percebido. Usar somente ele não adiantaria muito no propósito de esconder os parâmetros.

Para camuflar o Base64 pode-se usar uma sequência de eventos em uma função que irá codificar ou decodificar a URL. Esta sequência, inventada pelo programador, fica desconhecida para quem tem acesso a página HTML apresentada no navegador pois está no código fonte do script. Praticamente uma criptografia onde a chave é o algoritmo em si.

A seguir tem um exemplo de implementação desta solução em PHP. A classe "cripto" contém as funções que irão codificar e decodificar a URL. Nelas, algumas funções nativas do PHP foram usadas para camuflar o Base64:

A função "strtr", retorna uma cópia da string, traduzindo todas as ocorrências de cada caractere do primeiro conjunto para o caractere correspondente no segundo conjunto; A função "substr" retorna a parte da string a partir do parâmetro especificado; A função "strrev" retorna a string invertida; Por fim, a função "base64_encode" codifica a string e a função "base64_decode" decodifica a string.

A ideia deste exemplo é codificar a string original, invertê-la e adicionar um prefixo aleatório, repetindo tudo isso por três vezes. Este prefixo é para confundir o resultado final, impossibilitando a decodificação direta. Como se não fosse o bastante, os caracteres da string resultante são trocados, gerando outra confusão no resultado final. Segue a classe de exemplo:

class cripto {
 
  function codificar($str) {
    $prfx = array('AFVxaIF', 'Vzc2ddS', 'ZEca3d1', 'aOdhlVq', 'QhdFmVJ', 'VTUaU5U',
                  'QRVMuiZ', 'lRZnhnU', 'Hi10dX1', 'GbT9nUV', 'TPnZGZz', 'ZGiZnZG',
                  'dodHJe5', 'dGcl0NT', 'Y0NeTZy', 'dGhnlNj', 'azc5lOD', 'BqbWedo',
                  'bFmR0Mz', 'Q1MFjNy', 'ZmFMkdm', 'dkaDIF1', 'hrMaTk3', 'aGVFsbG');
    for($i=0; $i<3; $i++) {
      $str = $prfx[array_rand($prfx)].strrev(base64_encode($str));
    }
    $str = strtr($str,
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
                 "a8rqxPtfiNOlYFGdonMweLCAm0TXERcugBbj79yDVIWsh3Z5vHS46pQzKJ1Uk2");
    return $str;
  }
 
  function decodificar($str) {
    $str = strtr($str,
                 "a8rqxPtfiNOlYFGdonMweLCAm0TXERcugBbj79yDVIWsh3Z5vHS46pQzKJ1Uk2",
                 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
    for($i=0; $i<3; $i++) {
      $str = base64_decode(strrev(substr($str,7)));
    }
    return $str;
  }
 
  function separar_parametros($param) {
    return explode('&',$param);
  }
 
  function separar_valor($opcao) {
    return explode('=',$opcao);
  }
 
}

No script que irá montar a página HTML, no momento da edição da etiqueta "a" ou de outra etiqueta que use uma URL, chama-se a função "codificar", da classe "cripto", para gerar a URL do atributo "href". Os parâmetros originais são transformados em um único valor para o parâmetro "p", que será coletado na solicitação. O parâmetro "p" ficará visível na URL mas seu valor estará codificado. Segue alguns exemplos de aplicação da função "codificar":

'<a href="index.php?p='.$this->cripto->codificar("op=F&md=E").'">'

'<a href="cliente.php?p='.$this->cripto->codificar("op=A&md=F&id=".$idcliente).'">'

'<button type="button" value="Cancelar" onclick="location.href=\'index.php?p='.$this->cripto->codificar("op=A&md=I").'\'">Cancelar</button>'

header("Location: index.php?p=".$this->cripto->codificar('op=L&md=C'));

Por sua vez, o script invocado pela URL deve ler o valor do parâmetro "p" que está na variável $_GET, variável predefinida que coleta valores no método GET, e executar a função de decodificar. Após a decodificação, a string com os pares originais (nome e valor) deve ser separada nos parâmetros originais e seus respectivos valores e armazenados em variáveis que serão utilizadas no decorrer do script PHP. Segue exemplo:

$cripto = new cripto;

$param = isset($_GET["p"]) ? $_GET["p"] : '';
$op = $md = $id = '';
$parametros = $cripto->separar_parametros($cripto->decodificar($param));
foreach($parametros as $opcao) {
  $valor = $cripto->separar_valor($opcao);
  if ($valor[0]=='op') $op = $valor[1];
  elseif ($valor[0]=='md') $md = $valor[1];
  elseif ($valor[0]=='id') $id = $valor[1];
}

As funções auxiliares "separar_parametros" e "separar_valor" tratam a string decodificada. A função "explode", nativa do PHP, retorna uma matriz de strings, cada uma com uma substring formada pela divisão a partir do delimitador especificado.

Esta solução funciona muito bem para o propósito. O algoritmo criado para confundir a codificação Base64 é o segredo. O sucesso vai da imaginação do programador.

Uma limitação técnica desta solução é quanto ao limite do tamanho da URL. A URL é limitada a um tamanho máximo de 2048 caracteres. Os dados codificados em Base64 ficam aproximadamente 33% maiores que os dados originais. Realizando a codificação mais de uma vez e adicionando o prefixo, o resultado é bem maior. Mas é raro precisar de uma URL tão grande.

sexta-feira, 19 de abril de 2013

A matemática e o progresso humano

O avanço tecnológico e o progresso humano estão fortemente conectados ao conhecimento matemático. A percepção desta conexão é vital para o entendimento da história do homem em sua evolução. Uma das ferramentas mais importantes da matemática são as equações. As equações são modeladas nos padrões que encontramos no mundo a nossa volta e são estas equações que nos fazem entender o sentido do nosso mundo.

O recente livro do matemático inglês Ian Stewart, intitulado "17 Equações que Mudaram o Mundo", descreve a origem de algumas equações que tiveram influência na história humana. As equações vão desde o teorema de Pitágoras, passando pelas leis de Newton, as equações de Maxwell e a teoria da relatividade de Einstein. É um livro bem interessante com uma linguagem fácil.

A edição original foi lançada em 2012, a 1ª edição brasileira é de Abril de 2013 e lançada pela editora Zahar. Esta é a capa do livro:


sábado, 13 de abril de 2013

O Sistema de Coordenadas UTM

O UTM (Universal Transversa de Mercator) é um tipo de projeção e de sistema de coordenadas no plano. É utilizado na cartografia, um importante campo de aplicação da geodésia, para dar a localização de um ponto na superfície terrestre. O UTM é baseado no modelo elipsoidal da Terra e é um dos mais utilizados no mundo.

A geodésia é a ciência que estuda a forma, a dimensão da Terra, o campo gravitacional, o espaço-tempo tridimensional e os fenômenos geodinâmicos como rotação da Terra, marés e movimentos da crosta terrestre.

A forma da Terra foi representada inicialmente por uma esfera, Pitágoras e Aristóteles foram os primeiros que expressaram esta ideia. No século 17, Newton demonstrou que o conceito de uma Terra esférica era inadequado e representou a Terra como um elipsoide de revolução, onde o eixo equatorial era maior do que o eixo polar e assim a Terra era achatada nos polos. No século 19, Laplace, Gauss e outros afirmaram que o modelo elipsoidal não era convincente e então surgiu a forma de geoide para a superfície terrestre. O geoide é uma superfície equipotencial do campo de gravidade da Terra que coincide com o nível médio dos mares. O geoide se estende através dos continentes em uma forma ondulada, se aproximando da topografia terrestre.


Os modelos de representação da Terra, com a topografia, elipsoide e geoide.

Apesar do geoide ser o modelo mais próximo do verdadeiro formado da Terra, em geodésia utiliza-se um elipsoide de referência para representar matematicamente a superfície terrestre. O modelo matemático da Terra é denominado "datum". O elipsoide de referência torna bem mais simples a execução dos cálculos e definição das coordenadas e elevação. Atualmente, um dos elipsoides de referência, ou datum, mais usados é o WGS84, servindo como base ao Sistema de Posicionamento Global (GPS).

A Cartografia é o conjunto de estudos e operações científicas, técnicas e artísticas utilizados na elaboração de mapas, cartas e outras formas de representação de objetos. O mapa é a representação no plano, em pequena escala, dos aspectos geográficos de uma área na superfície de um objeto planetário. Diferentemente, a carta é a representação em média ou grande escala, para possibilitar a avaliação dos detalhes.

Para elaborar um mapa é necessário determinar um método no qual cada ponto na superfície terrestre corresponda a um ponto no plano e vice-versa. Existem diversos métodos e estes métodos são chamados sistemas de projeções. Um sistema de projeção adota um modelo matemático do planeta e relaciona os pontos estabelecendo uma escala e um sistema de coordenadas.


Projeção cilíndrica transversa, o eixo do cilindro está perpendicular ao eixo da Terra.

As projeções cartográficas são classificadas de diversas formas. Quanto a superfície de projeção temos a cilíndrica, que é utilizada no sistema UTM na posição transversal, em relação à superfície de referência. Na posição transversal, o eixo do cilindro está perpendicular ao eixo da Terra.

Quanto ao tipo de contato entre as superfícies de projeção e referência, o sistema UTM adota a secante, onde a superfície de projeção secciona a superfície de referência. Isto vem da atribuição do fator de escala k = 0,9996 ao meridiano central do sistema UTM, que garante um modelo mais favorável de deformação em escala ao longo do fuso. Limitando o erro de escala em 1/2500 no meridiano central e 1/1030 nos extremos do fuso.


Fuso ou Zona UTM, com 6° de extensão longitudinal e seu meridiano central.

No sistema UTM a Terra é dividida em 60 fusos, ou zonas, com 6° de extensão de longitude e os fusos são numerados de 1 a 60, crescente no sentido leste a partir do fuso 180°, a 174° oeste de Greenwich. Isto é, o fuso 1 vai de 180°O até 174°O, o fuso 2 vai de 174°O até 168°O e assim sucessivamente. Cada fuso é prolongado em 30' sobre os fusos adjacentes, criando uma área de sobreposição de 1°.

O sistema UTM é utilizado somente entre as latitudes 84° ao norte e 80° ao sul. Cada fuso é segmentado em 20 faixas com 8° de extensão de latitude. São dez faixas no hemisfério norte e dez faixas no hemisfério sul. Embora não ser essencialmente adotado no UTM e sim no MGRS, uma derivação militar do UTM, as faixas são designadas por letras de C, a partir de 80°S, até X, que termina em 84°N. As letras I e O não são usadas por causa da similaridade com os números 1 e 0. A letra N é a primeira faixa do hemisfério norte, adotada por causa do "n" de norte.


O mapa UTM, com a identificação dos fusos, faixas e graus.

Os quadriculados das zonas são uniformes em todo o globo, com exceção em duas áreas. O quadriculado 32V está estendido para alcançar toda a Noruega e assim o quadriculado 31V está recuado. Os quadriculados 31X, 33X, 35X e 37X estão estendidos para cobrir a região da Esvalbarda, também pertencente à Noruega, assim os quadriculados 32X, 34X e 36X não são usados.

O ponto de origem de cada fuso é a intersecção do Equador com o meridiano central do fuso. Para evitar números negativos, é adotado o valor de 500.000 metros para o meridiano central do fuso, na linha ao longo do Equador. Os fusos possuem um alcance longitudinal de 167.000 a 833.000 metros, na altura do Equador, reduzindo em direção aos polos. Justificando os números, a Terra possui aproximadamente 40.000.000 metros de circunferência, então os fusos tem 666.666 metros de extensão longitudinal.

No hemisfério norte as posições são medidas para o norte partindo do zero ao Equador até 9.300.000 metros na latitude 84°N, na linha ao longo do meridiano central. No hemisfério sul as posições são medidas para o sul partindo do 10.000.000 metros ao Equador até 1.100.000 metros na latitude 80°S, na linha ao longo do meridiano central. Assim, nenhum ponto recebe um valor negativo.

A posição na Terra é dada pelo número do fuso (zona), as coordenadas Este (Easting) e Norte (Northing) explicitamente nesta ordem, e o hemisfério. A coordenada Este também pode ser descrita por X e a coordenada Norte por Y. Abaixo um exemplo de coordenada UTM:

X 271960,000 (Easting)
Y 7382350,200 (Northing)
Fuso 23 (Zone)
Hemisfério Sul
Elipsoide WGS84 (datum)

A coordenada acima, dada como exemplo, indica que o ponto está no fuso 23, no Hemisfério Sul, a 228.040 metros a oeste do meridiano central do fuso (500.000 - 271.960) e a 2.617.649,8 metros ao sul do Equador (10.000.000 - 7.382.350,2). O datum será útil no cálculo de conversão entre sistemas de coordenadas.

O sistema de coordenadas UTM é o sistema mais usado em projeções planas do globo terrestre. As coordenadas geográficas, em graus de latitude e longitude, são usadas na superfície esférica do globo. É possível realizar a conversão entre os sistemas, será visto em um próximo artigo.

sexta-feira, 12 de abril de 2013

Detalhamento do uso no Android

Sem necessitar de aplicativos de terceiros, apenas com as ferramentas nativas, o sistema Android possui algumas telas que mostram detalhes do uso do sistema. São detalhes do uso de dados de rede, do espaço ocupado no armazenamento dos aplicativos e demais arquivos, do uso da bateria pelos aplicativos e do uso da (memória) RAM pelos aplicativos. O acesso à estas telas é pelo ícone Configurações.

Rede:

A tela "Uso de dados" detalha a quantidade de dados transferidos por upload ou download durante um determinado período. Chega-se nesta tela pelo ícone "Configurações" e depois em "Uso de dados". Existem duas guias, uma com as estatísticas dos dados trafegados pelo serviço da operadora de telefonia móvel e outra guia com as estatísticas dos dados trafegados por Wi-Fi. Além do gráfico do volume total de dados, é exibido o consumo por aplicativo, e clicando em um aplicativo, é exibido o consumo do respectivo aplicativo durante as execuções de primeiro plano e segundo plano.



Armazenamento:

A tela "Armazenamento" detalha, além do espaço total e do espaço disponível, o espaço ocupado pelos aplicativos, pelas imagens e vídeos, pelas músicas, pelos arquivos provenientes de download, pelos dados em cache e pelos arquivos diversos. Chega-se nesta tela pelo ícone "Configurações" e depois em "Armazenamento". Tocando em cada uma das categorias, é exibido o conteúdo da respectiva categoria. Para imagens é exibida a galeria, para downloads são exibidos os arquivos etc.



Bateria:

A tela "Bateria" detalha o uso da energia pelo sistema e aplicativos. Chega-se nesta tela pelo ícone "Configurações" e depois em "Bateria". A primeira informação é a quantidade de carga ainda disponível na bateria, em porcentagem. Em seguida, tem um gráfico evolutivo do nível da bateria, com início na última vez que o aparelho foi carregado com energia externa, e o tempo que o aparelho vem funcionando sob a energia da bateria. Abaixo, uma listagem dos aplicativos que consumiram a energia da bateria neste tempo, desde a última recarga. Tocando no gráfico abre-se uma tela com maiores detalhes do histórico e a influência do hardware no consumo, como GPS, Wi-Fi etc. Tocando em um aplicativo abre-se uma tela com maiores detalhes do respectivo aplicativo e, se aplicável, botões para ajuste do uso da energia.



Aplicativos:

A tela "Aplicativos", na guia rodando, detalha todos os aplicativos, processos e serviços que estão sendo executados no momento, com sua respectiva quantidade de memória que estão usando e a quanto tempo. Chega-se nesta tela pelo ícone "Configurações" e depois em "Aplicativos". Na parte superior desta guia há um botão para alternar entre mostrar os processos em cache ou mostrar os serviços em execução. Na parte inferior há um gráfico que mostra o total de RAM usada e a quantidade livre.



Neste artigo foi usado o Android na versão 4.2.1 para descrever estas telas de detalhamento do uso. Em outras versões as telas poderão ser diferentes ou até inexistentes (em versões muito antigas). Nestes casos poderão ser úteis os aplicativos de terceiros para este fim.