Hacker instalou um Backdoor secreto em servidores do Facebook para capturar senhas

Você viu essa notícia?

Hacker Installed a Secret Backdoor On Facebook Server to Steal Passwords

Resumindo, um hacker descobriu um servidor do Facebook (files.fb.com) rodando uma versão desatualizada de um software de compartilhamento de arquivos e conseguiu, através disso, fazer upload de um PHP Web Shell. Ou seja, acesso shell ao servidor.

No post original do cara que descobriu a falha você pode achar uma porção de detalhes técnicos muito interessantes.

O que é esse backdoor secreto?

Backdoor (“porta dos fundos” em inglês) é um software oculto que permite a quem o instalou acesso ao servidor. Um webshell é um backdoor que pode ser acessado em uma interface web. Existem webshells em PHP, ASP, Python, Ruby, C#, Perl e é muito fácil construir um em sua linguagem predileta.

Veja um exemplo de tela de um web shell em PHP:

Webshell em PHP
Webshell em PHP (clique para ampliar)

E seu site, é seguro?

Lição importante que você tirar desse episódio: uma corrente é tão forte quanto seu elo mais fraco. Seu servidor de controle de versão, seu software de gestão de projetos, seu webmail, todas as aplicações web acessórias ao seu site, todos os seus servidores e os computadores da sua equipe precisam estar seguros.

Por exemplo: se seu servidor git tiver o Open SSH desatualizado, se um dos programadores que desenvolve seu site instalar um software malicioso por engano ou se a sua senha do registro de domínios não é forte o suficiente, seu site estará vulnerável, não importa quão bom seja seu código.

Dúvida: URLs de categoria amigáveis

Um amigo me escreveu:

Ola Elcio,

vc tem algum tutorial de como reescrever a url para deixar mais amigável?

no momento eu tenho isso
http://www.meusite.com.br/index.php/category/produtos/produtos-especiais/

quero deixar assim:
http://www.meusite.com.br/produtos-especiais/

Muito bem, vamos lá. O primeiro passo é, se você não quer que as categorias apareçam uma dentro da outra, não usá-las de forma hierárquica no cadastro. Edite a categoria “produtos-especiais” e faça com que ela não seja mais filha de “produtos”. Isso deve deixar a URL dela assim:

http://www.meusite.com.br/index.php/category/produtos-especiais/

O passo seguinte é ir em “Configurações -> Links Permanentes” e configurar corretamente a estrutura de links permanentes, para retirar o “index.php” da URL. Escolha o formato que mais lhe agradar lá. Você vai precisar:

  1. Estar rodando Apache. Essa dica não vai funcionar em outro servidor web, a não ser que você acrescente uma boa dose de hacking.
  2. Ter o mod_rewrite habilitado no seu Apache.
  3. Que o PHP tenha permissão de escrita no arquivo .htaccess.

Tendo feito isso, a URL vai ficar:

http://www.meusite.com.br/category/produtos-especiais/

Por fim, você pode usar esse plugin: Top Level Categories. Ele consegue retirar aquele /category/ da URL, deixando o formato final da URL do jeito que você quer.

Boa sorte!

 

Porque você deveria aprender várias linguagens de programação

tpp_xlargecover
O programador pragmático não está preso a nenhuma tecnologia.

Há um tempo eu li “The Pragmatic Programmer“, uma espécie de livro de auto-ajuda para programadores. Não é um livro técnico, não vai te ensinar técnicas ou tecnologias, mas fala de um jeito de pensar e traz uma coleção de conselhos daquele tipo que parece óbvio mas ninguém nunca faz.

Um desses conselhos era aprender novas linguagens de programação. Os autores recomendam que você se torne proficiente em uma nova linguagem de programação por ano. O que, eu sei, é muito difícil. Eu não tenho conseguido aprender uma nova linguagem por ano. Mas isso não invalida o conselho de que você deve aprender novas linguagens de programação.

Por que aprender linguagens de programação novas?

