Imagem de Geolocalização

Como modificar ou forjar geolocalização no navegador

Fala, galera! Tudo certinho?

Continuando meus estudos em cima da API do Google Maps (o último post foi sobre como encontrar coordenadas de locais próximos usando SQL), acabei encontrando uma dificuldade: como fazer o navegador pensar que estou em outro lugar?

Dando uma olhada nas Ferramentas de Desenvolvedor do Google Chrome descobri que é possível emular geolocalização utilizando coordenadas definidas pelo usuário. Pesquisei um pouco mais e descobri também como forjar a geolocalização no Firefox. Agora eu conto pra vocês como funciona!

Como os browsers detectam minha localização?

Com o advento do HTML5, tornou-se possível obter as coordenadas geográficas de quem está usando o navegador por meio de uma requisição JavaScript bastante simples: navigator.geolocation.getCurrentPosition().

Contudo, o usuário pode escolher se irá aceitar ou não compartilhar essas informações. Continue Lendo

Google Maps

Como procurar locais próximos usando SQL

E aí, galera! Tudo certo?

Estou fazendo alguns estudos com a API do Google Maps e isso me levou pensar de que maneira é possível encontrar endereços próximos utilizando SQL. Conduzindo minhas pesquisas, encontrei algumas coisas e gostaria de compartilhar.

Antes de mais nada, a Fórmula de Haversine!

Você deve estar se perguntando: o que diabos é Fórmula de Haversine? Não tema, pois a resposta está aqui!

A fórmula de Haversine é uma importante equação usada em navegação, fornecendo distâncias entre dois pontos de uma esfera a partir de suas latitudes e longitudes. É um caso especial de uma fórmula mais geral de trigonometria esférica, a lei dos Haversines, relacionando os lados a ângulos de uma esfera “triangular”.

Fonte: Wikipedia – Fórmula de Haversine

Basicamente, essa fórmula serve para fazer uma triangulação em uma esfera e ajuda encontrar pontos próximos de determinada coordenada geográfica. Leia mais sobre ela no artigo da Wikipedia.

Montando a consulta de triangulação

De posse da fórmula, precisamos convertê-la em SQL. Com base em um estudo disponibilizado na própria documentação da API do Google Maps, fiz algumas adaptações e montei a estrutura que apresento a seguir.

O primeiro passo é montar a tabela que irá armazenar os dados referente aos endereços. Para este exemplo, vamos utilizar uma tabela bastante simples, contendo apenas idnomeenderecolat (latitude) e lng (longitude). O endereço, neste caso, serve muito mais para complementação dos dados (ou para uma eventual busca pela geolocalização) do que propriamente para o cálculo. Continue Lendo

PHP 7 (RC 3) já está disponível!

Já faz alguns dias que foi lançada terceira versão release candidate do PHP7.

Conforme anúncio publicado no site do PHP, já é possível baixar a RC3 para testá-la. Algumas das novidades do PHP 7 incluem: Continue Lendo

[FISL 16] PHP no Campo de Batalha – Slides da Palestra

PHP no Campo de Batalha

Acabei de publicar os slides da minha palestra no 16º Fórum Internacional de Software Livre (FISL).

Você pode acessar no SlideShare: PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva – Slides da Palestra.

Também é possível assistir ao vídeo na TV Software Livre.

Nessa palestra procurei apresentar os mais variados tópicos a respeito de segurança no desenvolvimento de aplicações PHP.

 

Abraços a todos e fiquem com Deus!

 

Seminário PHP em Porto Alegre – 25/04/15

Seminário PHP

Dia 25 de Abril tem Seminário PHP: O melhor da PHP Conference Brasil em Porto Alegre!

O Rio grande do Sul será o primeiro de 5 estados Brasileiros a receber o evento que traz destaques da edição mais recente da PHP Conference Brasil!

O evento contará com palestras de Jackson Mafra, Ari Stopassola Jr., Nick Vidal, Vitor Mattos e Felipe Wecx. Temas como Phalcon, Drupal, Behat, MongoDB e Big Data.

Inscrições já estão abertas e as vagas são LIMITADAS! Corre lá! Valores promocionais até dia 10 de abril.

Confirma a programação completa e informações sobre inscrição no site: http://www.temporealeventos.com.br/?area=278-Seminario-PHP-Rio-Grande-do-Sul-2015-em-comemoracao-aos-dez-anos-da-PHP-Conference-Brasil

Configurando SSL

Configurando SSL no servidor de desenvolvimento (Apache)

Você já deve ter se perguntado como funciona o protocolo HTTPS ou então como configurá-lo na sua máquina.

Antes de levar um sistema ao servidor de produção, é essencial testá-lo em um ambiente o mais semelhante possível ao servidor de produção. Muitas pessoas já perguntaram como é possível disponibilizar uma conexão HTTPS com o localhost do Apache.

Pois bem, hoje vou ensinar como configurar o HTTPS no Apache a partir de um certificado SSL auto-assinado.

Neste exemplo eu estou utilizando uma distro Linux chamada Crunchbang (Debian-based – assim como Ubuntu e Mint), mas deve funcionar em qualquer sistema Unix-like. Para os que usam Windows, infelizmente, vou ficar devendo…

Antes de começar, é importante ter um conhecimento básico do Terminal e o openssl instalado. Também usarei o gedit, mas você pode utilizar qualquer alternativa, como vimnanokate etc.

Gerando um certificado SSL auto-assinado

