Posts from — May 2009
Ataque de Cross-Site Request Forgery, já ouviu falar?
Aposto que você ao menos já ouviu falar de XSS (Cross-Site Scripting), certo? Eu também. E de um tal de Cross-Site Request Forgery (CSRF, XSRF, session riding ou one-click attack [1])? Eu não! Caso você também não tenha ouvido falar ou lido a respeito, saiba: trata-se de uma técnica MUITO simples de ser explorada caso o seu site não esteja preparado para enfrentá-la. Quem já foi vítima? Digg, gmail, wikipedia, e-bay, entre outros.
Bem, eu dei uma garimpada na net sobre este ataque e resumo aqui as partes que considerei mais importantes (mais em [1] e [2]) e tento expor o problema de uma maneira palpável.
O Ataque
O que acontece quando você visita uma página que possui a seguinte tag?
<img src="http://example.com/logout">
O browser simplesmente não tem como saber, de antemão, se a URL da imagem especifica, de fato, uma imagem. Assim sendo, não tem como evitar: o browser vai requisitar seja-lá-o-que-for-que-esteja-especificado pelo atributo src da tag img.
Considere agora que a SUA aplicação realize operações sensíveis utilizando apenas a URL requisitada como parâmetro, não é muito difícil de imaginar esse tipo de situação, é? O exemplo mostra uma requisição de logout, mas coisas muito mais importantes, no contexto do sistema, podem ser requisitadas.
Aí você pode dizer: “Blz Zé, mas só um idiota faria isso sem que o usuário tenha se autenticado”. Eu concordo. Mas e se o usuário estiver autenticado? Suponha que ele tenha se autenticado e está com a sessão ativa. Em OUTRA aba do browser, o usuário acessa um fórum-da-vida. Qualquer um pode enviar qualquer tipo de imagem para um fórum-da-vida, lembra? E se esse qualquer um souber que o example.com não trata CSRF? Já era, você vai realizar requisições para o site em que você está logado sem nem sequer sonhar com isso. Se você acessar uma página que alguém (um atacante em potencial) te passou então, mais fácil ainda.
Como sanar o problema? Que tal realizar todas as requisições sensíveis através de POSTs? Apenas isto, também não funciona, basta ver o código abaixo, que pode estar em hospedado em um domínio diferente de example.com [2]:
<body onload="document.getElementById('f').submit()">
<form id="f" action="http://example.com/logout" method="post">
<input name="Log Me Out" value="Log Me Out" />
</form>
</body>
Soluções
Como resolver, então? Bem, existem algumas soluções [2], vou citar apenas as com maior probabilidade de funcionar.
No lado do servidor (vítima do ataque, example.com, no exemplo acima), uma solução eficaz, facinho de implementar se você usa o Zend Framework, por exemplo, é adicionar um valor aleatório em um campo escondido (input type=”hidden“) ao seu formulário que seja também armazenado na sessão. Assim, sempre que os dados do formulário forem processados será possível determinar se a submissão foi realmente gerada a partir da página criada por você, basta comparar o valor recebido do formulário com o armazenado na sessão. É isso, simples e eficaz.
E no lado do cliente? Tem jeito? Olha, ainda não testei, mas há algumas extensões para o firefox ([3], por exemplo) que prometem proteger o usuário. Tem que ser algo nesse sentido.
Condiderações Finais
Espero que o problema tenha ficado claro e que você pesquise mais sobre o tema, caso ainda não o tenha feito. Como foi visto, é muito simples de implementar o ataque uma vez que uma aplicação vulnerável tenha sido encontrada pelo atacante. É claro que para um ataque focado (em uma vítima especial) vai ser preciso uma boa dose de engenharia social por parte do atacante, mas no caso de aplicações populares a coisa fica mais fácil, né?
Algo a acrescentar?
[1] http://en.wikipedia.org/wiki/Cross-site_request_forgery
May 31, 2009 No Comments
Telecommuting por Cal Evans
Você já ouviu falar em Telecommuting? Não? Pode ficar tranquilo, estou falando de algo simples: trabalhar de casa ou de algum lugar diferente do local de trabalho (location-independency). Segundo a Wikipedia:
“Telecommuting, e-commuting, e-work, telework, working from home (WFH), or working at home (WAH) is a work arrangement in which employees enjoy flexibility in working location and hours. In other words, the daily commute to a central place of work is replaced by telecommunication links. Many work from home, while others, occasionally also referred to as nomad workers or web commuters utilize mobile telecommunications technology to work from coffee shops or myriad other locations.”
Por favor, não me venha falar de telecomutação. O termo “comutar” não tem o mesmo significado que commute em inglês. Interessei-me pelo termo ao ver os slides de uma palestra recente do Cal Evans sobre Telecommuting na PHP|tek:
Gostei porque ele vai bem direto aos pontos principais, principalmente o slide 37. Gostaria de ter visto a apresentação ao vivo (alguém está sabendo de um link para o vídeo?), enfim. Achei legal também que há bastante coisa interessante na net se pesquisarmos pelo termo, óbvio.
Um conceito correlato é o de Desenvolvimento Distribuído:
Estas novas formas de trabalhar DEVEM fazer parte de um futuro próximo para grande parte dos profissionais de tecnologia e já é realidade para muitos. IMO o que não pode é virar complemento, mas sim substituto do trabalho convencional. Senão o cara vira escravo do trabalho, correto? Prontos para fazer parte desse novo mundo? Trabalhar de cueca e tudo mais…?
May 29, 2009 No Comments
Galeria de fotos para Joomla? Phoca Gallery!