Cada linguagem de programação traz consigo um jeito de pensar, um conjunto de soluções e uma comunidade com cultura diferente. E isso enriquece você. O bom programador tem uma visão ampla e não está “preso” a uma única tecnologia.

Por exemplo, digamos que você esteja desenvolvendo um sistema em PHP e precise, de tempos em tempos, fazer parsing de feeds RSS cuja URL foi cadastrada pelos usuários. Digamos que você queira fazer o parsing em segundo plano, a cada meia hora. Claro, você pode usar SimplePie, mas ele não é tão “Simple” assim. Dê uma olhada na documentação. SimplePie é muito poderoso, tem uma porção de recursos, mas vai dar algum trabalho para instalar direito, montar seu script, testar e automatizar.

E se você procurar soluções em outras linguagens de programação? Quanto trabalho vai ter? Vamos ver o que Python tem para nós, usando o excelente módulo feedparser. O módulo feedparser está disponível no gerenciador de pacotes do Ubuntu, e também para instalação via PIP.

import feedparser
print feedparser.parse('https://elcio.com.br/feed')

Mais uma meia dúzia de linhas para ler as URLs e salvar os resultados no banco de dados e pronto, temos um arquivo simples com excelente performance para ser colocado no cron. Bom, falando em performance, esse é o típico processamento que vai rodar muito mais rápido se feito em paralelo. Processamento em paralelo com PHP é um parto, certo? Com Python você pode usar o módulo multiprocessing e fazer isso quase que em uma linha só.

Além de ferramentas, linguagens de programação carregam jeitos de pensar

Uma vez que você já tenha resolvido um problema em uma linguagem de programação, você consegue resolver o mesmo problema em qualquer outra, certo? Bom, quando você aprende uma linguagem nova, você acaba tendo que ler um bocado de código de outras pessoas. E isso te ensina novas soluções para os seus velhos problemas.

Isso é diferente de se aprofundar no estudo de sua linguagem atual. O aprofundamento vai fazer você ler mais códigos das mesmas pessoas, da mesma comunidade, da mesma cultura. Aprender uma linguagem nova faz você ler códigos de gente nova, com outra cultura. Na prática, aprender Python vai fazer você melhor programador PHP, aprender Smalltalk vai fazer você melhor programador Java, etc.

Porque Python

De todas as linguagens de programação que você poderia escolher para começar a aprender algo novo hoje, eu recomendo que, se você ainda não sabe Python, comece por ela. Python roda no Google App Engine, no AWS Elastic Beanstalk e é a linguagem de programação por trás da maioria das ferramentas de administração do Ubuntu. Se você quer construir pequenos scripts para automatizar tarefas em seu servidor, ou quer construir grandes aplicações web para rodar em Cloud, ou se quer criar ferramentas de processamento paralelo massivo, ou interfaces gráficas multiplataforma, Python vai servir.

E é, ao mesmo tempo, uma linguagem que possui recurso fantásticos e vai te ensinar coisas incríveis, e uma das linguagens mais fáceis de aprender que eu conheço.

Que tal começar agora? Leia o excelente “Dive Into Python“, faça os exercícios, depois tente desenvolver alguma coisa na linguagem. E veja se você não vai se tornar mais eficiente em sua linguagem atual.

“Jabá”: Python é a linguagem que escolhemos para a aula de integração multi-linguagem do DevOps Heroes, treinamento da Visie que acontece a partir do dia 27 em São Paulo. Quem estiver lá vai ver isso tudo funcionando na prática. As vagas estão se esgotando.

SQL Executioner

Olha que útil: SQL Executioner, um plugin WordPress que te dá uma tela no painel para a execução de SQL, substituindo para muita coisa o phpMyAdmin ou ferramentas semelhantes:

wordpress-sql-executioner-screenshot

Acabou de salvar um cliente da Visie que hospeda o site num provedor que não nos dá facilidades como acesso SSH ou um bom painel de controle.

Claro, use com cuidado, e desinstale depois de usar.

