Melhorando seu código: o dia que discordei de um blog conhecido
O Jonny do InfoBlog publicou um artigo sobre como ele invadiu (fez um “deface”, no jargão) um blog conhecido, aproveitando pra passar uma lição de moral, ou uma “moral”, como ele chamou nos comentários, sob forma de dica:
Por isso a minha dica é: Se você é expert em POG (programação orientada à gambiarra), JAMAIS divulgue seu código-fonte. (ITAYA, J. K. Cuidados com o Wordpress #1 - O dia que hackeei um blog conhecido. InfoBlog. Acesso em 8/5/2008)
Como é muito chato discordar do autor de um blog em seu próprio território, resolvi elaborar meus argumentos aqui. Tá, é mentira, eu discordo dos autores em seus próprios blogues o tempo todo. Sim isso me torna um chato de marca maior, mas não foi por isso que resolvi responder aqui. Eu respondi no blog do Jonny, mas meu comentário lá ficou gigante, a resposta do Jonny maior ainda, então resolvi organizar um pouco a putaria e, já que vou usar mais espaço, que seja o meu próprio. Além disso, ninguém pode discordar de mim aqui
Resumindo a história, foi o seguinte: o autor de um blog fez um plugin (uma extensão pro programa de blogs) que continha um erro. O autor escreveu o plugin pra seu próprio consumo, em seu blog razoavelmente popular (eu nunca tinha ouvido falar, mas eu não sou integrado na movimento hype tchap tchuras in cool descolado da Blogsofera brasileira, então não sou parâmetro). No intuito de ajudar os outros, o autor divulgou o código-fonte de seu plugin, caso outras pessoas estivessem interessadas em usar em seus próprios blogues. O plugin foi escrito, segundo o Jonny, sem grandes cuidados ou revisões por parte do autor em seu ambiente de produção (jargão tecno-corporativo que define um serviço em uso). Bom, Jonny se interessou pelo plugin, leu o código-fonte e encontrou um erro de programação, popularmente conhecido por bug, que permitia que um visitante qualquer inserisse um texto qualquer no blog do cara. E foi o que Jonny fez, inserindo uma propaganda de seu próprio blog. O autor foi avisado, notou o erro, corrigiu o bug e lançou nova versão do plugin. A seguir, Jonny escreveu o artigo, condenando o autor por ter liberado o código-fonte na Internet sem maiores cuidados, sem saber o que estava fazendo, e isso permitiu que seu blog fosse invadido e mudado, o que não teria ocorrido caso o código ficasse secreto.
Jonny se esforça por basear seu argumento de que o bug não teria sido descoberto por ele caso o autor não tivesse liberado o código. Eu acredito que seja verdade. Veja, não sei o quanto Jonny sabe de programação, mas se ele diz que seria incapaz de descobrir o bug sem acesso ao código-fonte, eu acredito nele. E também acredito que seja mais difícil em geral das pessoas descobrirem bugs com o código-fonte escondido, embora não acredite que o bug nunca seria descoberto com o código-fonte escondido (se fosse verdade, não existiram bugs descobertos no Windows, que esconde seu código-fonte), nem acredite que nunca descobrir bugs seja uma coisa boa.
Jonny conclui, ou parece concluir, que o bug não ser descoberto é bom, porque assim o blog do nosso escritor descuidado de plugins não teria sido desfigurado. Eu concluo que o fato do bug nao ter sido descoberto é ruim, porque ao ser descoberto ele pode ser corrigido, o que torna o programa melhor e o blog do autor (e de todas as pessoas que baixarem e usarem o plugin) mais seguro.
Mas talvez eu esteja sendo injusto com Jonny. Vamos reformular. Ele pode estar dizendo que divulgar o código fonte na Internet é um jeito ruim de descobrir bugs, porque você não tem controle sobre quem os descobre e o que a pessoa irá fazer com a descoberta. Eu acho que é o inverso: quanto mais secreto, menos controle você tem do que a pessoa irá fazer com a descoberta, e que divulgar o código-fonte é um jeito bom de descobrir e eliminar bugs. Vejamos.
Qual parece ser o cenário ideal de Jonny? O autor escreve um programa. Revisa. Revisa. Revisa. Não acha erros. Toma grandes cuidados com seu código. Testa-o antes em um abiente de desenvolvimento (jargão técnico-corporativo pra definir um serviço que simule um outro que esteja em uso, permitindo fazer testes que, se derem errado, não afetarão o serviço em uso). Lança na Internet, sem o código-fonte. Ninguém acha o bug, porque ninguém tem acesso ao código-fonte. O autor revisa de novo e acha um bug, que só ele descobriu. O autor lança nova versão, com bug corrigido, sem ninguém ter feito um vergonhoso deface em seu blog.
Eu acredito que esse cenário ideal não existe. O autor certamente cometerá erros que ele não vê e vai passar o resto da vida sem ver. O próprio Jonny reconhece esse fato:
O maior problema é que quem escreve um programa pode fuçar milhares de vezes o código-fonte e não encontrar um bugzinho (por impericia ou por imprudência). Você já deve ter escrito um texto, verificado milhares de vezes e mais tarde uma 2ª pessoa do nada acha um erro gramatical grotesco. (Fonte: idem)
Eu acredito que dificultar o processo de outros acharem seus bugs só trabalha contra você. Quanto mais se demora pra descobrir um bug, mais ele se espalha e mais difícil é de corrigir em todos os lugares. Quanto mais secreto é seu código, mais chance de apenas uma pessoa descobrir o bug, concentrando o poder de decidir o que fazer com ele na mão dessa pessoa (ou grupo pequeno de pessoas). Portanto, menos controle você tem sobre o que será feito com o bug descoberto. Se mais pessoas inspecionam o código, mais pessoas podem explorar, mas também mais pessoas podem te avisar antes disso. Ficar na esperança de que ninguém mais vai descobrir seu bug, só você em uma revisão futura é contar com a sorte. Esperar que você irá escrever códigos sem bugs, ou que todos os bugs serão encontrados em um abiente de desenvolvimento antes de irem pra produção é irreal.
O segredo faz com que o fato de existirem pessoas mais espertas, mais atentas ou simplesmente com uma outra perspectiva do que a sua própria (não encontrar bugs não é só fruto de imperícia ou imprudência), trabalhe contra você. Tornar público seu código faz o inverso: faz o fato trabalhar a seu favor. Eu acredito que a crítica de seus pares só acelera o processo de melhoria de seu trabalho, e quanto mais pessoas criticando, mais rápido o progresso.
Por isso minha dica é: Sempre divulgue seu código-fonte, especialmente se você é um POG (Programador Orientado à Gambiarra). Isso vai tornar seu programa mais seguro e você um programador melhor, um P menos OG.
rbp:
O código de um “Programador Orientador à Gambiarra” é frágil de qualquer forma. A questão é se o programador é simplesmente inexperiente e quer melhorar ou programa mal porque quer (ou não se importa). No último caso, não há solução. Aberto, fechado, é um código vulnerável. No primeiro caso, se o código está aberto, tem alguma chance de melhorar. Se está fechado, vai ser ruim sempre.
E é fácil descobrir, sem ver o código, que um programa foi mal feito. O percepção externa do uso é uma conseqüência direta da qualidade do código (se não fosse, não haveria motivo pra tentar programar bem). Uma vez claro que o código é ruim, é só sair buscando formas de atacar. O que não falta no mundo é “script kiddie” procurando código frágil pra atacar e tentar aparecer. Se o código estiver fechado, esta é a única indicação de que seu código tem problemas. Se estiver aberto, você tem a oportunidade de receber feedback de programadores bem-intencionados, que podem te ajudara melhorar.
Não foi o caso, infelizmente, mas é um risco que vale a pena correr.
May 8, 2008, 10:31 amJonny:
Daniduc…
vc sabe que eu mudei a minha opinião depois da nossa troca de emails…
Realmente estou convencido que divulgar o código pode torná-lo melhor. Só acho que antes de divulgar, a pessoa tem que então divulgar ele avisando que está em fase de testes!
Cabe ressaltar que eu não sou uma pessoa que fica olhando códigos para descobrir bugs. A pessoa lançou o plugin e algumas pessoas estavam discutindo como um plugin tão simples podia ser tão grande… Como eu nunca tinha feito um plugin, simplesmente abri para ver o porquê dele ser tão grande e acabei olhando e falando “caramba… isso tem um bug de formulário” e pronto…
de qualquer jeito, eu raramente divulgo as alterações que eu faço no wordpress. primeiro porque não teria como eu ficar dando suporte e também porque eu perderia o “diferencial”. Mas agora estou convencido de que se eu quisesse ele mais confiável, eu teria que divulgá-lo…
May 8, 2008, 12:04 pmdaniduc:
“vc sabe que eu mudei a minha opinião depois da nossa troca de emails…”
Cool. Não sabia (afinal foi depois da troca de emails), mas de qualquer forma, eu acho que o assunto é interessante e vale a pena discutir. E a discussão pode ser útil para mais pessoas. Tem o seu artigo, o meu artigo, quem se interessar le os dois e tira suas conclusões… e assim caminha a humanidade
“Só acho que antes de divulgar, a pessoa tem que então divulgar ele avisando que está em fase de testes!”
Bem, se ele estiver em fases de testes sim. Se não, não. Acho que em todos os casos divulgar ajuda. E sempre coloque um aviso: “use por sua conta e risco!” É o que *todas* as empresas/organizações de software fazem, aliás, da Microsoft à Debian. Pode ver, todas tem um “use por sua conta e risco”, porque sabem que bugs existem e são inevitáveis, estando em fase de testes ou não.
“Cabe ressaltar que eu não sou uma pessoa que fica olhando códigos para descobrir bugs.”
Pena. Acho que seria um trabalho útil, ajudar pessoas a caçar bugs - mas ressalto que efetivamente explorar os bugs eu já discordo.
“de qualquer jeito, eu raramente divulgo as alterações que eu faço no wordpress.”
Pena. Poderiam progredir mais rápido e ser útil para mais pessoas. Mas enfim, seu código, sua decisão.
“primeiro porque não teria como eu ficar dando suporte”
uai, e quem te obriga a dar suporte? Deixa lá com um aviso: use por sua conta e risco, e não dou suporte! Pedidos serão ignorados. e pronto. Você sabe, né, a maioria das empresas/org de software não dão suporte pro seu código (não de graça, pelo menos) - deixam isso pra comunidade, usuários.
“também porque eu perderia o “diferencial”.”
Ahn…mas você aprecia o fato de que o povo que faz o Wordpress e outros plugins de código aberto que você usa não pensam como você, né?
Enfim, seu código, sua decisão.
Mas agora estou convencido de que se eu quisesse ele mais confiável, eu teria que divulgá-lo…
Você não quer deixar seu código mais confiável?! Bizarro… mas enfim… seu código…
May 8, 2008, 2:11 pm