Abra o terminal e preste atenção em qual diretório você está. Se estiver com o usuário normal, provavelmente estará na sua home. Os comandos vão gerar os certificados no diretório corrente. Não há problema em gerá-los na sua home, já que esses arquivos servirão apenas para o servidor de testes. Se alguém tiver acesso a eles, nada extraordinariamente ruim deverá acontecer. Mas, enfim, você está avisado! :)

Todos os comandos neste tutorial assumem que você esteja autenticado como root. Para isso, basta utilizar o comando sudo su, ou apenas su (dependendo da sua distro).

Vamos começar gerando um certificado SSL de 1024 bits. A sua chave pública será X.509 (PKI). Meus nomes de arquivo serão todos phpit, para ficar mais fácil de visualizar. Você pode utilizar o nome que quiser, mas cuide para não se perder!

Utilize os seguintes comandos:

$ openssl genrsa -out phpit.key 1024
$ openssl req -new -key phpit.key -x509 -out phpit.crt

Guardando o certificado no diretório do Apache

Depois de gerar o certificado e a chave pública, precisamos guardar esses arquivos em um diretório do Apache.

Caso ainda não exista (o que é bastante provável), vamos criar esse diretório.

$ mkdir /etc/apache2/ssl/

Agora é só mover os dois arquivos para o novo diretório:

$ mv phpit.key phpit.crt /etc/apache2/ssl/

Por fim, precisamos gerar um arquivo pem para que nosso certificado seja compatível com todos os navegadores. A diferença entre o arquivo crt e o pem é apenas a extensão, o conteúdo é o mesmo. Vamos então, apenas copiar:

$ cd /etc/apache2/ssl/
$ cp phpit.crt phpit.pem

Configurando o certificado SSL para permitir o tráfego HTTPS na porta 443

Agora precisamos criar um VHost que aceite o tráfego via HTTPS. Para isso, precisaremos do certificado que foi criado.

A porta padrão do HTTP é a 80. Já a porta padrão do tráfego HTTPS é 443. O navegador irá automaticamente trafegar por essa porta quando o protocolo for definido para HTTPS. Caso o servidor não esteja escutando nessa porta, o servidor não receberá os dados.

É bastante provável que o Apache já esteja configurado para escutar na porta 443 mas, por via das dúvidas, vamos conferir o arquivo de portas.

$ cd /etc/apache2/ports.conf

Por padrão, o Apache já vem configurado para escutar na porta 443 caso o mod_ssl esteja habilitado. Você deve ver algo semelhante nesse arquivo:

<IfModule mod_ssl.c>
Listen 443
</IfModule>

Se não houver nada semelhante, pode adicionar.

O próximo passo é configurar o caminho dos arquivos de SSL. Aqui vou usar o gedit, mas você pode utilizar o editor que preferir.

$ gedit /etc/apache2/sites-enabled/000-default

Ao acessar o arquivo, você deve ter algo parecido com isso (destaquei as linhas mais importantes):

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory "/var/www/">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Essa é a configuração para porta 80. Precisamos configurar a porta 443. O que eu fiz foi duplicar o conteúdo do arquivo e apenas modificar a porta 80 para 443, ficando, assim, com VirtualHosts.

Agora precisamos configurar três diretivas (mas só no VHost 443):

SSLEngineSSLCertificateFile e SSLCertificateKeyFile.

Logo após o fechamento da última declaração de diretório, vamos adicionar as seguintes linhas:

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/phpit.pem
SSLCertificateKeyFile /etc/apache2/ssl/phpit.key

Com essas três diretivos nós ativamos o SSL apenas para a porta 443 (visto que estamos editando o VHost dessa porta) e apontamos para os dois arquivos do certificado.

Ao final, o arquivo deve ficar mais ou menos assim:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www
  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/phpit.pem
  SSLCertificateKeyFile /etc/apache2/ssl/phpit.key
  ErrorLog ${APACHE_LOG_DIR}/error.log
  # Possible values include: debug, info, notice, warn, error, crit,
  # alert, emerg.
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Salve o arquivo e estamos prontos.

Agora só resta ativar o módulo SSL no Apache:

a2enmod ssl

Importante (dica do leitor Jardel Rodrigues): se o seu sistema não reconhecer o comando a2enmod, você deve instalar essa funcionalidade. Em distribuições baseadas em Debian (Mint, Ubuntu, Crunchbag etc.), você pode utilizar o comando apt-get install apache2.2-common para instalar o pacote básico de funcionalidades do Apache.

Só falta reiniciar o apache:

/etc/init.d/apache2 restart

Para verificar que tudo está OK, você deve tentar acessar https://localhost/.

Pelo fato de o certificado ser auto-assinado, ele não pertence a nenhuma entidade certificadora confiável. Sendo assim, a primeira coisa que o navegador vai acusar é isso. Basta adicionar uma exceção e tudo estará OK para trafegar utilizando criptografia SSL.

Considerações finais

Caso não tenha conseguido fazer funcionar, tente refazer os passos e verificar se fez tudo certinho. Se, mesmo assim, não rolar, deixe um comentário e vamos tentar te ajudar.

Fazia tempo que eu queria escrever um artigo desse tipo, mas nunca tirei tempo para esmiuçar o processo. Espero que possa ajudar vocês a tornarem o ambiente local o mais parecido possível com o servidor de produção.

Um abraço a todos e até a próxima.
Fiquem com Deus.
Rafael Jaques