HTTP API WordPress

Você está desenvolvendo um plugin ou tema para WordPress e precisa fazer uma conexão HTTP? Não use fopen, curl, file_get_contents, etc. Use a HTTP API do WordPress.

A HTTP API é simples de usar, muito bem implementada e tem excelente performance.  E se um dia você precisar hospedar seu site num servidor debaixo de um proxy, não vai precisar reescrever seu código. Ao configurar o proxy no wp-config.php, tudo vai funcionar.

Veja um exemplo do uso da HTTP API:

$content=wp_remote_retrieve_body(
           wp_remote_get('http://visie.com.br/'));

Servindo vídeos Ogg Teora com o Content Type correto

Semana passada participei de um curso sobre HTML5 ministrado pela w3c Brasil. Nesse curso o Elcio Ferreira foi o instrutor, eu fiquei com uma duvida e fiz uma pergunta para ele sobre a necessidade de incluir a extensão do arquivo na tag <video> para que o mesmo funcione no firefox. Ele me mostrou uma forma utilizando PHP mas infelizmente não consegui obter o codigo.

Os servidores web, quando servem um arquivo, enviam ao navegador a informação de tipo de conteúdo. O header enviado do servidor, para um arquivo Ogg Vorbis, deve ser:

Content-type: application/ogg

Se o servidor não enviar esse header, o vídeo não vai tocar no Firefox. O Apache sabe fazer sozinho, basta que esteja configurado para isso. No Ubuntu, por exemplo, ele já vem configurado para servir ogg.

A saída de scripts PHP é servida com outro tipo de conteúdo. Geralmente “text/html”. Se você serve seu vídeo do PHP, precisa enviar um header no início do script avisando o navegador que esse conteúdo é vídeo. Você pode fazer:

<?php
header('Content-type: application/ogg');
?>

Já se você serve os vídeos como arquivos estáticos, não deve usar PHP para processá-los só para que sejam servidor com o tipo correto. O jeito certo é configurar corretamente o servidor. Se for um hosting compartilhado, eu tentaria um chamado ao suporte pedindo para que configurem isso corretamente antes de fazer com PHP. Ou estudaria mudar de hosting 😉

utf8_decode em Javascript

Navegando por aí, acabei esbarrando no blog do meu amigo Marcos Rossow (nossa, quanto tempo!)

E encontrei esse post: JavaScript UTF-8 Decode, com um código tirado daqui: JavaScript utf8_decode.

Tem duas coisas que me incomodam nessa abordagem. A primeira é essa mania que muita gente tem, particularmente programadores PHP, de tratar UTF-8 como um “código alienígena” e ISO-8859-1 como normal e padrão. Alô, ISO-8859-1 é usado por parte do mundo. Não dá para escrever hebraico, mandarim, japonês, árabe ou russo com isso. ISO-8859-1 é uma das diversas tabelas de caracteres que existem mundo afora. E Unicode é a única maneira sensata de escrever um sistema que possa ser usado aqui e na China.

A segunda coisa que me incomoda é a quantidade de código. Não testei profundamente, mas tenho a impressão de que o código abaixo resolve o problema:

function utf8_decode(t){
  return decodeURIComponent(escape(t))
}

Retornando o último número (script Python)

Meu amigo DGmike publicou: Retornando o último número (script PHP)

Como eu acho interessante comparar soluções em linguagens diferentes, resolvi escrever o mesmo script em Python[bb]. Veja como ficou:

import re
def ultimoNumero(string):
    return re.findall(r"\d+",string)[-1]

Gostou?

Oficina de WordPress Visie

Momento Jabá:

Oficina de WordPress Visie: WordPress é a mais poderosa ferramenta de blogging da atualidade. É a ferramenta usada em todos os blogs aqui da Visie, e em boa parte dos blogs[bb] mais populares do Brasil e do mundo. Extremamente simples de usar, facilmente configurável e poderosamente extensível, WordPress ainda por cima é open source e completamente gratuito.