Voltei a usar Joomla como CMS. Impressionei-me com a quantidade de galerias de fotos disponíveis. Na última vez em que tive que usar uma galeria em um projeto com Joomla, uns 2 anos atrás, foi um sofrimento. Havia poucas opções e todas eram bem simples e difíceis de integrar com o Joomla. Enfim, após uma garimpada, levando em conta a quantidade avaliações de usuários, tempo de desenvolvimento e aparente suporte, resolvi testar a Phoca Gallery.
Esta galeria é realmente muito boa. Até agora não encontrei nenhum bug severo (só na apresentação que tem uma coisa ou outra desalinhada) tem uma tradução quase completa para o português e também tem alguns temas apresentáveis disponíveis no site do componente, imprescindível para negações no design, como eu. Por fim, há um fórum de suporte que parece ser bastante ativo, mas ainda não precisei usar.
Outra coisa legal é que ela vem com um applet java que permite fazer o upload de várias fotos de uma vez só. Dá até pra rotacionar as fotos e tudo mais, achei muito legal.
Resumindo, interface intuitva, tem até algumas firulas, e o principal: funciona muito bem out-of-the-box! Eu recomendo!
UPDATE: Pessoal, faz algum tempinho que não uso a Phoca Gallery e nem manutenção mais eu dou em projetos que a utilizem. Peço por gentileza que enviem dúvidas para fóruns e listas especializadas. Eu recomendo a lista do PHPMS: www.phpms.org, ok?
May 28, 2009 6 Comments
PHP Mobile no IMaster Report
May 28, 2009 No Comments
Um jeito fácil de realizar requisições assíncronas com PHP
Uma situação que às vezes alguém pode se deparar, no meu caso foi nessa semana, é a necessidade de se realizar uma requisição assíncrona em uma determinada interação com um web service, por exemplo. Ou então fazer uma requisição do tipo fire-and-forget , one-way ou out-only (fazer a requisição e não se importar com o retorno dela). Apesar de a maioria estar acostumado com o modelo de interação Request-Response do HTTP, situações como essas não são raras.
As perguntas que eu quero responder são: é possível fazer isso usando PHP? Se sim, como?
O problema é o seguinte. Durante a execução do seu script você precisa contactar outra página. Entretanto, você, por algum motivo, não quer esperar pelo resultado desta invocação, se é que há resultado. Uma mensagem de notificação, por exemplo, não aguarda coisa alguma como resposta. Como fazer isso? Se você estivesse disposto a esperar pelo resultado da requisição não se importando com o tempo que isso pudesse levar, então é relativamente simples implementar usando cURL ou a pecl_http (olhei por cima a documentação e não encontrei nada relativo a invocações assíncronas). Mas e quando não se está disposto ou não é possível (faz parte do protocolo de interação com a aplicação)?
Uma possível solução seria criar um novo processo e delegar estas tarefas ao mesmo [1], não sei se funciona, aparentemente sim, mas não testei porque achei trabalhoso demais e eu sou um cara preguiçoso.
Procurando um pouco mais, encontrei um outro artigo que caracteriza bem o problema (caso você não tenha entendido direito até agora o que eu estou tentando fazer) e expõe algumas soluções para o problema: [2]. No final, ele até apresenta uma solução interessante, utilizando raw sockets. O problema dessa solução é que você precisa construir o request HTTP no braço e tudo mais.
Enfim, no artigo [2] ele menciona a possibilidade de resolver o problema utilizando a própria cURL. Como fazer? Realize o request como você está acostumado a fazer usando a cURL, mas defina o timeout para um tempo curto, no artigo ele diz que o mínimo que se pode esperar é 1s. Qual é o problema desta abordagem? Imagine que várias requisições sejam feitas à uma página que implementa essa solução. Cada requisição, invariavalmente terá que esperar no mínimo (o timeout, lembra?) 1s para que a resposta da página seja gerada.
Como chegar, então, a algo próximo do desempenho da solução utilizando sockets, que possui um tempo de retorno (disparo) quase imediato? Simples, a partir da versão 7.16.2 da cURL (PHP 5.2.3) é possível definir o timeout em milisegundos! Para isto basta utilizar a boa e velha curl_setopt e definir o parâmetro CURLOPT_TIMEOUT_MS, ao invés do antigo e surrado CURLOPT_TIMEOUT, que trabalhava na escala de segundos. Curl, isn’t it? (eu não resisti).
Com estas ferramentas simples e bastante conhecidas é possível então utilizarmos a cURL para realizar requisições do tipo fire-and-forget.
E nos casos em que queremos tratar a resposta mas não queremos esperar por ela, até mesmo permitindo que o nosso script PHP (que dispara a requisição) retorne algo para o cliente? Simples também, basta criarmos uma outra página que fará a requisição propriamente dita. Para fazer a requisição para esta segunda página a gente utiliza o fire-and-forget e deixamos que esta trate a(s) resposta(s).
Bem, era isso que eu tinha pra falar. Se alguém tiver alguma dúvida ou souber de alguma solução melhor para o problema ou até mesmo de algum problema em relação a esta abordagem NOTIFIQUE-ME! DEIXE O SEU COMENTÁRIO!
É importante para todos.
[1] http://w-shadow.com/blog/2007/10/16/how-to-run-a-php-script-in-the-background
[2] http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
May 27, 2009 4 Comments
Problemas com o Gengo
Apesar da empolgação inicial com o Gengo, passei por maus bocados usando esse plugin. O problema maior é que ele trabalha com rewrite (modifica o seu .htacces até!). Então, cá estava eu tentando dar uma afinada no plugin, e de repente começo a receber erros com HTTP Status 500. Lá fui eu: remover o .htacces, desabilitar o plugin via mysql e depois alterar algumas configurações que ele faz no banco do site também pra trazer o site de volta ao ar.
Andei conversando um pouco a respeito do plugin e há vários bugs conhecidos. No meu caso foi ainda pior, pois estou usando o Wordpress beta. Assim sendo, vou esperar sair a versão estável do wordpress e também do Gengo para voltar a pensar em usá-lo. Mas aparentemente ele é bom sim.
Mesmo que ele estivesse funcionando bem, eu ainda precisaria alterar o template pra que ele também ficasse de acordo com a língua (basta olhar as FAQ do Gengo, é simples), coisa que eu estou sem tempo pra fazer. E como ainda não tem conteúdo em inglês no site, prefiro esperar mais um pouco.
May 27, 2009 No Comments
Wordpress multi-idiomas com Gengo
É inevitável, para se alcançar a grande audiência da Internet é necessário que o conteúdo publicado esteja em inglês, ponto. Isto é o mínimo, mas em um mercado globalizado não é difícil se deparar com a necessidade de suportar três ou mais idiomas. Como recentemente passei a utilizar o Wordpress como ferramenta de trabalho, fui atrás de algumas indicações e o Gengo, como plugin para gerenciamento de idiomas, foi muito bem recomendado.
O processo de instalação do plugin é padrão: Plugins -> Add New, fazer o upload do zip e então ativar o plugin através da tela de plugins. Feito isto, um novo item “Languages” será adicionado ao menu da esquerda da página de administração do Wordpress.
Ao clicar no item Languages, uma tela parecida com a da Fig. 1 deve então aparecer para você selecionar o idioma primário do seu site. No meu caso, bastou selecionar Português/Brasil e pronto, o Gengo já estava configurado para utilizar o português como idioma padrão.
Entretanto, para que a tradução ocorra (exceto para o inglês, é lógico), é também necessário que o arquivo de tradução, no meu caso o pt_BR.mo, relativo ao idioma seja adicionado à pasta wp-content/languages. A fonte primária de arquivos de traduções é a “Wordpress na sua língua”. Para o português, especificamente, você pode ir direto à página do Wordpress Brasil. Bem, olhando rapidamente no site, eu não encontrei os arquivos de tradução para download em separado, então, aparentemente, você vai ter que fazer o download do pacote inteiro do wordpress em português que tem no site.
Feito o download do pacote do wordpress em português, basta copiar a pasta wp-content/languages para a sua instalação atual do wordpress (estou assumindo que a instalação oficial, em inglês, é a que está sendo utilizada como base). Agora sim, você tem o wordpress “traduzido” para o português funcionando. “Traduzido” (entre aspas) porque você provavelmente vai ter que traduzir algumas coisas no seu template também, né? Como fazer o seu template se tornar language-aware é tema para outro post
Após a adição do português, a tela da Fig. 2 deve ser exibida.
Em seguida eu adicionei o inglês também. Feito isto, as duas versões do meu site passam a ser acessadas pelas seguintes URLs:
http://www.josericardo.eti.br/pt
http://www.josericardo.eti.br/en
Daí em diante, basta começar a traduzir os posts e páginas para que o conteúdo do site em inglês também seja preenchido. A Fig. 3 mostra a capa do meu blog após a tradução do primeiro post do mesmo. Para traduzir um post, por exemplo (é possível também traduzir páginas), basta criar um novo post assim como era feito anteriormente. A diferença é que agora haverá mais uma opção na tela de edição de posts relativa ao Gengo (ver Fig. 4).
Então, basta ir selecionando os itens, indicar que o post atual é uma tradução e selecionar o post orinal na lista de páginas que vai aparecer (para encontrar posts mais antigos clique no botão “Next 10″). O legal é que o post original vai aparecer embaixo para que você possa traduzir de maneira mais fácil.
Apesar de estar utilizando a versão beta (2.8) do Wordpress, a instalação (conforme relatado) funcionou quase sem problemas, apenas um warning apareceu na página principal (ver Fig. 5). Isto se deve ao fato de eu não ter traduzido as categorias do site também. Mas foi só adicionar uma verificação antes do foreach no arquivo classes.php e pronto.
Bem, o básico do Gengo é isso. Simples e eficiente. É bom lembrar que a questão do template ainda fica em aberto. Em breve eu posto algo sobre isso, mas se você está com pressa, basta dar uma olhada nas FAQ do Gengo, várias perguntar relevantes (como era de se esperar) são respondidas por elas.
May 25, 2009 2 Comments
Hello World
Hello World, this is my new blog.
May 25, 2009 No Comments
PHP Mobile
Um projeto voltado aos desenvolvedores PHP para incentivar o desenvolvimento para dispositivos móveis utilizando soluções baseadas em PHP. No site serão exibidas notícias e artigos, mostrando o espaço no mercado que o PHP pode conquistar e disponibilizar ferramentas para auxiliar os desenvolvedores.
Últimas novidades do projeto:
- Sebrae SP, nosso primeiro Show Case
- IsMobile, versão 0.1 disponível
- O que são Multimídias Móveis? (Dispositivos Móveis)
Quer acompanhar a crescimento do projeto?
Twitter: http://twitter.com/phpmobile
Rss: http://www.phpmobile.com.br/feed/
Lista: http://groups.google.com.br/group/phpmobile
May 24, 2009 3 Comments
Sistemas Distribuídos – Princípios e Paradigmas (Tanenbaum)

Opa, acabou de chegar a minha cortesia do livro do Tanenbaum. Em breve eu faço um review aqui no site. Assim como de outros livros de Sistemas Distribuídos. Valeu Pearson!
May 22, 2009 2 Comments