WordPress é a ferramenta por trás desse blog. A idéia da oficina nasceu numa conversa com o Juliano Spyer, no Blogcamp. Teremos um dia para quem quer aprender o básico de WordPress para, por exemplo, criar seu próprio blog, um dia para designers, falando de temas para WordPress e um dia para programadores em que vamos construir plugins e ferramentas que se integrem ao WordPress.

Dirty PHP Include, plugin para WordPress que faz include de arquivos PHP em seus posts

Para atender a um cliente, escrevi agora um pequeno plugin para WordPress[bb]. Você pode fazer download do plugin aqui:
https://elcio.com.br/download/dirtyinclude.zip (497 bytes)

Depois, basta descompactá-lo na pasta wp-content/plugins em seu diretório do WordPress. Tendo feito isso, acesse o administrador do WordPress, clique em “Plugins” (“Extensões” na versão em português) e ative o plugin. Pronto, está funcionando.

Para incluir um arquivo em um post basta, ao editar o post, escrever: [[[include:/caminho/ate/seu/arquivo.php]]] e o arquivo será incluído. O caminho é relativo ao diretório base do WordPress. Funciona tanto com o editor visual quanto com o editor de código. Atenção! Se você tem usuários não confiáveis, por exemplo, se permite que seus usuários se cadastrem e postem, não deve usar esse plugin. É perigoso…

Naturalmente, o plugin acaba de ser escrito e não foi exaustivamente testado. Se você tiver sugestões de melhorias ou achar bugs, por favor, avise.

Meus comentários:

  1. WordPress é fantástico! Essa API para a criação de plugins é fabulosa. É muito fácil escrever um plugin que faz bem seu trabalho sem atrapalhar todo o resto.
  2. Continuo não gostando de PHP, mas dá para trabalhar com isso. Se metade do código mundo a fora tivesse a qualidade do WordPress, já ajudaria muito.
  3. Vou dizer de novo: se você não sabe expressões regulares[bb], precisa aprender!

Aprenda expressões regulares!

Exemplos de expressões regulares PHP. Expressões prontas para uma porção de coisas.

Seguem também uns exemplos brasileiros bem comuns:

CPF='\b([0-9]{3}\.?){3}-[0-9]{2}\b'
CNPJ='\b[0-9]{2,3}\.?([0-9]{3}\.?){2}\/[0-9]{4}-[0-9]{2}\b'
CEP='\b[0-9]{2}\.?[0-9]{3}-[0-9]{3}\b'

Expessões regulares permitem fazer com uma linha de código coisas que, de outra forma, levariam um bocado de código e tempo. Veja, por exemplo, este trecho de Javascript:

// Exibe o texto da página, removendo todas as tags
t=document.body.innerHTML
t=t.replace(/<.*?>/g,"")
t=t.replace(/[ \t]+/g," ")
t=t.replace(/(\n ?)+/g,"\n")

Pode dar um pouco de trabalho aprender expressões regulares[bb], mas eu garanto que o tempo que você investir nisso se paga muito rápido.

Cuidado onde você enfia esse SQL aí!

Já cansei de fazer código que tem SQL misturado, no meio dos scripts PHP. Sim eu era um “lousy coder”, um desenvolvedor mixuruca, mas se você olhar tem muito código open source por aí assim. Meu Deus, como eu não via a gravidade desta heresia? Como eu não pude perceber que lugar de SQL não é no script que desenha minha tela? Que sql é coisa muito séria, que deve estar protegido, separado em classes que deixe tudo bem seguro pra que nenhum engraçadinho detone meus dados? Bem, acho que eu realmente não ligava. Mas quando a coisa começou a tirar a minha produtividade, e eu perdia horas procurando “cadê aquela query, acho que deve ser essa aqui” etc e tal a coisa ficou mais clara pra mim. Tinha que haver uma solução melhor pra isso.

Danilo Medeiros, O Zen e a arte cavalheiresca da programação orientada a objeto.