Você está na página 1de 35

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.

com>

PHP Magazine - 3a Edio -

SUMRIO

No esquecer Sombra no fundo Da imagem

PHP + JAVA PHP-GTK SMTP Injection AJAX

editorial
Apresentao Equipe Mensagens de leitores Chamadas

artigos
phpDocumentor
por Maykel dos Santos Braz

Desenvolvendo em PHP para linha de comando - CLI


por Helton Eduardo Ritter

Ataque de sobrecarga utilizando SMTP Injection. O que , como e como se prevenir


por Ricardo Striquer Soares

Gerando Planilhas Excel com PHP-GTK


por Pablo Dall'Oglio

AJAX e PHP I: Conhecendo AJAX


por Rafael Dohms

Webmail com Java + PHP


por Guilherme Gall, Pedro Lara, Fabio Borges

Criao de imagens on-the-fly


por Leandro Schwarz

2 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

apresentao
Caro leitor, Um ano aps o primeiro exemplar, apresentamos a quarta edio da PHP Magazine, a nica publicao nacional sobre tecnologia PHP. Alguns imprevistos prejudicaram o lanamento desta edio ainda em 2007, como era do interesse da equipe. Reconhecemos nossa falha perante a nossa comunidade. Pedimos desculpas, e para compensar, preparamos uma revista repleta de assuntos interessantes. Nesta edio, selecionamos 7 artigos para leitores de todos os nveis. O artigo sobre phpDocumentor demonstra uma alternativa para organizar a documentao de seus projetos. Em Desenvolvendo em PHP para linha de comando CLI, voc ir acompanhar valiosas noes sobre a utilizao do PHP atravs da interface de linha de comando. Discutiremos tambm sobre polticas de segurana em um artigo sobre SMTP Injection. Pablo Dall'Oglio participa desta vez com um excelente texto que aborda a gerao de planilhas Excel com PHP-GTK. Na seqncia dois artigos discutem o tema jax e autenticao de webmail atravs de Java e PHP. Encerrando a edio, Leandro Schwarz, nico autor que publicou em todas as edies da revista, explora a criao de imagens on-the-fly. Tambm j estamos com muitos planos para o futuro e voc no pode ficar fora dessa! Foram muitas conquistas em 2007. Ganhamos credibilidade e repercusso na comunidade de desenvolvedores Web. Mesmo assim, ainda acreditamos que no estamos explorando o potencial mximo da PHP Magazine. Em 2008 iremos focar nossa caminhada na tentativa de obter mais destaque, oferecendo contedo de qualidade, apoiando eventos e, como novidade, disponibilizando alguns servios em nosso portal. Neste ano, com a unio e comprometimento de nossa equipe, iremos atuar intensamente no site com o intuito de incluir novas sees e servios at o lanamento da quinta edio. Aguardem as novidades que esto por vir... Deixamos aqui o nosso agradecimento a todos os autores que contriburam nesta edio e nas anteriores. Estejam certos de que vocs fazem parte da histria da revista ao longo deste primeiro ano de publicaes. E, como sempre, fica aqui nossa convocao para mais um ciclo de atividades. Teremos o imenso prazer em analisar o seu trabalho e disponibiliz-lo em nossa revista. Envie o seu artigo at o dia 25 de abril e participe do prximo exemplar. A administrao da PHP Magazine agradece o apoio de todos os leitores, principalmente daqueles que ficaram preocupados e enviaram mensagens questionando o nosso atraso e perguntando sobre a continuidade do projeto. Aproveitamos para registrar que o projeto continua firme e esperamos atingir o marco dos 10.000 usurios at o lanamento da quinta edio. Para mais esta conquista, contamos com a participao de todos. Uma boa leitura e at a prxima.

Equipe PHP Magazine

Editores Flvio Zacharias Fagundes, zach@phpmagazine.com.br Ricardo Arago, ricardoaragao@phpmagazine.com.br Administrao Flvio Zacharias Fagundes, zach@phpmagazine.com.br Norberto Augusto, augusto@phpmagazine.com.br Ricardo Arago, ricardoaragao@phpmagazine.com.br Comercial Norberto Augusto Projeto grfico Ricardo Arago Flvio Zacharias Fagundes Reviso tcnica Ricardo Arago da Silva Flvio Zacharias Fagundes Reviso - Lngua Portuguesa Camilla Carvalho, camilla@phpmagazine.com.br

www.phpmagazine.com.br
Comercial comercial@phpmagazine.com.br Contato/Suporte contato@phpmagazine.com.br Marketing mkt@phpmagazine.com.br

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 3

mensagens de leitores

Fim da PHP Magazine?


Percebi que desde a ltima edio vocs no lanaram mais nenhum exemplar. Est ocorrendo algum problema? Por favor, se for o caso, comunique no s a mim, mas a todos os leitores, pois at agora as trs ltimas edies foram legais. Vagner Virgilio dos Santos :: Guarulhos - SP

Fiquem tranqilos, pois a revista continuar. E em breve teremos novidades em nosso portal.

Novos colaboradores
Acompanho o trabalho de vocs, pois sou a favor da ideologia da linguagem. Ofereo sempre cursos gratuitos de PHP para comunidades, geralmente ao pblico universitrio. Gostaria de saber se existem vagas para a equipe e como fao para me inscrever. Thiago Silva :: Contagem - MG Sou graduado em Cincia da Computao e desenvolvo projetos em PHP desde 2005. Quero colocar-me disposio para colaborar na revista. Tenho habilidades em gesto de projetos, desenvolvimento e anlise de sistemas. Sou fluente em ingls e possuo habilidades didticas. Gabriel Rambaldi :: Trs Coraes - MG

Assinaturas
Tenho 18 anos e trabalho com PHP h 2 anos. Achei muito bacana a iniciativa de vocs e gostaria de saber onde encontro a revista na verso impressa e se vocs trabalham com assinaturas. Bruno Scherer :: Camaqu RS

Ainda no dispomos de verso impressa, portanto no necessria nenhuma assinatura da revista, apenas o cadastro no portal para o download das edies.

No momento, precisamos de colaboradores que incentivem a submisso de artigos e participem do processo de seleo, captando autores.

Parabns
Parabns pela iniciativa e viva a comunidade free!Uma sugesto: separem uma seo da revista somente para iniciantes. difcil encontrar um material organizado didaticamente. Rogrio Menta Monici :: Santa Rosa de Viterbo SP

Sugesto anotada.

ENVIE E-MAIL PARA


contato@phpmagazine.com.br S sero publicadas mensagens com os seguintes dados do remetente: nome completo, cidade e estado. Devido s limitaes de espao, a redao se reserva o direito de selecionar e adaptar as mensagens sem alterar o contedo.

4 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

chamadas

Mais uma vez ser realizado em Porto Alegre/RS, no Centro de Eventos da PUCRS, o 9 Frum Internacional de Software Livre para debates tcnicos e estratgicos sobre o desenvolvimento e o uso do Software Livre. Com atividades para trs dias, a programao do evento prope em sua agenda: Palestras, encontros com Grupos de Usurios, Arena de Programao, Homenageados, Cultura Livre e o Workshop de Software Livre. As palestras do fisl9.0 sero divididas em doze trilhas: Desenvolvimento (Banco de Dados, Ferramentas e Metodologias, Java, Perl, Python, PHP e Ruby), Kernel, Admin (Segurana, Redes e Telecom), Hardware e Sistemas Embarcados, Ecossistema do Software Livre (Comunidade, Filosofia, Aspectos Sociais e Cultura Livre), Governo e Software Pblico, Educao e Incluso Digital, Jogos e Multimdia, Desktop, Casos/Solues, Negcios (Produtos e Servicos),e Tpicos Emergentes . At este momento, estes so os palestrantes confirmados: Randal Schwartz - Administrador de Sistemas e escritor de diversos livros sobre Perl, Randal co-fundador da comunidade Perl Mongers e uma das figuras mais respeitadas da comunidade Perl mundial. Atualmente, ele trabalha como consultor para desenvolvimento de software, e co-host do podcast FLOSS Weekly. Bram Moolenaar - Engenheiro de Software atualmente trabalhando para o Google, em Zurich, Bram o criador do editor de textos VIM, um dos editores mais utilizados por programadores e administradores de sistemas Unix no mundo inteiro. Ken Coar - Ken um dos principais desenvolvedores do Apache, servidor http mais utilizado na internet. Atualmente trabalha para o Linux Technology Center, da IBM. Zaheda Bhorat - Zaheda ficou conhecida por seu trabalho na comunidade OpenOffice.org, e hoje em dia trabalha como Open Source Program Manager para o Google, tratando de assuntos como Open Standards. Rishab Ghosh - Diretor da Open Source Initiative. Entre outras coisas, ele fundador e gerente de edico do jornal First Monday, e Programme Leader para Software Livre na UNU-MERIT. Ele trabalha em diversos projetos de pesquisas sobre Software Livre. Danese Cooper - Open Source Diva, Intel e Open Source Initiative. Responsvel pelo apoio a iniciativas de software livre na Intel. Arnaldo Carvalho de Melo - Desenvolvedor do kernel Linux com foco em protocolos de rede e um dos fundadores da Conectiva. David Fetter - Desenvolvedor do projeto PostgreSQL. Jon Maddog Hall - Diretor-presidente da Linux International. Georgy Berdyshev - Lder do projeto Hardened Linux. Michael Hanselmann - Michael Hanselmann trabalha para o Google Switzerland como Administrador de Sistemas, especificamente no desenvolvimento do projeto Ganeti. Ele mantem um projeto de hosting h 5 anos, participou no desenvolvimento do Gentoo por 3 anos e meio, e contribuiu para diferentes projetos de Software Livre, incluindo o Linux Kernel. Alberto Barrionuevo - Vice-presidente da Foundation for a Free Information Infrastructure (FFII).

PARTICIPE Est disponvel a seo para inscries, garanta j sua participao. Voc pode apoiar o evento tornando-se Pgina Amiga, divulgando o evento em seu site e obtendo um pequeno espao para sua no site do portal Alogomarca tecnologia que liberta Voc tambm poder obter material para divulgao, saiba mais clicando aqui.
Eventos A PHP Magazine apia a iniciativa de eventos como cursos gratuitos, palestras e fruns. Para divulgar na revista, envie informaes sobre o evento para contato@phpmagazine.com.br , que teremos prazer em contribuir com a divulgao.

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 5

documentao
por Maykel dos Santos Braz

phpDocumentor
O objetivo deste trabalho apresentar a ferramenta phpDocumentor e exemplificar algumas das funcionalidade utilizadas para documentao de cdigo PHP. Alm dos exemplos de utilizao, tambm ser demonstrado o processo de execuo do phpDocumentor, o que possibilitar ao leitor gerar sua prpria documentao.
medida que um projeto cresce ou sua equipe aumenta torna-se difcil memorizar todos seus componentes (funes, mtodos, classes e at arquivos) e suas funcionalidades, ento se faz necessrio documentao do cdigo. Neste ponto, o phpDocumentor possibilita ao desenvolvedor e sua equipe acesso documentao do cdigo de uma forma amigvel e acessvel. Analisando o cdigo em busca de palavras chaves e determinados tipos de comentrios o phpDocumentor transforma estes comentrios em pginas HTML ou arquivos PDF entre outros formatos. definido em trs partes que so: Descrio; Descrio extendida; Tags. A primeira descrio deve ser feita em apenas uma nica linha e deve ser utilizada como uma forma resumida e direta de definir o bloco. Esta descrio pode ser terminada com a utilizao de uma linha em branco e se for muito grande ser utilizada apenas a primeira. Algumas tags HTML so permitidas. A partir da segunda linha do docBlock iniciada a descrio extendida do elemento. Nesta parte, o desenvolvedor poder introduzir quaisquer anotaes relevantes ao elemento sem limite de contedo. Nesta parte do docBlock so permitidas algumas tags HTML para formatao, alguns exemplos: Texto em itlico e/ou negrito; Definio de pargrafos e quebras de linha; Criao de listas ordenadas; Insero de trechos de cdigo. No final do docBlock so includas as tags que ajudam o phpDocumentor no processamento da documentao. Estas tags e suas funes sero discutidas no prximo tpico.

1. Histria
O phpDocumentor uma alternativa para documentao de cdigos PHP muito similar ao Javadoc, voltado linguagem Java. Seu desenvolvimento foi iniciado em meados de 2000 por Joshua Eichorn. Mais tarde, Greg Beaver juntou-se ao projeto. Hoje Joshua e Greg so os principais mantenedores do projeto, embora outros tambm tenham contribudo. Uma lista completa dos envolvidos no projeto pode ser encontrada em [Autores phpDocumentor].
Desde sua criao at hoje o phpDocumentor evoluiu muito e atualmente uma das principais ferramentas utilizadas para a documentao de cdigo escrito em PHP, e que, na sua atual verso (1.4.0), apresenta suporte para PHP5.

2. Estrutura da documentao
Para que o phpDocumentor processe os comentrios de seu cdigo, estes devem possuir um formato especfico. Estes blocos de comentrios, tambm conhecidos como docBlocks, tem o seguinte formato:

2.1 Nveis de um docBlock


Existem dois nveis de docBlock, o nvel de pgina e o nvel de classe. O nvel de pgina utilizado para documentar arquivos e geralmente associado ao paradigma de programao estruturada. J o de nvel de classe utilizado para documentao de classes e associado ao paradigma de orientao a objetos. Na verdade, um docBlock de pgina a nica forma de agrupar os elementos estruturados em uma unidade lgica de documentao, em pacotes. Mas nada impede a utilizao de um docBlock de pgina em conjunto com um docBlock de classe e, na verdade, em alguns casos se faz necessrio utilizar os dois em conjunto.

Formato de um docBlock vlido.

Um docBlock dever ser definido imediatamente antes do bloco a ser documentado. A nica exceo a esta regra o docBlock de nvel de pgina. Um docBlock

6 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

3. Tags
As tags so diretivas inseridas na terceira parte de um dockBlock - Com exceo das tags inline, que podem ser utilizadas na descrio completa - e so sempre iniciadas pelo caractere @. Pode-se dividir as tags em categorias para um melhor entendimento: Classificao(C): Agrupam arquivos ou classes. Exemplo: @package Informao(I): Adicionam informaes documentao. Exemplo: @author Descrio(D): Descrevem alguma particularidade do bloco documentado. Exemplo: @abstract Referncia(R): Fazem referncia a informaes que ajudam a compreender um trecho documentado. Exemplo: @see Alm das tags padres o phpDocumentor define mais algumas tags que so permitidas nos blocos de documentao dentro dos trechos de descrio extendida, estas so chamadas tags inline. Estas tags permitem incluir mais informaes documentao com um menor esforo por parte do desenvolvedor. As tags inline no sero abordadas neste documento. Para mais informaes sobre elas acesse phpDocumentor Inline tags em [Manual phpDocumentor].

@copyright: Adiciona informaes de copyright documentao. A tag da categoria I.

Adicionando Copyright

@filesource: Ao encontrar esta tag no docBlock de pgina, o phpDocumentor adiciona na documentao um link para o cdigo fonte. Pode ser classificado como pertencente categoria R.

Criando um link entre a documentao e o cdigo fonte

@deprecated: Usado para indicar que o elemento documentado. obsoleto e no deve mais ser utilizado. Adicionalmente possvel incluir um comentrio aps a tag. classificada como categoria I.

Definindo um elemento como obsoleto

3.1 Tags padro


Na seqncia, sero apresentadas algumas das tags padro mais utilizadas no processo de documentao. @package: Esta tag utilizada para definir pacotes lgicos, onde podem ser includos arquivos ou classes. Deve ser utilizada apenas em docBlocks de classe e de pgina. uma tag da categoria C. @subpackage: Utilizada apenas em conjunto com @package, permite subdividir um agrupamento em subpacotes. Assim como @package um tag da categoria C. Estas tags podem ser utilizadas em docBlocks de classe e de pgina.

@see: Cria uma referncia para outro elemento do cdigo. Podem ser funes, classes, arquivos entre outros. Observe que o link s ser criado se o elemento referenciado existir. Outra observao utilizar referncias que ajudem no reconhecimento de um elemento, ou seja, () para funes e mtodos, $ para variveis, etc. Esta ao melhorar a performance de interpretao desta tag da categoria R.

Referenciando outros elementos

Adicionando itens a ToDo List

@todo: Esta tag cria uma lista de futuras alteraes e pode ser utilizada com quase todos os elementos do PHP. Alm de listado junto ao elemento documentado, gerada uma lista global, com todas as ocorrncias da tag. Isto permite uma consulta geral sobre pendncias no sistema. Esta uma tag da categoria I. Na figura 1 pode-se visualizar a sada gerada pelo

Exemplo de @package e @subpackage

phpDocumentor com as tags apresentadas at o momento aplicadas a um docBlock de pgina. Observe no menu do lado esquerdo da imagem o link para a ToDo List.
@global: Esta tag utilizada para documentao de variveis globais e de sua utilizao atravs do cdigo. Pode ser utilizada em conjunto com tag @name. Esta uma tag da categoria D.

Definindo autor de um bloco de cdigo com @author

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 7

Figura 1 Sada do phpDocumentor

@name: Ao utilizar esta tag para atribuir um apelido a um bloco procedural de cdigo, o phpDocumentor criar um link de referncia a este bloco sempre que ele for documentado futuramente. Esta uma tag da categoria R.
Figura 2 Documentao gerada por @global e @name

Utilizando @name e @global

Na figura 2 mostrado o resultado da documentao do trecho de cdigo acima. Observe o link que foi criado na documentao da funo para a documentao da varivel global. Este link o resultado da utilizao da tag @name. @param: Definem o tipo e uma descrio para os parmetros de uma funo ou mtodo. utilizada no seguinte formato: @param tipo $nome descrio. Quando o parmetro pode ser de mais de um tipo existem duas formas de declarao. A primeira utilizando | para separar os tipos ou simplesmente utilizando o valor mixed. Caso os parmetros no sejam documentados, o phpDocumentor ir processa-los apenas adicionandoos lista junto declarao da funo ou mtodo. Esta tag da categoria D. @return: utilizada para definir o tipo de retorno de uma funo ou mtodo, adicionalmente, possvel definir uma descrio para o retorno. Sua sintaxe : @return tipo descrio. Assim como @param possvel definir mais de um tipo de retorno para @return.Esta tag classificada como D.

Documentando parmetros e retorno de uma funo ou mtodo

@var: A documentao dos atributos de uma classe feita atravs desta tag. A sintaxe utilizada : @var tipo descrio. Adicionalmente, pode-se utilizar as descries curtas e completas junto a tag @var. Esta tag classificada como categoria D. @abstract: Classifica uma classe, mtodo ou atributo como abstrato. Ao processar um bloco de cdigo PHP com a diretiva abstract o phpDocumentor j o classifica como abstrato, o que dispensa a utilizao desta tag. Pertence categoria D. @final: Documenta um mtodo final, ou seja, um mtodo que no pode ser sobrescrito por uma classe filha. Tambm uma tag que processada automaticamente caso o cdigo j possua a diretiva final. Esta uma tag da categoria D. @static: Define mtodos e atributos como estticos em classes. Da mesma forma que @abstract e @final esta tag tambm opcional, pois uma vez encontrada a palavra chave, o elemento ser documentado como static. Tambm uma tag da categoria D.

8 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

default; earthli; l0l33t phpdoc.de;

Consideraes finais
Analisando a documentao gerada pelo phpDocumentor possvel ver a diferena entre ler a documentao direto no cdigo fonte e ler a documentao apresentada com uma sada amigvel e com hyperlinks para fcil acesso a outros itens documentados. Alm da sada amigvel e em diversos formatos, que satisfazem diversas situaes, o phpDocumentor apresenta um conjunto de tags muito simples, o que permite um rpido aprendizado a qualquer desenvolvedor. Outra vantagem deste tipo de documentao o fato da documentao ser realizada junto ao elemento e pode ser atualizada no mesmo momento em que este atualizado. Esta facilidade evita a necessidade do desenvolvedor procurar por outros arquivos para atualizar a documentao, o que no seria muito produtivo. No se esquea que o objetivo deste artigo apenas apresentar ao leitor esta ferramenta de documentao. Com essa informaes o leitor poder aproveitar ainda mais suas diversas funcionalidades, muitas das quais no foram apresentadas aqui.

Documentao de classes e atributos com @abstract, @var, @static e @final

Estas no so todas as tags padro do phpDocumentor. Para uma lista completa e mais detalhes, visite a referncia [Manual phpDocumentor].

4. Instalao e execuo
A ltima verso do phpDocumentor est disponvel em [Download phpDocumentor] e existem verses disponveis para Windows e Linux. Para executar o phpDocumentor necessrio a existncia de uma verso do PHP maior que 4.1.0 e, para usar a interface web um servidor rodando o PHP. Este artigo aborda apenas a execuo via linha de comando.

Referncias e links sugeridos


[phpDocumentor] http://www.phpdoc.org [Manual phpDocumentor] http://manual.phpdoc.org [Download phpDocumentor] http://sourceforge.net/ project/showfiles.php?group_id=11194 [Autores phpDocumentor] http://www.phpdoc.org/ notes/Authors Os arquivos gerados so apenas a base do CHM. Maykel dos Santos Braz maykelsb@yahoo.com.br Bacharel em Engenharia de computao pela Universidade do Estado de Minas Gerais (UEMG).

4.1 Execuo via linha de comando


Esta a maneira mais simples de execuo e a que necessita de menos recursos. Considerando que o php esteja no seu PATH, para executar o phpDocumentor com a configurao padro basta executar o seguinte comando:

phpDocumentor via linha de comando

Por padro, phpdoc.bat est na raiz do arquivo compactado. O parmetro o define a sada da documentao gerada e est dividida da seguinte forma: Tipo de sada:Nome do conversor:Nome do template. Para tipo de sada existem os seguintes valores HTML XML PDF CHM1

Entre os diversos tipos de conversores para HTML esto:

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 9

script
por Helton Eduardo Ritter

Desenvolvendo em PHP para

linha de comando CLI


O PHP foi projetado para trabalhar em conjunto com um servidor HTTP, porm sua facilidade de uso e sua gama de recursos foram vistos como aplicveis interface da linha de comando. Assim, a partir da verso 4.3.0, o PHP CLI passou a fazer parte da instalao default do interpretador. Com o CLI podemos fazer aplicativos para serem executados no terminal, tais como Shell Script ou Perl. A possibilidade de executar PHP na linha de comando potencializa a integrao com as aplicaes Web.
O PHP tem seu nome reconhecido pela sua eficincia quando aplicado para desenvolvimento de solues Web. Entretanto, assim como Perl pode ser usado em aplicaes na linha de comando. A vantagem do uso do PHP ao invs de outra forma de execuo no Shell est na disponibilidade de documentao e na comodidade de no precisar aprender uma outra linguagem para executar tarefas relativamente complexas fora do ambiente Web. Usando-se desta caracterstica pouco difundida, o programador pode criar uma srie de utilitrios com funcionalidades que no eram possveis ou viveis usando PHP em conjunto com o Apache ou outro servidor HTTP. Este artigo expe algumas diferenas de executar PHP na linha de comando, bem como mostra exemplos bsicos da entrada de dados a uma aplicao. Tendo isso claro, o programador j tem tudo que precisa para desenvolver as mais variadas solues. agora o PHP independente do servidor Web, ou seja, o processo executado sobre o usurio que iniciou a execuo. Cada execuo tem seu prprio PID, e no h tempo limite para execuo do script. Observe que na figura 1 um script que dispara ping contra uma mquina executado. Este script, enquanto no interrompido manualmente (ctrl+c), continuar executando e no acusar erro por exceder o tempo limite.

Figura 1 - Executando o script de ping

Na figura 2, observe que o PID 3776 est sendo executado pelo root, mostrando que cada script executado tem se prprio PID, o que no ocorre quando o PHP executado para Web, onde todas as execues compartilham o mesmo processo.

1. Diferenas bsicas do PHP CLI


Programar para CLI no difere muito de programar para Web. Mesmo porque a verso CLI foi baseada na CGI, aquela quando o PHP executado atravs da requisio feita pelo Apache. Pode-se usar de todos os recursos que estamos acostumados a usar como classes de terceiros, mdulos do PHP, entre outros. O que no temos disponvel e no faz sentido termos a manipulao de cabealhos HTML, logo, no conseguimos redirecionar, pegar o valor de $_POST ou $_GET, $_COOKIE ou se imprimirmos algum HTML na tela, ele ser mostrado como texto puro. Terminal no um browser. Por isso que, quando programamos para terminal, os erros so exibidos em texto puro. O CLI no envia os cabealhos padres que o PHP envia ao browser. A caracterstica que mais precisa estar clara que
10 - 4a Edio - PHP Magazine
Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

Figura 2 - Processo da execuo do script de ping

Na Web seria invivel. Imagine um site com 800 usurios on-line. J executando um script pela linha de comando, essa caracterstica muda. Exclusivamente para CLI, o PHP possui um mdulo, o pcntl, justamente para controle de processos. Em tese, a execuo de PHP para linha de comando tambm tende a ser mais rpida, pois a entrada do usurio vai diretamente para o interpretador PHP e devolvida. Enquanto na Web a entrada do usurio para o servidor, este para o PHP, que devolve para o servidor (de HTTP), e este para o usurio.

2. Como executar scripts pela CLI


H trs formas bsicas de se fazer isso em ambiente Linux.

de quantos parmetros foram passados para o arquivo. $argv contm o valor desses parmetros, um array, que tem no ndice 0 o nome do prprio arquivo que est sendo executado. Os demais parmetros so os passados pelo usurio.

Figura 3 - Executando o cdigo de uma linha

Assim como exibido na figura 3, chamamos o executvel do PHP informando que deve executar o que est entre aspas simples. Isso feito com o parmetro r. Note que neste caso no necessrio as tags de abertura e fechamento. Diferentes distribuies possuem nomes diferentes para o executvel do PHP. Na figura 3, usvamos Mandriva Linux 2008, e PHP5 e o nome do executvel era apenas php. Nas figuras seguintes uso PHP5, executo em Open Suse 10.1. Verifique qual se aplica para sua mquina. A outra maneira informar ao interpretador PHP que deve executar o que h num arquivo. Este arquivo segue as mesmas regras do PHP para Web, ou seja, contm as tags de abertura e fechamento de PHP, assim como ; ao final de cada instruo. Na figura 4 tem-se o exemplo mais bsico de PHP para linha de commando.

Figura 6 - Exibindo quantos e quais parmetros

Figura 7 - Passando parmetros para o script

O resultado da execuo do script da figura 6 pode ser visto na figura 7. Sabendo desta possibilidade de entrada de dados, alguns j ficam pensando nas muitas aplicabilidades, uma vez que se tm todos os recursos do PHP disponveis. Passaremos agora para um meio de entrada de dados mais interativa, como estamos acostumados nos programas escritos em C ou outra linguagem para o ambiente texto. Vamos ler a entrada de teclado, do arquivo STDIN (standard input).

Figura 4 - Primeiro script PHP para CLI

Executando o cdigo da figura 4, obtemos o resultado da figura 5.

Figura 5 - Executando o primeiro script para CLI

A maneira mais prtica, entretanto, para executar um

script, descobrir onde est o executvel do PHP


(normalmente em /usr/bin/php5) e na primeira linha do script adicionar #!/usr/bin/php5, em seguida tornar este arquivo PHP um executvel (chmod +x script.php), e execut-lo simplesmente (./script.php). Em ambiente Windows, tambm possvel executar seus scripts, abra o prompt v at o diretrio onde est seu interpretador PHP, e digite php caminho_script. Para facilitar, podemos fazer um bat. Infelizmente, no h como dizer que um arquivo texto um executvel, e simplesmente execut-lo como em Linux.

Figura 8 - lendo o STDIN

Como visto, trata-se de um arquivo PHP em que na primeira linha foi includo o caminho do executvel, em seguida uma varivel recebeu, sem espaos ou enter, a leitura do arquivo STDIN. A funo trim usada, pois na entrada de texto, o enter lido como ltimo caractere. O ltimo caractere uma quebra de linha. Executando o script acima (que um executvel chmod +x 04.php) tem-se o que apresentado na figura 9.

3. Entrada de dados
A entrada de dados pode se dar de duas formas: atravs de parmetros ou da leitura do STDIN. Assim como C, o PHP CLI possui as variveis $argc e $argv. A primeira tem um nmero inteiro indicativo
Figura 9 - Lendo e exibindo a entrada de teclado

At ento, acredito que temos os recursos bsicos


PHP Magazine - 3a Edio - 11

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

para desenvolver qualquer script para linha de comando. No precisamos nos preocupar com estouro de memria em virtude da entrada de uma string muito grande, mas as nossas aplicaes devem estar preparadas para um tamanho fixo e mximo dessa string. Podemos limitar quanto queremos ler do STDIN, j na leitura atravs do fgets, informando um parmetro opcional. Neste caso estamos lendo apenas os 10 primeiros caracteres.

-GTK que busca maximizar as solues em que podemos aplicar PHP. A linha de comando, por tempos sufocada e dita como antiga, hoje um recurso novo no Windows Server 2008, atravs do Power Shell. Em ambiente Linux, no h porque discutir a aplicabilidade da interface de linha de comando. O PHP mostra-se uma soluo de fcil aplicao para automatizar e facilitar uma srie de tarefas e tudo isso com o mesmo modo de programar que j estamos acostumados. Programador PHP, o que acha de conversar com o administrador de redes da sua empresa? Tenho certeza que surgiro solues muito boas!

Referncias e links sugeridos


Figura 10 - Lendo 10 caracteres de STDIN

GUTMANS, Andi; BAKKEN, Stig Saether; RETHANS, Derick. PHP 5 Power Programming. Indianapolis, Prentice Hall: 2005. http://www.vivaolinux.com.br/artigos/verArtigo.php? codigo=347

Consideraes finais
O PHP foi projetado para Web, e nesta funo que apresenta os resultados mais interessantes. Entretanto, podemos usar mais esta linguagem para resolver alguns problemas fora da Web. Simplesmente h situaes em que um aplicativo Web no satisfaz. Prova disso o PHP

Helton Eduardo Ritter - heltonritter@gmail.com Bacharelando em Sistemas de Informao pela Sociedade Educacional Trs de Maio SETREM, pela qual tambm Tcnico em informtica formado em 2006 e funcionrio desde julho do mesmo ano. Moderador PHP do frum ScriptBrasil, Helton tambm colunista do Imasters e faz trabalhos como free-lancer.

12 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

segurana
por Ricardo Striquer Soares

Ataque de sobrecarga

utilizando SMTP Injection.


O que , como e como se prevenir
Este artigo apresenta de forma objetiva o funcionamento do SMTP Injection e como ele pode ser utilizado para causar um ataque de sobrecarga, como isto pode vir a afetar o servidor, como um programador deve codificar e como um administrador deve agir para evitar problemas.
com clientes, digamos que eu queira atrasar o recebimento de um email, ou a leitura de uma notcia, eu posso me utilizar de um ataque de DoS para conter o servidor de distribuio daquela informao, atrasando assim o cliente de obt-la. Em verdade a maior parte dos ataques de DoS so ataques de carga. Na maior parte dos casos um ataque de carga geralmente conta com certas vantagens em relao a outros, nem sempre temos um bom tcnico dimensionando o sistema ou gerenciando o mesmo e nem sempre temos um projeto bem implementado. Em sua maioria um ataque de carga retira o sistema do ar por um perodo curto de tempo, muito utilizado em situaes em que temos uma concorrncia desleal. Quem mais sofre por no corrigir este tipo de ataque so pequenas empresas de hospedagem que geralmente no tem uma poltica de defesa sobre estas situaes.

Quando fui atacado pela primeira vez, pensei que a responsabilidade de resolver o problema era do tcnico que gerenciava a hospedagem, mas com o passar do tempo compreendi melhor como funciona esta parte do PHP e conclu que somos todos responsveis, tanto ns programadores quanto os administradores de sistema. Hoje sei que no caso do Injection a responsabilidade muito mais do programador. Este texto se destina queles que j sofreram ataque de spammers e nunca tiveram tempo para entender por completo como tudo aconteceu. Aqui tentamos explicar, tanto para programadores avanados quanto para iniciantes, como e por que acontece e o que fazer para evitar um novo ataque.

1. O que ataque de carga?


Servidores esto disponveis exatamente para isto, ns servir. Sempre que um computador fica muito ocupado atendendo a diversas pessoas ao mesmo tempo dizemos que ele est carregado de trabalho. comum e importante frisar que tal carga de trabalho deve ser prevista por um tcnico que ir dimensionar as necessidades de hardware de acordo com o software e a demanda de servio que a mquina ir atender, vez por outra, como um humano que tem muito trabalho, ele est sobre-carregado, o que perfeitamente normal, um bom tcnico prev este tipo de situao. O problema que quando ficamos sobrecarregados de trabalho comeamos a ficar estressados e vez por outra cometemos erros em algumas situaes, assim tambm a operao de uma mquina sobrecarregada, especialmente por um perodo muito prolongado de prazo. Ataque de sobrecarga um tipo de ataque de DoS (Denial Of Service) que uma tcnica de conteno, pois eles fazem com que o servidor negue comunicao

2. O que SMTP e como ele funciona?


SMTP uma conveno descrita no RFC 2881. um protocolo de comunicao entre um cliente que envia email e um servidor que recebe e-mail. Um protocolo basicamente um mecanismo de troca de mensagens. como se ns padronizssemos nossa conversa e sempre que eu falo Ol voc deve responder Ol, pois assim eu vou saber que estou iniciando uma conversa com voc, no finalizando. Dizemos, ento, que temos um protocolo de comunicao, uma linguagem de comunicao em que voc entende o que eu estou falando e eu sei que voc est me escutando de maneira adequada. O protocolo SMTP descreve como um servidor de e-mail deve receber uma mensagem de e-mail. Abaixo (Figura 1) temos um exemplo de comunicao entre um cliente e um servidor. O protocolo est a partir da linha 9. Linhas como 11, 13, 21 e 38 so mensagens suplementares do programa que efetuou o envio. O SMTP est em
PHP Magazine - 3a Edio - 13

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

linhas como a linha 29, que envia o comando MAIL TO para o servidor, e na linha 31 em que o servidor responde, informando que esta de acordo em receber uma mensagem para o destinatrio informado.

50. No cabealho podemos informar diversos comandos utilizados pelo cliente para renderizar (apresentar em tela) o e-mail.A linha 51 apenas uma linha em branco. A primeira linha em branco no corpo da mensagem serve para informar o e-mail client (outlook, thunderbird, webmail) que o header finalizou e o resto do texto no corpo da mensagem a informao que deve ser encaminhada. Na linha 52, temos o e-mail que nada mais do que uma frase em texto convencional. Finalmente, na linha 53 temos o final da mensagem. Uma linha em branco com um ponto sem nenhum outro caractere aps o ponto. A linha 55 a resposta do servidor dizendo que aceita receber a mensagem e que eu posso prosseguir com o protocolo. Voc pode saber mais sobre as funcionalidades do SMTP e de Mail headers googleando na internet. Existem diversas tecnologias que esto se popularizando e que dificultam o ataque de Injection, como o SPF. Se puder ler em ingls, um bom comeo para o aprendizado buscar os RFCs, em especial o 822 que fala como uma mensagem deve ser construda para a Internet, o 2821 que fala especificamente sobre o SMTP e o 2822 que fala amplia as funcionalidades do 822, adicionando mais informaes sobre o contedo das mensagens.

Figura 1: Execuo de envio de um e-mail

Dentre estes comandos temos o comando DATA, que recebe a parte principal da mensagem, seu corpo. O comando DATA separado em diversas reas podendo ter uma forma diferente de acordo com as necessidades da mensagem. Na Figura 1 temos um exemplo do comando DATA em uma mensagem de texto proveniente do email destin@tario.com.br sendo encaminhada a partir de script@site.com.br. Entre as linhas 40 e 50 temos o cabealho da mensagem. A linha 51 uma linha em branco que separa o cabealho do e-mail e a mensagem em si. J na linha 52 temos a mensagem, que poderia se estender por diversas linhas e na linha 53 informamos que a mensagem foi finalizada. Veja que temos no cabealho diversos comandos conhecidos tambm como Headers da mensagem. Tais headers possibilitam que os softwares de envio e recepo de e-mail sejam mais prticos de serem construdos. Eles no fazem parte do protocolo SMTP, porm ampliam sua funcionalidade. Estes cabealhos implementam instrues do RFC 2882 e com tais headers o servidor pode identificar se a mensagem est sendo recebida mais de uma vez, comparando tanto sua data de criao quanto seu criador, bem como saber que deve encaminhar cpias da mensagem (BCC e CC) ou que o e-mail possui arquivos em anexo. Dentre os comandos do protocolo SMTP o mais importante o comando DATA, que recebe a parte principal da mensagem, seu corpo, ou seja, a mensagem em si. Como podemos perceber na Figura 1 o comando DATA separado em diversas reas e pode ter forma diferente de acordo com o formato da mensagem. Na linha 34 encaminhamos ao servidor a requisio de incio de envio da mensagem (Comando DATA) e na linha 36 o sistema diz estar preparado par iniciar o envio. O programa, ento, na linha 40 inicia o envio da mensagem. Esta mensagem comea com o cabealho que vai at a linha

3. O que ataque de SMTP Injection


Um SMTP Injection faz uso maligno de uma conveno benigna. Diz-se Injection quando injetamos em um cdigo extra no programa. uma tcnica de programao muito til quando utilizando comandos como eval (em PHP) que est presente na maioria das linguagens de programao modernas. De uns tempos para c esta tcnica vem sendo utilizada para a m ndole, injetando em cdigo puro de um programa instrues que o fazem agir de uma maneira indevida. popular para SQL, Javascript, graas ao AJAX, e SMTP. Cada uma destas funes tem diversas variaes, mas basicamente a funo principal dar dor de cabea ao administrador do sistema. Lembra de nossa Figura 1? Ela apresenta uma mensagem convencional que segundo a linha 49 est sendo entregue para destin@tario.com em um ataque de SMTP Injection. O atacante adicionaria diversas instrues no sistema como os comandos com cpia para (CC:) e qualquer outro comando que possa ser processado pelo header da mensagem. Isto permitido pelo PHP, pois ele utiliza o programa de envio de email do shell para encaminhar a mensagem. Segundo a estrutura de cdigo da funo mail do PHP, qualquer instrues repassada no parmetro body da funo se transformar em texto da mensagem. Os demais parmetros so utilizados para controlar a mensagem, ou seja, se adicionarmos um texto como BCC na instruo TO, ela ser processada normalmente quando o PHP encaminhar esta instruo ao shell do sistema operacional. Para fazer um exemplo imagine que nossa Figura 1 foi encaminhada no formulrio da Figura2 abaixo. Este tipo de formulrio um prato cheio para o atacante, no precisa nem estar no domnio da vtima, desde que este-

14 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

ja na mesma rede e utilize os mesmos recursos da vtima. Ele deixa todos os campos, o De (From), o Para (To) e o Assunto (Subject) abertos para que o atacante possa escrever qualquer coisa. A ilustrao abaixo est com os campos preenchidos com o contedo utilizado para gerar a transmisso relatada na Figura 1, porm se no campo De colocarmos a seguinte seqncia de caracteres ha-

xor@attack.com%0ASubject:Mwahahaha% 0ABcc:target@nothappy.com%0AContentType:multipart/mixed;%20boundary=frog;%0Afrog% 0A C o nt e nt - Typ e :t e x t / ht m l % 0A % 0A <u >H TM L% 20Message.</u>%0A%0Afrog%0AContent-Type:text/ html;name=Security.html;%0AContent-TransferEncoding:8bit%0AContent-Disposition:attachment%0A% 0A<u>HTML%20File</u>%0A%0A--frog--%0A estes


caracteres iro para o corpo da mensagem gerando uma transmisso que est disponvel na Figura 3. Agora observaremos as linhas. Entre as linhas 40 e 57 vemos que existem comandos extras como To (Linha 53) e BCC (linha 55) que vai encaminhar a mensagem para outros destinatrios alm do inicial (linha 49). O caractere representado pela seqncia %0A est em hexadecimal e, depois que o PHP processa esta linha, ele transforma este valor em um caractere vlido de nova linha (enter, ou new line, ou ainda line feed), fazendo com que tudo o que est escrito aps esta seqncia seja interpretada como nova linha. por isto que na Figura 3 o haxor@attack.com est em uma linha e o Subject est em outra. Como o PHP no restringe o que est sendo passado para o shell na linha de comando, podemos passar o que desejarmos nestes campos, desde que coloquemos o que se espera do campo por primeiro. Por exemplo: no caso do nome colocamos qualquer palavra, no caso do e-mail colocamos um endereo de e-mail e no campo assunto colocamos qualquer palavra. O PHP simplesmente ir receber o valor e repass-lo para a linha de comando e qualquer caractere especial que queira utilizar como o tab, basta pass-lo como hexadecimal. Esta implementao do PHP foi criada dessa forma para que o programador pudesse ter maior liberdade ao utilizar as funcionalidades de protocolos disponveis como instrues para clientes de e-mail. De certa forma isto faz com que o SMTP Injection possa ser visto tambm como um exploit do PHP, posto que uma explorao de uma suposta falha no sistema. Como no uma falha, mas uma forma indevida de utilizar a funo mail do PHP, um SMTP Injection no se qualifica exatamente como um exploit, porm tem o mesmo princpio. SMTP Injection o mtodo preferido de spammers para encaminhar e-mails contendo vrus, mesmo que a vtima (o servidor que est processando as requisies) possua mecanismos como SPF, eles sero vistos como emails dignos e recebidos por outros sistemas como mensagens verdadeiras.
Figura 3: Mensagem com comandos injetados Figura 2: Formulrio de envio de e-mail

Em minha opinio, ataque de SMPT Injection uma das piores pragas que ocorrem no mundo digital. Ao iniciar um ataque de SMTP Injection, a vtima passa a mandar diversas mensagens indesejadas (spams) e, um tempo depois, servidores passam a interpret-lo como spammer. Tais tipos de spammer muitas vezes levam semanas para serem retirados. Existem outras utilidades para um ataque de SMTP

Injection, como por exemplo denegrir a marca e a imagem da vtima ou encaminhar vrus que podem ser repassados por texto o atacante pode unir instrues repassadas no campo De com instrues repassadas no campo Mensagem em nosso formulrio da Figura 2 e encaminhar o arquivo executvel apenas transformandoo em hexadecimal, como o new line da Figura 3. Porm, nosso tema o ataque de carga ento vamos continuar com o assunto.

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 15

4. Como executar o ataque em massa


Para efetuarmos um ataque de carga, utilizamos um programa para executar. muito mais efetivo para encaminhar centenas ou milhares de mensagens do que ficar preenchendo repetidamente o formulrio atacado. Porm, alm de utilizarmos um sistema automatizado de ataque, o mais indicado adicionarmos no comando instrues de CC e BCC que encaminhem a mensagem para outras redes, de forma a forar o servidor a se conectar com o maior nmero possvel de outros servidores, mantendo-o ocupado o suficiente para negar a incluso de mais mensagens na fila de entrega. Atulamente, estes programas so bem simples de serem confeccionados. O prprio PHP dispe de diversas metodologias para construir um sistema eficiente de ataque com bibliotecas como a clib e a prpria funo fopen. E para efetuar a funo de lotar a fila, basta que tais programas fiquem em execuo postando o contedo do formulrio para o script que deve receber tais informaes. No precisamos nem passar pelo formulrio e pela sua checagem em Javascript, basta postar as informaes. Para evitar que o sistema seja identificado pelo administrador, podemos ainda fazer um ataque distribudo a partir de trs ou quatro mquinas, enchendo rapidamente a fila trs ou quatro vezes mais rpido.

Figura 5: Exemplo de checagem de cdigo com a funo strpos

6. Como evitar por meio de administrao do servidor


Segundo Juliano Simes, Gerente de Tecnologia do Central Server, existem duas abordagens disponveis ao administrador para reduzir o risco de ocorrncia de SMTP Injection no servidor: uma pr-ativa e outra reativa. As principais aes pr-ativas envolvem conscientizar os programadores sobre o problema, divulgar as formas de proteo de cdigo disponveis e auditar os scripts instalados nos websites. Para a auditoria, o recomendvel automatizar o processo com a criao de programas que faam uma varredura dos scripts procura de vulnerabilidades. Este processo tanto mais difcil quanto mais heterogneas forem as tcnicas de programao. Isto , se a equipe de programao conhecida, possvel definir mdulos ou funes especficos que devem estar presentes nos scripts que enviam e-mail para impedir o ataque. Caso algum script seja publicado sem estes cdigos, a auditoria acusar o problema. Quando a equipe e os padres de programao so desconhecidos do administrador, como ocorre em um provedor de hospedagem web, a auditoria precisa ser mais generalista e buscar padres de cdigos vulnerveis, como scripts que no filtram a presena de CRLF nas variveis que formam o header dos e-mails. Uma vez encontradas as falhas de programao, os desenvolvedores responsveis devem ser notificados e orientados sobre as solues para o problema. Conforme explicado por Simes, como as aes prativas no garantem 100% de eficcia, necessrio que a equipe de suporte esteja preparada para responder reativamente a um ataque de SMTP Injection no menor tempo possvel. Para isto, o monitoramento 7x24 da fila de sada e dos logs do servio SMTP fundamental. Uma variao abrupta em parmetros como o nmero de e-mails enviados por um mesmo remetente e a taxa de rejeio das mensagens transmitidas pelo servidor so indcios da realizao do ataque. Quando isto ocorre,

5. Como evitar por meio de scripts


Para evitar por meio de cdigo muito simples, basta fazermos o que o PHP sugere que faamos: filtrar o que recebemos de cada um dos campos disponveis para preenchimento no formulrio. Basta verificar se um deles colocou caracteres como o 0x0A, ou 0x0D, ou ainda 0x09, ou se colocou mais de uma vez o caractere @ (0x40). Se isto ocorrer, ento, voc est sendo atacado. Voc no precisa, por exemplo, verificar o que est sendo includo no campo da mensagem, se o atacante estiver utilizando esta parte do formulrio, ele certamente ter que utilizar o outro campo para injetar o incio das instrues que ele pretende utilizar. Sendo assim, o campo da mensagem pode ser poupado de verificao, se voc verificar os campos De e Para. A Figura 4 apresenta um exemplo de como verificar se o $_POST contm instrues que indicam um ataque por meio de expresses regulares, e a Figura 5 apresenta a mesma seqncia por meio do strpos.

Figura 4: Exemplo de checagem de cdigo com a funo preg_match

16 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

cabe aos administradores do servio verificar a natureza das mensagens e, se confirmado o problema, suspender a operao do site vulnervel at que a devida correo seja implementada.

7. Consideraes finais
Para a boa preveno contra um ataque de SMTP

de hospedagem, entretanto, este hospedeiro no possui SPF. Outro script que est hospedado em outro datacenter pode encaminhar seus e-mails e seu cliente ainda pode receber diversas reclamaes comentando que seu domnio est sendo atacado, quando na verdade quem est sofrendo SMTP Injection outro hospedeiro.

Injection, o ideal a juno de um bom programador


com um projeto bem elaborado que seja hospedado em um data-center srio e com processos de monitoramento. Muitas vezes o programador se esfora para ter um bom cdigo e acaba hospedando seu sistema em uma mquina compartilhada que contm scripts que possibilitam ataques e que permitam que outro domnio encaminhe um e-mail no nome de outro domnio. Algo tambm importante a utilizao de SPF (Sender Policy Framework) no servidor. SPF uma poltica de regras do DNS para evitar que outros domnios enviem e-mails em seu nome. Muitas vezes voc tomou todos os cuidados para ter scripts seguros e est hospedando em um servidor que possui diversas boas praticas

Referncias e links sugeridos


[RFC 822] http://www.faqs.org/rfcs/rfc822.html [RFC 2821] - http://www.faqs.org/rfcs/rfc2821.html [RFC 2822] - http://www.faqs.org/rfcs/rfc2821.html [RFC 4408] - http://www.faqs.org/rfcs/rfc4408.html [manual PHP] -http://br2.php.net/manual/en/ ref.mail.php [Descrio de SPF no Wikipedia com link para a pgina oficial] - http://pt.wikipedia.org/wiki/Spf

Ricardo Striquer Soares - ricardo@ideiaspontual.com Tcnico em processamento de dados com mais de 15 anos de experincia. Autor de diversos softwares, tanto desktop quanto webbased, h cinco anos Ricardo empresrio do ramo de tecnologia, sendo um dos scios da empresa Idias.ual (http://www.ideiaspontual.com/), participando e gerenciando vrios projetos de desenvolvimento, instalao, configurao e integrao de sistemas. Ricardo mantm uma publicao peridica no blog programabrasil.blogspot.com.

Edies Anteriores
Faa o download das trs edies anteriores.

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 17

PHP-GTK
por Pablo DallOglio

Gerando planilhas em Excel com

PHP PHP-GTK
Neste artigo iremos construir uma ferramenta para lanamento de despesas financeiras cujo objetivo criar uma planilha no formato Excel.
O PHP uma linguagem incrvel em relao quantidade de bibliotecas de terceiros que gravitam em torno de sua rbita. Temos bibliotecas para os mais variados fins, como envio de emails, manipulao de imagens, gerao de documentos PDF, dentre outros. O PHP possui um grande repositrio de classes chamado PEAR (PHP Extension and Application Repository), como muitos de vocs j devem saber. Este grande repositrio orientado a objeto constantemente fruto de artigos em revistas e sites sobre PHP. Neste artigo em especfico, vamos provar que podemos utilizar praticamente qualquer bibliteca comumente utilizada no ambiente Web no PHP-GTK. Para isso, escolhemos a biblioteca Spreadsheet Excel Writer, que um pacote responsvel pela gerao de arquivos em formato Excel. Para mostrar seu funcionamento em conjunto com o PHPGTK, iremos construir um programa para lanamentos de despesas, que ir inserindo estes lanamentos em uma listagem para posterior gerao do arquivo em formato Excel. View o fato dela implementar o padro MVC (Model, View, Controller), ou seja, a separao entre os dados e a forma pela qual estes so exibidos em tela. Os dados, sejam eles nmeros, textos ou imagens so armazenados em um modelo, que pode ser GtkListStore (para armazenar listas) ou GtkTreeStore (para armazenar rvores). O modelo de dados , ento, atribudo a alguma visualizao (GtkTreeView). Sempre que o modelo de dados alterado, automaticamente sua exibio atualizada em tela, por sua visualizao (GtkTreeView). A camada Controller contm objetos que capturam aes derivadas de interao do usurio, coordenando assim, objetos das camadas Model e View para fornecer a resposta adequada ao usurio.

2. Spreadsheet Excel Writer


Como dissemos anteriormente, a biblioteca Spreadsheet Excel Writer permite a criao de planilhas no formato Excel. Ela suporta frmulas, imagens e formatao de textos e clulas. Assim como toda biblioteca que faz parte do PEAR, a SpreadSheet Excel Writer deve ser instalada atravs do seguinte comando:
#pear install SpreadSheet_Excel_Writer-0.9.1

1. Listas e rvores
Listas e rvores no PHP-GTK so implementados atravs da classe GtkTreeView, que pode ser utilizada para exibir tanto rvores quanto listas.

Aps isto, os seus arquivos devem ser disponibilizados dentro da pasta lib de sua instalao do PHP.

3. O programa
Para comear, iremos estender a classe GtkWindow e criar toda a interface em seu mtodo construtor. A nossa janela de lanamentos ter basicamente uma caixa vertical (GtkVBox) contendo uma srie de caixas horizontais (GtkHBox). Em cada caixa horizontal, teremos um par de rtulos (GtkLabel) e um campo de entrada de dados (GtkEntry). Ao final, criamos um boto adicionar (STOCK_ADD), cujo objetivo coletar os dados digitados pelo usurio nestes campos e adicionar em uma listagem (objeto GtkTreeView). Este boto est conectado ao mtodo onAddLinha

Figura 1 Componente GtkTreeView

O conceito mais importante por trs de uma GtkTree-

18 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

(). Isto significa que sempre que o boto for clicado, este mtodo ser executado. Tambm temos um boto de salvar (STOCK_SAVE), cujo objetivo coletar todos os lanamentos da listagem e gerar a planilha Excel a partir deles. Neste mtodo construtor, ainda definimos os tamanhos dos campos por meio do mtodo set_size_request() e executamos o mtodo createTreeView(), cuja responsabilidade declarar nossa listagem de lanamentos e suas respectivas colunas. Vrios pontos deste programa foram suprimidos em virtude do espao aqui reduzido, mas podero ser encontrados no site indicado ao final do artigo.
<?php /* * Exportar Excel * Planilha de gastos com exportao de excel * Adianti Solutions (www.adianti.com.br) */ class ExportarExcel extends GtkWindow { // apresentao dos dados private $list; private $model; // modelo de dados private private private private $descricao; $data; $valor; $operacao; // // // // campo campo campo campo de de de de descrio data valor operao

$hbox2->pack_start($label2, false, false); ... // adiciona os campos em suas caixas $hbox1->pack_start($this->descricao...); $hbox2->pack_start($this->data...); $hbox3->pack_start($this->valor...); $hbox4->pack_start($this->operacao...); // adiciona as caixas na caixa vertical $vbox->pack_start($hbox1, false, false); $vbox->pack_start($hbox2, false, false); ... // cria um boto de adicionar $button = GtkButton::new_from_stock(Gtk::STOCK_ADD); // define a ao do boto $button->connect_simple('clicked', array($this, 'onAddLinha')); // cria o objeto TreeView $this->createTreeView(); // adiciona o TreeView na caixa vertical $vbox->pack_start($this->list); // cria um boto de salvar $button = GtkButton::new_from_stock(Gtk::STOCK_SAVE) // define a ao do boto $button->connect_simple('clicked', array($this, 'onExportar')); // adiciona a caixa vertical na janela parent::add($vbox); }

/* * Mtodo construtor * Instancia a janela e cria toda interface */ function __construct() { // cria a janela parent::__construct(); parent::set_border_width(4); parent::set_size_request(470,300); // cria uma caixa vertical $vbox = new GtkVBox; // cria rtulos de texto $label1 = new GtkLabel('Descrio : '); $label2 = new GtkLabel('Data: '); ... // define o tamanho dos rtulos $label1->set_size_request(200,-1); $label2->set_size_request(200,-1); ... // cria os campos de entrada de dados $this->descricao = new GtkEntry; $this->data = new GtkEntry; $this->valor = new GtkEntry; $this->operacao = new GtkEntry; // define os tamanhos dos campos $this->descricao->set_size_request(240... $this->data->set_size_request(80,-1); ... // cria caixas horizontais $hbox1 = new GtkHBox; $hbox2 = new GtkHBox; $hbox3 = new GtkHBox; $hbox4 = new GtkHBox; // adiciona os labels em suas caixas $hbox1->pack_start($label1, false, false);

O mtodo createTreeView() ser executado a partir do mtodo construtor e seu objetivo instanciar o objeto GtkTreeView, para implementar a listagem de lanamentos. Esta listagem armazenar os dados em um objeto GtkListStore (propriedade list), que ter quatro colunas do tipo string.
function createTreeView() { // instancia treeview $this->list = new GtkTreeView; // cria modelo $this->model = new GtkListStore( Gtk::TYPE_STRING, Gtk::TYPE_STRING...); // define o modelo da treview $this->list->set_model($this->model); // cria quatro colunas $column1 = new GtkTreeViewColumn('Desc.'); $column2 = new GtkTreeViewColumn('Data'); ... // define as larguras $cell_renderer1->set_property('width'...); $cell_renderer2->set_property('width'...); ... // adiciona as colunas na lista $this->list->append_column($column1); $this->list->append_column($column2); ... }

Sempre que o usurio clicar no boto Adicionar, o mtodo onAddLinha() ser executado. O objetivo deste mtodo obter os valores digitados pelo usurio nos
PHP Magazine - 3a Edio - 19

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

campos de entrada de dados que so armazenados em propriedades deste objeto (descrio, data), atravs do mtodo get_text() da classe GtkEntry. Quando obtemos os valores destas variveis, adicionamos eles ao modelo de dados da listagem (GtkTreeView) atravs do mtodo append(), passando um array com o contedo da linha. Posteriormente, limpamos os contedos dos campos com o mtodo set_text ('') e posicionamos o foco do cursor no campo para descrio.
function onAddLinha() { // obtm os valores digitados pelo usurio $descricao = $this->descricao->get_text(); $data = $this->data->get_text(); $valor = $this->valor->get_text(); $operacao = $this->operacao->get_text(); // adiciona na lista $this->model->append(array($descricao, $data, $valor, $operacao)); // limpa os contedos digitados $this->descricao->set_text(''); $this->data->set_text(''); ... // posiciona o foco no campo descrio parent::set_focus($this->descricao); }

O funcionamento desta classe bastante simples. Primeiro definimos um conjunto de estilos a serem utilizados para as clulas. Cada estilo define caractersticas como tamanho, cor e fonte. Posteriormente, utilizamos estes estilos pelo mtodo write().
// define um formato para o ttulo $titleFormat = $xls->addFormat(); $titleFormat->setFontFamily('Helvetica'); $titleFormat->setSize('14'); $titleFormat->setColor('black'); ... // define um formato para as colunas $columnFormat = $xls->addFormat(); $columnFormat->setFontFamily('Helvetica'); $columnFormat->setSize('12'); $columnFormat->setColor('black'); ... // define um formato para os dados $dataFormat = $xls->addFormat(); $dataFormat->setFontFamily('Courier'); $dataFormat->setSize('12'); $dataFormat->setColor('black'); ...

Aps definirmos alguns estilos, utilizamos o mtodo addWorkSheet() para criar uma aba, ou uma planilha de trabalho dentro do nosso arquivo. Veja na parte inferior da figura 3, o nome PHP Magazine. Aps isto, escrevemos os cabealhos da planilha atravs do mtodo write(), indicando o endereo de cada clula, atravs de coordenadas linha e coluna.
// Adiciona uma aba planilha $sheet = $xls->addWorksheet('PHP Magazine'); // escreve nas clulas (linha, coluna) $sheet->write(0,1,'Caixa', $titleFormat); $sheet->write(1,0,'Descrio'...); $sheet->write(1,1,'Data', $columnFormat); $sheet->write(1,2,'Valor'...); $sheet->write(1,3,'Operao'...);

O mtodo onExportar() ser executado sempre que o usurio clicar no boto Salvar. O primeiro passo incluir a biblioteca SpreadSheet Excel Writer para disponibilizar esta classe para a aplicao. Aps, abrimos um dilogo de salvar arquivos para coletar o nome e o caminho onde o usurio deseja salvar a planilha.
function onExportar() { // inclui a biblioteca SpreadsheetWriter require_once "Spreadsheet/Excel/Writer...' // abre um dilogo de salvar arquivo $dialog = new GtkFileChooserDialog...; // exibe dilogo $response = $dialog->run(); // Verifica resposta do usurio if ($response == Gtk::RESPONSE_OK) { // obtm o nome do arquivo $filename = $dialog->get_filename(); } // destri dilogo $dialog->destroy();

Depois de escrevermos os cabealhos da planilha, percorremos os dados da listagem (objeto GtkTreeView), coletamos clula a clula, atravs do mtodo get_value() e escrevemos estes valores dentro da planilha atravs do mtodo write().
// percorre o modelo de dados $i = 2; $iter = $this->model->get_iter_first(); while ($iter) { // obtm os valores do modelo de dados ... $valor = $this->model->get_value($iter, 2); $operacao = $this->model->get_value($iter, 3); // escreve os dados na planilha $sheet->write($i,2,$valor...); $sheet->write($i,3,$operacao...); // pega o prximo iterador

Depois de coletar o nome do arquivo, instanciamos um objeto da classe Spreadsheet_Excel_Writer, responsvel por fornecer os mtodos que nos permitem gerar as planilhas em formato Excel.
// cria uma planilha Excel $xls = new Spreadsheet_Excel_Writer ($filename);

20 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

$iter = $this->model->iter_next($iter); $i ++; }

Consideraes finais
Neste artigo, com menos de 300 linhas de cdigo, escrevemos um simples programa para lanamentos financeiros com gerao de planilhas Excel em PHP-GTK. Como o programa ficou um pouco grande para o formato da revista, optamos por cortar alguns pedaos, substituindo-os por ... por motivos didticos. Voc pode fazer download da aplicao completa no site da pSheet, em http://psheet.php-gtk.com.br

Ao final, fechamos o objeto planilha e abrimos um dilogo de sucesso com a mensagem Planilha Gerada!!
// fecha a planilha $xls->close(); // abre um dilogo de mensagem de sucesso $dialog = new GtkMessageDialog (...'Planilha gerada !!'); $response = $dialog->run(); // fecha o dilogo $dialog->destroy(); } }

Referncias e links sugeridos


[PHP-GTK Brasil] http://www.php-gtk.com.br [Livro PHP-GTK] http://www.php-gtk.com.br/book [Site do Autor] http://www.pablo.blog.br [Site da Planilha] http://psheet.php-gtk.com.br [Site do PEAR] http://pear.php.net

Aqui onde comea o nosso programa na verdade, a classe ExportaExcel instanciada


// instancia a classe ExportaExcel $janela = new ExportarExcel; $janela->show_all(); Gtk::Main(); ?>

Aqui voc confere a tela principal do nosso software de controle de lanamentos financeiros.

Pablo Dall'Oglio - pablo@dalloglio.net Pablo Dall'Oglio formado em Anlise de Sistemas pela UNISINOS. Autor do livro sobre PHP-GTK pela Novatec Editora. Programa em PHP-GTK desde sua criao em 2001. membro do time de documentao e criador da comunidade brasileira de PHP-GTK (www.php-gtk.com.br). Atualmente, diretor de tecnologia e proprietrio da Adianti Solutions (www.adianti.com.br), onde atua como consultor de tecnologia e engenheiro de software. Pode ser contatado pelo e-mail pablo@php.net.

Figura 2 Tela do gerador de planilhas

Nesta tela seguinte, voc confere a planilha eletrnica gerada no formato Excel.

Figura 3 Planilha gerada

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 21

AJAX
por Rafael Dohms

AJAX e PHP I:

Conhecendo AJAX
Neste artigo, pretendo apresentar ao leitor a tecnologia AJAX, resolvendo algumas confuses sobre o que realmente , e como e onde deve ser usada. Este artigo apresenta um exemplo de como implementar uma soluo AJAX sem auxlio de Frameworks.
Aps palestrar sobre o assunto no 1 PHPDF RoadShow, senti-me motivado a, finalmente, fazer minha contribuio para esta revista e, com isso, nasceu este artigo, um primeiro passo que ajudar todos a dar uma espiada no universo AJAX, sem se sentir totalmente perdido. Desde que comecei a pesquisar sobre AJAX devo admitir que me apaixonei pela forma que ele permite executar tarefas simples e avanadas de maneira amigvel, simples e gil. Desde ento, tenho procurado repassar este contedo, contribuindo brevemente com o site AJAX Online (www.ajaxonline.com.br) e publicando diversos artigos em meu blog pessoal. na prtica possvel utilizar objetos com notao JSON (JavaScript Object Notation) tambm, ao invs de XML. Mais adiante vou discutir as vantagens e desvantagens disto. O grande conceito de AJAX permitir que o cliente se comunique com o servidor atravs deste request, que realizado em segundo plano, sem recarregar a pgina, efetivamente unindo a tecnologia client-side com a tecnologia server-side e potencializando a comunicao.

Ateno: use com moderao! Embora seja algo muito legal, o AJAX no deve ser usado em qualquer lugar, pois, ao invs de ajudar, pode tornar truncada a experincia do usurio, evite usar AJAX, por exemplo, como sua forma de navegao principal.

1. AJAX: detergente ou tecnologia?


O caminho para o aprendizado de AJAX no muito longo, mas mesmo assim possui diversos atalhos que podem agilizar no desenvolvimento, porm podem acabar saindo pela culatra mais tarde, pois prejudicam o conhecimento. O primeiro passo e tambm o ponto de maior confuso, a velha pergunta: O que AJAX?. Leigos lhe diro que um detergente, alguns diro que uma nova linguagem de programao, eu lhes digo que se trata apenas de uma nova forma de ver algo mais antigo. O AJAX um conjunto de tcnicas novas, envolvendo diversas tecnologias antigas, dentre elas: Javascript, XML, Document Object Model (DOM). Dentre estas tecnologias o nico elemento novo o XMLHttpRequest, e mesmo assim ele no to novo quanto parece. O XMLHttpRequest surgiu pela primeira vez em 2000, criado pela Microsoft para ser usado no Outlook Web Access. Em 2002, a Mozilla incorporou o objeto em seus browsers e somente em 2006 foi lanado o primeiro draft na W3C. Neste ponto d inicio o grande hype da Web 2.0 e o AJAX comea a ser amplamente utilizado. Conceitualmente, AJAX significa Asynchronous JavaScript and XML ou Javascript Assncrono e XML, mas

Figura 1 Fluxo de uma requisio AJAX

2. Aprendendo AJAX
Como disse anteriormente, o caminho para aprender AJAX tem diversos atalhos e, no momento em que se decide aprender AJAX, necessrio avaliar qual caminho ir tomar. Existem dois caminhos principais para se trilhar, aprender AJAX com frameworks ou sem frameworks. Cada um tem sua vantagem como, por exemplo, com frameworks a produtividade aumenta, porm, sem ter trilhado o caminho primitivo, dar manuteno em scripts que apresentam erros pode se tornar uma tarefa difcil. Eu, pessoalmente, defendo que se deve aprender pelo caminho difcil para depois viver no caminho fcil, ento vou abordar as duas formas de se usar e aprender AJAX, iniciando neste artigo pelo AJAX puro, ou seja, primitivo, e deixando o segundo exemplo para uma futu-

22 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

ra contribuio.

anteriores sem respostas, como em campos de autocomplete. SetRequestHeader(label, value): este mtodo importante quando POST utilizado, permitindo setar o contedo da requisio para multipart/formdata, por exemplo. Uma falha neste ponto pode derrubar toda a requisio. GetResponseHeader(headername) e getAllResponseHeaders(): estes mtodos so teis em verificaes de segurana que permitem, por exemplo, verificar se o contedo da resposta realmente est em JSON ou XML. Para entender como usar este objeto e como devemos manipular seus mtodos e propriedades, a seguir, definirei um exemplo simples de uma aplicao que pode utilizar AJAX, e acompanharei passo a passo com vocs a implementao.

2.1. AJAX primitivo


Implementar funes de AJAX na mo no tarefa difcil, ao contrario do que muitos pensam, porm importante, antes de mais nada, entender como funciona o objeto XMLHttpRequest. O Request simula o funcionamento do browser. Neste ltimo, quando se clica em um link, feita uma requisio para determinado arquivo e o resultado desta requisio apresentado na tela do browser. No AJAX, essa requisio feita da mesma forma, porm o resultado no se carrega na janela e sim dentro do prprio objeto de request, isso causa o efeito de segundo plano que o AJAX apresenta. Para isso, o objeto possui alguns mtodos e propriedades importantes. Primeiro as propriedades: ReadyState: estado atual da requisio, indica se a pgina ainda est sendo buscada ou se o resultado j chegou. Pode possui estes estados: 0 = uninitialized (no inicializado) 1 = loading (carregando) 2 = loaded (carregado) 3 = interactive (interagindo) 4 = complete (pronto) ResponseText: resultado da requisio em formato de texto comum, usado tambm para JSON. ResponseXML: resultado em formato XML. Status: Cdigos 200,404,403 etc. de erro ou sucesso como:

3. Desenvolvendo um mural de recados com AJAX


O sistema proposto bem simples, justamente para facilitar o entendimento do AJAX e no se focar em outros aspectos. De forma geral, o sistema deve possuir uma regio onde apresenta as mensagens, o mural, e um campo que permita a algum digitar algo, sendo isto inserido no mural sem haver um re-carregamento da pgina como um todo.

3.1 Modelagem
O primeiro passo de um sistema deve ser sempre a modelagem, utilizando UML ou outras formas de modelagem, porm, como este no nosso foco, farei apenas uma modelagem simples para compreenso do sistema. O sistema contar com duas funcionalidades: adio e visualizao de imagens. Portanto a figura 2 apresenta o fluxo dos dados e eventos do momento que o usurio envia seu recado at ele aparecer no mural (por motivos de simplicidade, ao recarregar a pgina, as mensagens no so recarregadas no mural). Separei o sistema em trs mdulos: javascript (verde), HTML (amarelo) e PHP (azul), para podermos ver a interao entre essas linguagens. No mdulo de javascript, ser realizada toda a operao de AJAX propriamente dita, como demonstrado na figura acima. Para isso, devemos criar 3 funes: uma para criar o request, uma para enviar a mensagem e outra para receber o retorno e publicar no mural. No PHP precisamos de duas funes: uma que receba os dados e grave no banco e outra que formate o retorno e envie de volta para o javascript. Neste caso, estamos usando XML, mas o uso de JSON ser demonstrado em futuros artigos. A estrutura do retorno XML proposta a seguinte:
<?xml version="1.0" encoding="iso-8859-1" ?> <response>

StatusText: mesmo erro, mas de forma textual (Not found). Onreadystatechange: propriedade/evento, indica a funo que ser executada quando a requisio mudar seu readyState Para executar seu papel, o objeto conta tambm com alguns mtodos: Open ("method", "URL", async, "uname", "pswd"): este mtodo abre uma nova requisio para a URL determinada com o mtodo escolhido (GET ou POST). Esta requisio pode ser sncrona ou assncrona, determinando se o cdigo continua sendo executado independente da resposta ou se a resposta aguardada para continuar o processamento. Send(content): este mtodo inicia a comunicao com a URL e recebe apenas o parmetro (opcional) de que contedo deve enviar. Este contedo est em formato de URL, ou seja, var=valor&var2=valor2. Abort(): este mtodo simples e pode ser muito importante, pois finaliza uma requisio que ainda no retornou qualquer resposta do servidor. til em casos onde novas requisies podem ocorrer descartando as

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 23

<erro>0/1</erro> <item id="1">Retorno em HTML ou Texto</item> </response>

CREATE TABLE `mural` ( `id` int(3) NOT NULL auto_increment, `msg` text character set latin1 collate latin1_general_ci, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

3.2 Mdulo Javascript


A primeira funo que precisamos a funo responsvel por criar o request de XMLHTTPRequest, mas por que fazer uma funo? Simples. Como o IE implementa o objeto de forma diferente de outros browsers, implementamos estes diferentes mtodos em uma funo, com isso a instanciao do objeto se torna algo mais simples e pontual. Veja o cdigo:
function criaRequest(){ try { request = new XMLHttpRequest(); } catch (trymicrosoft) { try { request = new ActiveXObject ("Msxml2.XMLHTTP"); } catch (othermicrosoft) { try { request = new ActiveXObject ("Microsoft.XMLHTTP"); } catch (failed) { request = false; } } } if (!request) alert("Error initializing XMLHttpRequest!"); else return request; }

Figura 2 - Fluxo do exemplo

No HTML teremos apenas um campo de input, um boto e um div que representa o mural. A figura 3 demonstra como as funes interagem entre sim, de forma simplificada. Escolhi separar o sistema em 3 arquivos, onde cada um representa um dos mdulos acima descritos.

Agora devemos definir a funo que vai enviar estes dados. Esta funo deve chamar a funo anterior para obter um request e, ento, iniciar seu processamento. O prximo passo buscar o texto do campo e montar a requisio. Usaremos o mtodo POST e, com isso, devemos definir o header de Content-Type, passando o texto do campo com o nome de varivel msg. Neste momento, tambm importante definirmos a funo que ser executada ao final da requisio, usando o onreadystatechange. Para dar um efeito a mais neste momento, tornamos visvel um DIV com o texto Carregando... para que o usurio possa saber que algo est acontecendo.
function enviaDados(){ //Novo Request linkReq = criaRequest();

Figura 3 - Interao das funes

A tabela onde os dados sero guardados pode ser criada com este cdigo:

if(linkReq != undefined){ //Pegar dados var msgBox = document.getElementById ('msgBox'); //Montar requisio

24 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

linkReq.open ("POST","mural.ajax.php",true); linkReq.setRequestHeader('ContentType', 'application/x-www-form-urlencoded'); linkReq.onreadystatechange = recebeDados; var params = "msg="+msgBox.value;

//Remove loading document.getElementById ('loading').style.display = 'none'; } } }

3.3 Mdulo PHP


//Carregar DIV de "loading" document.getElementById ('loading').style.display = 'block'; //Enviar linkReq.send(params); //Esvaziar form msgBox.value = ""; } }

Este mdulo simples e, na verdade, pode ser substitudo por qualquer linguagem server-side. Como uma requisio AJAX nada mais do que uma requisio normal feita em segundo plano, o nosso arquivo PHP trabalha como qualquer outro script, recebendo dados, processando e retornando, sendo a nica diferena que vamos retornar XML e no HTML. Ao invs de criar duas funes como defini anteriormente, vou apenas implementar um script de forma estruturada que execute as aes das duas funes. A primeira parte deve receber os dados e gravar em banco. Utilizei neste exemplo um banco mysql e as funes normais de mysql para no complicar muito o aprendizado. A segunda parte deve pegar os mesmos dados e convert-los em uma sada XML, de acordo com o padro que escolhemos.
<?php //Conexo com banco $db = mysql_connect ("localhost","user","senha"); $db_selected = mysql_select_db('phpajax', $db); //Simular processo demorado para vermos o carregando (descartar em produo) sleep(3); //Receber dados //Gravar no banco $sql = "INSERT INTO mural (msg) VALUES ('".$_POST['msg']."')"; $res = mysql_query($sql); //XML de Retorno $xmlDoc = new DOMDocument('1.0','iso-8859-1'); $response = $xmlDoc->createElement ('response'); $response = $xmlDoc->appendChild($response); //Elemento de erro $erro = $xmlDoc->createElement('erro',($res)? "0":"1"); $erro = $response->appendChild($erro); //Elemento item $item = $xmlDoc->createElement('item',$_POST ['msg']); $item->setAttribute('id',mysql_insert_id()); $item = $response->appendChild($item); header('Content-Type: application/xml'); echo $xmlDoc->saveXML(); //Teste Manual

Definimos a funo recebeDados como o retorno do request, mas ela ser chamada a cada alterao de estado. Portanto, precisamos verificar o novo estado para sabermos se o resultado final j foi retornado. Uma vez confirmado o estado 4, podemos tratar o retorno. Para isso, como foi definido o retorno em XML, leremos os dados da varivel responseXML, lendo os campos atravs de DOM e inserido este retorno no DIV, dentro de uma DIV prpria da mensagem. Esta manipulao toda feita atravs de DOM com funes que esto disponveis desde o incio dos browsers.
function recebeDados(){ //Verificar pelo estado "4" de pronto if (linkReq.readyState == '4'){

//Pegar dados da resposta XML var xmlRes = linkReq.responseXML; //Verificar erro var erro = xmlRes.getElementsByTagName('erro'); if (erro[0].firstChild.nodeValue == '1'){ alert("Erro no retorno"+erro [0].firstChild.nodeValue); }else{ //Pegar mensagem var msg = xmlRes.getElementsByTagName('item'); //Pegar DIV destino var targetDiv = document.getElementById('msgList'); //Montar Nova msg var mDiv = document.createElement('div'); mDiv.id = "msg_"+msg[0].id; mDiv.innerHTML = msg [0].firstChild.nodeValue; //Adicionar ao destino targetDiv.appendChild(mDiv);

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 25

?>

http://www.rafaeldohms.com.br/cursos/php_ajax/ pratica1/mural.php E faa download do cdigo fonte neste endereo: http://www.rafaeldohms.com.br/cursos/php_ajax/ php_ajax_pratica1.zip Este exemplo como eu disse, apenas apresenta os dados uma vez enviados, e no os mostra novamente quando a pgina re-carregada.

3.4 Mdulo HTML


Como descrito vrias vezes, este simples arquivo tem um DIV de carregando, um DIV que ser o Mural e um campo de input com boto, sem o uso de um form, pois os dados so obtidos diretamente pela funo enviaDados.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/ html; charset=iso-8859-1" /> <script src="mural.funcs.js" language="javascript"></script> <title>Untitled Document</title> <link href="style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="form"> <textarea id="msgBox" rows="3" cols="10"></ textarea> <input type="button" value="Enviar" onclick="enviaDados();" /> </div> <div id="loading">Carregando...</div> <div id="msgList"></div></body></html>

Consideraes finais
Neste primeiro artigo, espero ter apresentado o que realmente AJAX e dissolvido alguns dos mitos que circulam por toda internet em relao tecnologia. Considero o AJAX parte fundamental da internet e pea importante no desenvolvimento de sites que aproximem o usurio e tornem sua experincia na web algo mais natural e intuitivo. Por isso, seu aprendizado algo muito importante e saber usar este recurso de forma crua qualifica o profissional e pode auxiliar muito na hora do aperto. Em um prximo artigo, irei me aventurar no mundo dos frameworks, mostrando como obter uma maior produtividade em seus trabalhos, facilitando muito o as tarefas dirias. Caso tenham alguma dvida ou problema, sintam-se a vontade para visitar meu blog ou utilizar o contato abaixo, pois estarei disponvel para tirar qualquer dvida.

Referncias e links sugeridos


[AJAX Online] http://www.ajaxonline.com.br [Meu Blog] http://www.rafaeldohms.com.br

3.4 Produto Final


Para ver o produto final funcionando, verifique o endereo abaixo:

Rafael Machado Dohms - rafael@rafaeldohms.com.br Ps-graduado em Projetos pela Fundao Getlio Vargas e graduado em Engenharia da Computao, pelo UniCEUB, em Braslia, trabalha com tecnologias web h 8 anos, com experincias no setor pblico e privado. Atualmente, membro da coordenao do PHPDF, grupo de desenvolvedores PHP do Distrito Federal (www.phpdf.org.br) e mantm um blog focado em assuntos relacionados tecnologia para web (http://www.rafaeldohms.com.br).

A tecnologia que liberta

26 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

segurana
Por Guilherme Gall, Pedro Lara, Fabio Borges

Webmail com

PHP + JAVA
Neste trabalho ser apresentado um novo mtodo de autenticao para webmail que usa como recursos as linguagens PHP e JAVA atravs de tecnologias J2ME.
Neste artigo iremos propor um esquema de autenticao para webmail (poder ser futuramente estendido para outros sistemas de autenticao) que usar a linguagem PHP do lado do servidor e JAVA atravs de tecnologias J2ME no cliente. Na verdade, o nosso grande foco consiste em que o servidor gerar um senha provisria atravs de alguma tcnica de GNA (Gerao de Nmeros Aleatrios) e aps encriptada por um servidor enviar para um usurio que dispe de um celular ou PDA (Personal Disital Assistants) para descriptar esta senha, e assim este usurio poder logar-se usando esta senha provisria. A vantagem do uso desta tcnica consiste em possibilitar que um usurio autentique-se em uma mquina infectada, por exemplo, com um keylogger, uma vez que a senha gerada pelo servidor no poder ser usado novamente para este usurio autenticar-se no webmail. nrio de uma empresa. Entretanto os keyloggers tambm so usados para fins ilcitos: capturar senhas, nmeros de cartes de crdito e qualquer outro tipo de informao puramente sigilosa. Estas informaes podem ser enviadas diretamente para o e-mail do indivduo que age de m f. Tudo isso sem o consentimento da vtima que est acessando o computador infectado [Pereira E. et al.]. Podemos dividir os keyloggers em trs classes diferentes: software keylogger, hardware keylogger e kernel keylogger [Pereira E. et al.].

Software keylogger: Talvez seja a classe de keylogger mais difundida na Web. Estes softwares usam tcnica de hooking. Os programadores deste tipo de keylogger utilizam funes disponibilizadas pela API (Aplication Program Interface) do sistema operacional
para captar mensagem e teclas pressionadas antes que estas funes sejam tratadas. Esses keyloggers podem ser instalados remotamente, no entanto, so os mais lentos e facilmente detectveis por programas como anti -vrus e anti-spywares.

1. Motivaes
A grande motivao deste artigo se concentra no grande nmeros de artefatos maliciosos (malware) que tramitam na web. Entre estes um dos que mais se destaca o spyware. Um spyware um software que auxilia a captura de informaes sobre uma pessoa, organizao ou computador sem o seu consentimento. Um spyware pode enviar tais dados para outra identidade sem o seu conhecimento ou tomar controle do computador sem que o usurio saiba disso. De todos os tipos de malwares existentes o spyware o mais comum. Segundo uma pesquisa conduzida pela Dell em setembro de 2004, estima-se que aproximadamente 90% dos PCs com Windows possuam no mnimo um spyware. Este tipo de software foi responsvel por metade das falhas reportadas por usurios da Microsoft em ambiente Windows. Outro estudo apontou uma mdia de 25 spywares por PC. No nosso trabalho atentaremos a presena de um tipo especfico de spyware: o keylogger. Um keylogger um tipo de spyware cuja finalidade capturar tudo que um determinado usurio digita em um teclado. Existem diversos tipos de uso de keyloggers, como por exemplo aqueles que monitoraram um funcio-

Hardware keylogger: Trata-se de um equipamento fsico que se localiza entre o teclado e o gabinete do computador da vtima. Apesar de possuir pouco recurso computacional, ele processa bem rpido as informaes capturadas. Este dispositivo no detectado por anti-vrus e nem anti-spyware, entretanto, pode ser visualmente detectado. Kernel keylogger: Este keylogger atua no nvel do kernel do sistema operacional. A confeco deste tipo de keylogger exige tcnicas apuradas de programao e de sistemas operacionais. O sistema operacional encontra muita dificuldade tambm em detect-lo. Este tipo de keylogger no capaz de captar informaes em nvel de aplicao: operaes de auto-completar, copiar e colar. Devido ao fato de trabalharem no ncleo do sistema.

2. Descrio do Mtodo
Aqui discutiremos a tcnica que iremos propor neste trabalho. O nosso grande objetivo criar uma senha provisria para dar acesso a um determinado usurio em

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 27

um sistema uma nica vez. Aps autenticado com esta senha provisria, este usurio no poder inserir esta senha a fim de autenticar-se neste sistema. Este fato nos garante que se caso tenha instalado algum tipo keylogger na mquina de acesso, a senha original no estar comprometida e caso um atacante intercepte a senha provisria, esta no ser mais vlida aps a sua autenticao. Logo o usurio estaria livre de qualquer tipo de software comprometer a segurana aspecto da autenticao. Para gerar esta senha provisria o servidor pode usar alguma tcnica de Gerao de Nmeros Aleatrios (GNA) que gere nmeros bem distribudos de aproximadamente 80 bits. A grande dificuldade se concentra em enviar esta senha de maneira segura para o usurio que deseja autenticar-se em um sistema. Para isso usaremos a tcnica de criptografia de chave pblica: um servidor sobre o qual o usurio deseja-se autenticar gera uma senha aleatria atravs de GNA; encripta esta senha usando a chave pblica do destinatrio (que ser conhecida e poder estar armazenada em uma base de dados) e a sua chave privada (do servidor), para decifrar esta senha o usurio usa a chave pblica do servidor e a sua chave privada. Para descriptar a senha o usurio usar um telefone celular ou um PDA (Personal Digital Assistants), por exemplo. A escolha de curvas elpticas est intrinsecamente ligada com o fato de usarmos equipamentos com pouco poder computacional para auxiliar o envio seguro da senha provisria para o usurio. Como visto na tabela 1 podemos ter criptografia segura usando aritmtica de 160 bits. Se usssemos o RSA com segurana equivalente teramos que usar inteiros de 1024 bits. Tal diferena agravada quando se pretende implementar nestes tipos de dispositivos. Na verdade, usaremos estes equipamentos (celulares, PDAs) para to somente efetuar os clculos pertinentes a decifragem da senha. O envio da senha encriptada para o usurio pode ser feito atravs de mensagem SMS (Short Message Service) visto que o PHP oferece este tipo de servio. Caso o usurio deseje, ele pode optar por inserir manualmente a senha encriptada em seu celular, no entanto, isto no o mais aconselhvel, uma vez que esta senha pode ser formada de alguns longos dgitos. Este usurio tambm tem a opo de fazer o download desta senha encriptada atravs de um cabo transferidor de dados, por exemplo. Os algoritmos de GNA e os algoritmos de criptografia podem ser construdos usando rotinas em PHP, no entanto, estas rotinas usam nmeros grandes (160 bits se usarmos algum mtodo baseado em curvas elpticas). Para utilizar nmeros desta magnitude pode ser adicionada ao PHP a biblioteca (GNU Multiple Precision Arithmetic) (GMP) [GMP PHP]. Alm de ser uma das mais rpidas bibliotecas para lidar com inteiros grandes, esta biblioteca dispe de funes demasiadamente usadas em criptografia, como por exemplo exponenciao modular.

3. Escolha e Justificativa do Algoritmo


A escolha de um algoritmo baseado em curvas elpticas est intrinsecamente ligada com o fato de que estaremos usando equipamentos com pouco poder computacional, neste caso celulares. Algoritmos baseados em curvas elpticas proporcionam uma chave criptogrfica consideravelmente menor que alguns clssicos da criptografia, tais como o RSA. Se estivssemos usando o RSA precisaramos de uma chave criptogrfica de aproximadamente 1024 bits, no entanto se trabalharmos com curvas elpticas usaramos uma chave de 160 bits, mantendo a mesma segurana. Este fato decorre que o Problema do Logaritmo Discreto (problema sobre o qual o algoritmo est baseado) sobre curvas elpticas mais difcil de ser resolvido do que o Problema da Fatorao de Inteiros que o problema que o RSA se baseia. Existem vrios algoritmos que trabalham sobre curvas elpticas, inclusive algoritmos que j existiam antes da descoberta desta tcnica em 1985. Na verdade, os algoritmos que se baseavam no Problema do Logaritmo Discreto em grupos aditivos da forma Zp podem ser estendidos para atuar sobre curvas elpticas. Um algoritmo que se destaca o Menezes-Vanstone que, diferentemente dos algoritmos adaptados para trabalhar sobre curvas elpticas, no precisa codificar a mensagem em pontos da curva elptica, facilitando assim a encriptao da mensagem. No nosso caso o servidor gerar uma senha aleatria. Se usarmos o criptossistema Menezes-Vanstone no teremos dificuldades em encriptar esta senha. No entanto, usando o protocolo Diffie-Hellman, por exemplo, antes de encriptar a mensagem deveramos codific-la em pontos de uma curva elptica, gerando assim uma dificuldade a mais para a implementao.

4. Tecnologias Envolvidas
Nesta seo resumiremos as principais ferramentas e tecnologias envolvidas na execuo do mtodo proposto.

4.1 Biblioteca GMP


Como parte do processo de implementao do mtodo proposto, necessria a implementao do algoritmo criptogrfico escolhido. fato que existem poucas implementaes para algoritmos baseados em curvas elpticas para PHP e que a documentao existente precria em muitas vezes no existe. Com estes fatores sentimos a necessidade de implementar todas as operaes pertinentes ao algoritmo escolhido (neste caso, o Algoritmo Menezes-Vanstone). Como precisamos trabalhar com inteiros relativamente grandes, uma tima opo seria usar a biblioteca GMP [GMP PHP]. E esta oferece funes que so de suma importncia para a implementaes de criptografia. Como por exemplo a funo gmp_nextprime(int $a) que retorna o prximo primo maior que $a. O trecho de cdigo abaixo mostra o funcionamento da funo

28 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

gmp_invert(resouce $a, recouce $b). Esta funo calcula o inverso de $a mdulo $b e tambm ter grande utilidade na implementao do algoritmo.
<?php $c1="74077570053047859662631461731530877308490 $pri9391351"; mo="116920130986472233456294786617302641572475 24989731"; $invMod=gmp_invert($c1,$primo); echo gmp_strval($invMod); ?>

4.2. Java e biblioteca Bouncy Castle


A tecnologia Java uma plataforma criada pela empresa Sun Microsystems na qual o desenvolvedor escreve programas atravs de uma linguagem de programao que gere cdigo executvel pela mquina virtual Java. O grande diferencial desse tipo de desenvolvimento que, como os programas so escritos para uma mquina virtual, qualquer dispositivo que tenha uma mquina virtual Java instalada pode rodar os programas, independente de hardware ou sistema operacional. A segmentao da tecnologia Java de interesse deste trabalho a J2ME (Java 2 Micro Edition), que consiste basicamente em uma coleo de APIs (Application Programming Interface) voltadas ao desenvolvimento de aplicaes para dispositivos com processamento limitado, como celulares e PDAs, e uma mquina virtual Java para rodar nesses dispositivos. Basicamente, a arquitetura do J2ME divide-se em trs camadas: mquina virtual, configuraes e perfis. A mquina virtual a camada de mais baixo nvel e roda diretamente sobre o sistema operacional do dispositivo. Ela quem executa os programas gerados para a plataforma Java e, portanto, o que define as limitaes dos programas que sero executados nos dispositivos. A camada acima da mquina virtual a configurao e consiste basicamente em uma especificao que define o ambiente de software para uma faixa de dispositivos definida por um conjunto de caractersticas tais como tipo e quantidade de memria disponvel, processador e sua freqncia de operao e o tipo de conexo de rede disponvel para o dispositivo. Em termos prticos, uma configurao formada por um conjunto de bibliotecas que estaro disponveis para o desenvolvedor criar programas em uma faixa de dispositivos com aplicaes distintas aplicaes, mas com diversas caractersticas em comum. Como exemplo de faixa horizontal de dispositivos, pode-se citar os dispositivos mveis com conexo a rede sem fio. Nessa faixa estariam includos aparelhos como celulares, PDAs e pagers. A justificativa para a criao de configuraes que apesar dos diversos aparelhos serem distintos em forma e funcionalidades, muitos deles tem caractersticas de processadores e memria muito similares e, por isso, so colocados sobre uma mesma especificao que determina o nvel de funcionalidades e servios que tem que ser oferecidos pela mquina virtual.

A camada de mais alto nvel na tecnologia J2ME o perfil. Ele define um conjunto de bibliotecas especficas para o desenvolvimento de programas para uma faixa vertical de dispositivos e foca mais na aplicao e segmento de mercado do aparelho do que em suas caractersticas de processador e memria. Um exemplo de faixa vertical de dispositivos so os telefones celulares. Os perfis complementam uma configurao J2ME formando um servio completo para que as aplicaes possam ser executadas. Para clarificar a diferena entre perfis e configuraes, interessante lembrar que perfis so mais especficos que configuraes. Assim, se pode ter uma configurao para dispositivos com baixo poder de processamento e um perfil para os celulares. A especificao de um perfil sempre feita para uma determinada configurao, mas uma configurao pode suportar vrios perfis diferentes. Como se objetivou que o sistema de autenticao proposto por esse projeto fosse utilizvel em diversos contextos e por diversos usurios, usou-se o perfil MIDP sobre a configurao CLDC para a implementao do software que rodar no dispositivo mvel por essa ser a combinao de configurao/perfil presente em quase 100% dos celulares. Para implementar o algoritmo de criptografia com curvas elpticas necessria a capacidade de fazer contas com nmeros de grandeza maior do que a grandeza dos nmeros representveis com os tipos primitivos do Java. Como entre outras de suas limitaes, a biblioteca de classes do perfil MIDP no traz a classe BigInteger que permite a manipulao de nmeros com a grandeza necessria. Fez-se imprescindvel a utilizao de uma biblioteca de classes que trouxesse consigo uma maneira de manipular nmeros grandes o suficiente para a implementao do sistema. A biblioteca escolhida foi a Bouncy Castle, que uma biblioteca de classes usada para criptografia que traz uma implementao compatvel com J2ME da classe BigInteger. As diversas outras classes da biblioteca Bouncy Castle que poderiam ter sido usadas na implementao deste sistema de autenticao no foram usadas por motivos esclarecidos no item Detalhes de Implementao.

5. Detalhes de implementao
Tanto na implementao do software do dispositivo mvel quanto na do servidor foram criadas duas classes para abstrair os conceitos fundamentais envolvidos na criptografia com curvas elpticas: Curva e Ponto. A classe Curva recebe atravs de parmetros do seu construtor os coeficientes a e b alm de um nmero primo p usado para definio do corpo Zp (a curva definida por y=x+ax+b). A principal dentre entre as suas funes a funo multiplicacao( ) que retorna um objeto do tipo Ponto resultante da multiplicao por escalar de Ponto P por um inteiro k. Esta funo ocupa algo em torno de 92% do processamento na criptografia. A classe Ponto recebe como parmetros em seu construtor as coordenadas x e y de ponto e um valor booleano que indica se o Ponto no infinito ou no. Mais detalhes sobre criptografia baseada em curvas
PHP Magazine - 3a Edio - 29

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

elpticas podero ser vistas em [Lara, P C S Oliveira, F B]. Suas outras funes so getters e setters para as coordenadas do Ponto e o valor booleano citado anteriormente. No caso da implementao do software que rodar no dispositivo mvel, no foram utilizadas as classes de criptografia com curvas elpticas da biblioteca Bouncy Castle porque a documentao sobre elas insuficiente. Assim, a nica classe dessa biblioteca usada foi a verso para J2ME da classe java.math.BigInteger. Como no existe essa classe na configurao CLDC e no perfil MIDP necessrio usar um obfuscator, no apenas para os nomes das classes, mas tambm para o nome dos pacotes para usar essa classe, pois no possvel criar classes dentro do pacote Java por questes de segurana. As chaves pblicas dos usurios so pares de pontos armazenados em um banco de dados no servidor e as chaves privadas ficam apenas nos dispositivos dos usurios. A chave pblica do servidor, composta por um par de pontos tambm de conhecimento de cada dispositivo mvel.

Pedro Lara - pcslara@lncc.br Graduando em Tecnologia da Informao pelo Instituto Superior de Tecnologia e em Matemtica pela Universidade Federal Fluminense atravs do CEDERJ, atualmente atua na rea de segurana da informao e criptografia assimtrica. Sua rea de interesse Criptografia Baseada em Curvas Elpticas.

Guilherme Gall - gmgall@lncc.br Graduando em Tecnologia da Informao e da Comunicao pelo Instituto Superior de Tecnologia em Cincias da Computao de Petrpolis. Atualmente trabalha no Servio de Redes do Laboratrio Nacional de Computao Cientfica.

6. Consideraes Finais
No presente momento o mtodo proposto neste trabalho est em fase de implementao e testes. Como trabalhos futuros, pretendemos abrir todos os cdigos sob uma licena livre e estender este conceito para outros sistemas que necessitem de autenticao de usurios, alm de melhorar o desempenho do programa Java que rodar nos dispositivos mveis.

Fbio Borges - borges@lncc.br Possui Bacharelado em Matemtica pela Universidade Estadual de Londrina (UEL) e Mestrado em Modelagem Computacional pelo Laboratrio Nacional de Computao Cientfica (LNCC). Atualmente Tecnologista do LNCC onde responsvel pelo Setor de Treinamento e Apoio (STA). Tem experincia na rea de Segurana da Informao. Atuando principalmente nos seguintes temas: Criptografia, Esteganografia, Web.

Referncias e links sugeridos


[GMP PHP] http://www.php.net/gmp Lara, Pedro Carlos da Silva; Oliveira, Fbio Borges. Cur-

vas Elpticas: Aplicao em Criptografia Assimtrica. In: Simpsio Brasileiro em Segurana da Informao e de Sistemas Computacionais 2007. Rio de Janeiro.
(WTICG), 2007. Muchow, Jonh W. Core J2ME: tecnologia & MIDP. So Paulo: Pearson Makron Books, ISBN: 85-346-1522-5 2004. Pereira, Evandro; Fagundes, Leonardo Lemes; Neukamp, Paulo; Ludwig, Glauco; Konrath, Marlom. Forense

Computacional: fundamentos, tecnologias e desafios atuais. VII Simpsio Brasileiro em Segurana da


Informao e de Sistemas Computacionais.

30 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

imagem
Por Leandro Schwarz

Criao de imagens

on on-the the-fly
Uma importante caracterstica da linguagem PHP a possibilidade de criar imagens de forma dinmica, isto , durante a execuo do script. Este artigo aborda a utilizao da biblioteca GD do PHP para a criao de imagens, bem como um exemplo prtico que permitir a criao de palavras-passe para stios da web.
A criao de imagens on-the-fly, ou seja, em tempo real de execuo do script, uma ferramenta poderosa da linguagem PHP para stios da web, principalmente lbuns de fotografias, lojas virtuais e reas administrativas. Talvez a aplicao mais conhecida deste mtodo de programao seja a criao de palavras-passe (palavras ou nmeros aleatrios) em stios de correio eletrnico, com o objetivo de evitar a atuao de softwares que criem mltiplas contas de e-mail. Em segurana, tambm possvel substituir os endereos de e-mail de pginas da Internet por imagens, para prevenir a atuao de ferramentas de captura de e-mails para bancos de dados de spams. As aplicaes deste mtodo no se limitam apenas segurana de stios, sendo ele tambm amplamente utilizado em ferramentas de comrcio virtual, onde o vendedor pode enviar uma imagem via formulrio. Esta imagem pode ser processada pelo servidor para mudana de escala, formato e acrscimo de marca dgua, sendo depois armazenada em disco ou gravada em banco de dados. procurando pela sesso GD no resultado da funo phpinfo(). No entanto, se o objetivo o desenvolvimento de um script porttil, que possa ser instalado em servidores diferentes, interessante que a verificao seja realizada no prprio script atravs da funo function_exists(). Ambas as possibilidades esto implementadas no script a seguir.
<? if(function_exists(gd_info)) echo Biblioteca GD instalada.; phpinfo(); ?>

1. Requisitos mnimos
Para o entendimento deste artigo, necessrio que o servidor disponha da biblioteca GD. A biblioteca GD uma biblioteca em cdigo aberto escrita em linguagem C. Desenvolvida por Thomas Boutell (http:// www.boutell.com), a biblioteca atualmente mantida por Pierre-A. Joye (http://www.libgd.org). A biblioteca GD suporta os formatos JPG, PNG e GIF, dentre outros formatos. importante salientar que o formato GIF novamente suportado. Este formato era suportado pelas verses iniciais da biblioteca, mas foi descontinuado nas verses seguintes devido patente da compresso LZW que expirou e, por isso, o suporte ao formato foi restabelecido na verso 2.0.28. possvel verificar se o servidor dispe da biblioteca,
Figura 1 Informaes sobre a biblioteca GD instalada no servidor retornadas pela funo phpinfo()

2. Criao da imagem
Depois de constatada a presena da biblioteca GD no servidor, o prximo passo para o script da palavra-passe a criao de uma figura. Isto pode ser feito com as funes imagecreatetruecolor() e imagecreate(). Ambas recebem dois parmetros (largura e altura) e retornam um identificador de recurso de imagem para a imagem criada. Nas duas funes, o identificador de recurso de imagem pode ser destrudo atravs da funo imagedestroy(). conveniente a utilizao do caractePHP Magazine - 3a Edio - 31

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

re @ precedendo o nome das funes de imagem, para evitar que os erros ecoem na pgina. Algumas diferenas podem ser citadas sobre as duas funes, como, por exemplo, a cor de preenchimento de fundo da figura, que a primeira cor alocada quando se utiliza imagecreate() ou preta quando se utiliza imagrecreatetruecolor(). Mas a diferena principal entre as funes imagecreate() e imagecreatetruecolor() a chamada profundidade de bits. A profundidade de bits um valor que quantifica o nmero de cores nicas que podem ser formados dentro da paleta de cores de uma figura. As cores da paleta no precisam ser, necessariamente, utilizadas na figura. Imagens que no sejam true color podem possuir apenas 256 cores em sua paleta, enquanto que as imagens true color permitem a alocao de toda a paleta de cores true color, ou seja, 24 bits de profundidade de cor. Cada pixel de uma figura formado por uma combinao das trs luzes bsicas: vermelho, verde e azul (red, green, blue RGB). importante comentar aqui a diferena entre as trs cores bsicas e as trs luzes bsicas. Em fsica, as trs luzes bsicas so o vermelho, o verde e o azul e a unio de suas intensidades forma todas as outras luzes. As trs cores bsicas fazem parte do mundo da arte e pintura e so caracterizadas pelos pigmentos vermelho, azul e amarelo. Os monitores funcionam atravs da emisso de misturas de luzes, as impressoras trabalham com misturas de pigmentos. Portanto, os pixels grficos possuem luzes no padro RGB. Cada luz primria chamada de canal de cor. Se cada canal de cor possuir profundidade de 8 bits, formando 23*8 combinaes possveis (16.777.216), ento estaremos trabalhando no sistema de cores true color ou SVGA. Se alm destas combinaes, for adicionado ainda um canal de transparncia, estar formado o sistema true color de 32 bits. Agora que o sistema de cores j est entendido, necessrio alocar-se as cores para a paleta de cores da figura. A primeira cor alocada utilizada para preencher a figura e para a paleta de cores nas imagens criadas com imagecreate(), e as cores alocadas na seqncia fazem parte apenas da paleta de cores. As cores so alocadas atravs da funo imagecolorallocate(), que recebe quatro argumentos (identificador de recurso da imagem, intensidade vermelho, intensidade verde e intensidade azul), retornando um identificador de recurso de cor. As intensidades das luzes devem ser expressa em um valor de 8 bits, podendo ser utilizada a notao decimal (0 255) ou hexadecimal (0x00 0xFF). A cor alocada apenas para a imagem qual foi referenciada, devendo ser alocada mltiplas vezes no caso de mltiplas imagens abertas. A cor alocada no precisa ser utilizada na figura, porm estar ocupando espao na paleta de cores. Esta cor pode ser retirada da paleta de cores atravs da funo imagecolordeallocate(). Esta funo recebe como argumentos o identificador de recurso da imagem e o identificador de recurso da cor. No entanto, se uma cor que foi utilizada na imagem for retirada da
32 - 4a Edio - PHP Magazine

paleta, todos os elementos com aquela cor recebero uma outra cor. Tambm possvel alocar cores com transparncia em imagens criadas com imagecolorallocatealfa(). A funo recebe, alm dos mesmos argumentos da imagecolorallocate(), um argumento adicional correspondente ao canal de transparncia.Este canal possui profundidade de 7 bits, podendo ser utilizada a notao decimal (0 127) ou hexadecimal (0x00 0x7F). As cores alocadas com transparncia tambm podem ser retiradas da paleta atravs da funo imagecolordeallocate(). Para verificar o nmero de cores utilizadas na paleta de uma imagem, utilize-se a funo imagecolorstotal (), sendo necessrio apenas informar o identificador de recurso da imagem desejada. Alm da alocao de cores slidas e alocao de cores transparentes para a paleta, tambm possvel definir-se uma cor transparente para a imagem, com a funo imagecolortransparent(). A transparncia uma caracterstica da imagem, no da cor, isto significa que quando uma cor declarada como transparente, todas as reas preenchidas com aquela cor se tornaro transparentes.

4. Desenhando na imagem
Diversos elementos podem ser adicionados a uma figura, como linhas, quadrados, retngulos, crculos, elipses e polgonos genricos. A menor unidade geomtrica o ponto e, de forma anloga, a menor unidade grfica o pixel. A funo imagepixel() permite que um dado pixel de uma imagem seja preenchido com uma cor, sendo necessrio apenas definir a imagem, as coordenadas X e Y e a cor desejada. O sistema de coordenadas baseado em um plano cartesiano com as abscissas normais e as ordenadas invertidas, ou seja, a imagem apresenta sua origem (coordenada 0,0) no canto superior esquerdo. O elemento geomtrico imediatamente superior ao ponto a linha. Assim como a linha geometricamente definida como uma seqncia infinita de pontos alinhados, a linha grfica uma seqncia finita de pixels alinhados. As linhas so desenhadas na figura atravs da funo imageline(). A funo requer o identificador de recurso de imagem, as coordenadas do ponto de incio da linha, as coordenadas do ponto de trmino da linha e a cor. Quadrados so elementos geomtricos formados por quatro lados iguais e quatro ngulos iguais, enquanto os retngulos so formados tambm por quatro ngulos iguais, porm possuem dois pares de lados iguais. Portanto, os quadrados so, em verdade, casos particulares de retngulos, onde os dois pares de lados apresentam o mesmo valor. Retngulos e quadrados podem ser desenhados por meio das funes imagerectangle() e imagefilledrectangle(), sendo necessrio definir o identificador de recurso de imagem, as coordenadas X e Y de um dos vrtices, as coordenadas X e Y do vrtice
Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

oposto ao passado e a cor. Para se desenhar quadrados, necessrio que a diferena entre as coordenadas X e coordenadas Y dos dois vrtices passados sejam iguais. Circunferncias so elementos geomtricos que possuem todos os seus pontos a uma mesma distncia de um ponto chamado centro. Crculos so formados pela circunferncia e por todos os pontos internos a ela. As elipses so figuras geomtricas cuja soma das distncias de um ponto qualquer dois pontos fixos chamados focos, constante o ponto eqidistante entre os dois focos chamado de centro. Desta forma, circunferncias so casos particulares de elipses. Portanto, toda circunferncia uma elipse, onde os dois focos e, conseqentemente, o centro, pertencem a um mesmo ponto. Elipses e circunferncias podem ser desenhadas com as funes imageellipse(), que desenha uma elipse vazada, e imagefilledellipse(), que desenha uma elipse preenchida com a cor. Ambas as funes requerem o identificador de recurso da imagem, as coordenadas X e Y do centro da elipse, a largura e a altura e a cor. Para se desenhar crculos, deve-se apenas utilizar o mesmo valor para a largura e a altura da elipse. Arcos podem ser desenhados com as funes imagearc() e imagefilledarc(). Ambas as imagens recebem como argumentos o identificador de recurso da imagem, as coordenadas do centro, a largura e a altura da elipse qual o arco faz parte, os ngulos de incio e final do arco e a cor. Os ngulos seguem a notao do eixo de coordenadas polares, possuindo o ngulo de 0 na posio das trs horas e crescendo no sentido antihorrio. A funo imagefilledarc() ainda recebe um argumento extra: o estilo do preenchimento. Este argumento deve ser passado como uma mscara de OR dos flags IMG_ARC_PIE, IMG_ARC_CHORD, IMG_ARC_NOFILL e IMG_AR_EDGED. Os flags IMG_ARC_PIE e IMG_ARC_CHOD so mutuamente exclusivos, significando que no podem ser utilizados em conjunto. IMG_ARC_PIE desenha apenas o arco da elipse, enquanto que IMG_ARC_CHORD simplesmente une as duas extremidades do arco da elipse com uma linha. IMG_ARC_NOFILL produz apenas uma borda, ao invs de preencher a figura com a cor e IMG_ARC_EDGED une as extremidades do arco com o centro da elipse. Caso seja necessrio desenhar uma figura fechada formada apenas por vrtices, pode-se utilizar as funes imagepolygon() e imagefilledpolygon(). Estas funes precisam de quatro argumentos: o identificar de recurso da imagem, um vetor de coordenadas X e Y, o nmero de vrtices e a cor. Os elementos grficos a serem desenhados (com exceo do pixel) podem ter suas espessuras modificadas atravs da funo imagesetthickness(). O padro das linhas tambm pode ser modificado com a funo imagesetstyle(), podendo ser utilizada para desenhar linhas pontilhadas ou tracejadas, por exemplo. O preenchimento de uma rea com uma cor realiExemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

zado pelas funes imagefill() e imagefilltoborder(). Esta ltima funo permite que seja determinado um espao definido para o preenchimento.

5. Escrevendo na imagem
A biblioteca GD permite que caracteres e strings sejam impressos na figura atravs das funes imagechar (), imagecharup(), imagestring() e imagestringup (). Todas estas figuras trabalham com o mesmo conjunto de argumentos: o identificador de recurso da imagem, a fonte, as coordenadas X e Y, a string a ser impressa e a cor. No caso das funes imagechar() e imagecharup(), apenas o primeiro caractere da funo impresso. As funes imagechar() e imagestring() escrevem na figura na horizontal, enquanto que as funes imagecharup() e imagestringup() escrevem verticalmente na figura. A fonte pode ser uma fonte interna ou uma fonte carregada externamente. As fontes internas so chamadas por meio dos nmeros inteiros de 1 a 5. O carregamento de fontes externas no faz parte do escopo deste artigo. A figura 2 demonstra as diferenas entre as cinco fontes internas.

Figura 2 Cinco fontes internas da funo imagestring().

6. Processamento de imagem
A modificao de imagens pr-existentes , muitas vezes, mais importante que a criao de imagens novas. Uma fotografia de uma cmera digital de alta resoluo pode, por exemplo, atingir 2048 x 1536 pixels. No entanto, se a imagem for mostrada dentro de um espao de 400 x 300 pixels em uma pgina da Internet, muitos dos pixels da imagem no sero mostrados, embora a fotografia inteira deva ser carregada pelo browser antes de sua exibio. Para diminuir o tempo de abertura da pgina, o espao utilizado em disco no servidor e, conseqentemente, a banda transmitida, pode-se processar as imagens carregadas para diminuir suas dimenses. A menor unidade geomtrica o ponto, caracterizado por ser uma estrutura unidimensional. Entretanto, a menor unidade visual possvel em imagens o pixel. A diferena entre o ponto e o pixel que uma rea formada por infinitos pontos, enquanto que uma figura sempre formada por um nmero finito de pixels. Isto significa que durante o processamento de imagens onde o nmero de pixels de uma figura modificado, parte da informao associada quela imagem ser modificada, seja por interpolao (acrscimo de pixels) ou por decimao (extrao de pixels). Para o processamento de imagens pr-existentes, necessrio abrir a imagem utilizando as funes:

PHP Magazine - 3a Edio - 33

imagecreatefromgif(); imagecreatefromjpeg(); imagecreatefrompng(); imagecreatefromwbmp(); imagecreatefromxbm(); imagecreatefromxpm(). Todas estas funes requerem apenas uma string com o nome do arquivo a ser aberto. Depois de aberta a imagem, interessante saber o tamanho da imagem, o que pode ser conseguido com as funes imagesx() e imagesy(), passando apenas o identificador de recurso de imagem. Se duas ou mais imagens estiverem abertas ao mesmo tempo, pode-se copiar parte de uma imagem para outra. Para este fim, pode-se utilizar as funes imagecopy(), imagecopymerge(), imagecopymergegray (), imagecopyresampled() e imagecopyresized(). A diferena bsica entre estas que a funo imagecopy() realiza uma cpia simples de uma parte de uma imagem em outra imagem; imagecopymerge() funciona de forma semelhante imagecopy(), exceto por ser possvel definir um grau de transparncia na poro copiada da imagem de origem; imagecopymergegray() semelhante funo anterior, exceto por transformar os pixels de destino em tons de cinza antes da mescla das imagens; a funo imagecopyresampled() e imagecopyresized() realizam a mesma tarefa, copiar uma parte de uma imagem em outra imagem com escalas diferentes, exceto que imagecopyresampled() realiza uma interpolao na figura, possuindo resultados visuais levemente mais agradveis que imagecopuresized(). Para rotacionar a imagem em certo nmero de graus, possvel utilizar-se a funo imagerotate(). Tambm suportada a correo de gama atravs da funo imagegammacorrect() e a aplicao de filtros imagem com imagefilter(). 6. Finalizao da imagem Quando todo o processamento da imagem j tiver sido realizado, o prximo passo a finalizao da imagem. A imagem pode ser mostrada na tela ou salva em arquivo. Para isto, deve-se utilizar uma das seguintes funes, dependendo do formato final desejado: imagegif(); imagejpeg(); imagepng(); imagewbmp(); imagexbm(). Todas as funes listadas acima requerem como argumento o identificador de recurso de imagem e um argumento opcional do nome do arquivo. Se este argumento for passado, a imagem ser salva no arquivo especificado, caso contrrio, a imagem ser enviada ao

browser no formato especificado. Caso seja selecionada a opo para exibio em browser, importante o uso da funo header() para indicar ao browser que o contedo se trata de uma imagem.

7. Script da palavra-passe
Agora que as funes da biblioteca GD j foram vistas, o script da palavra-passe pode ser desenvolvido seguindo os passos abaixo: Verificar requisitos mnimos; Criar uma imagem; Criar a paleta de cores; Desenhar linhas aleatrias; Escrever a palava-passe aleatria; Rotacionar a imagem; Finalizao da imagem. Os passos enumerados acima esto indicados no script abaixo.
<? // Requisitos mnimos if(!function_exists(gd_info)) { echo Biblioteca GD no instalada.; exit(); } // Criar a imagem $imagem = @imagecreate(100,100); // Criar a paleta de cores $branco = @imagecolorallocate ($imagem,0xFF,0xFF,0xFF); $azulescuro = @imagecolorallocate ($imagem,0x00,0x00,0x80); $verde = @imagecolorallocate ($imagem,0x00,0xFF,0x00); $verdeescuro = @imagecolorallocate ($imagem,0x00,0x80,0x00); $vermelhoescuro = @imagecolorallocate ($imagem,0x80,0x00,0x00); // Desenhar linhas aleatrias for($i = 0;$i < 3;$i++) @imageline($imagem,rand(0,99),rand (0,99),rand(0,99),rand(0,99),$vermelhoescuro); for($i = 0;$i < 3;$i++) @imageline($imagem,rand(0,99),rand (0,99),rand(0,99),rand(0,99),$verdeescuro); for($i = 0;$i < 3;$i++) @imageline($imagem,rand(0,99),rand (0,99),rand(0,99),rand(0,99),$verde); // Escrever palavra-passe aleatria for($i = 0;$i < 4;$i++) @imagestring($imagem,6,32 + 10 * $i,32 + rand(-5,5),rand(1,9),$azulescuro); // Rotacionar a imagem $imagem = @imagerotate($imagem,90,$branco); // Finalizao da imagem @imagepng($imagem); ?>

34 - 4a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

Consideraes finais
Espera-se que este artigo tenha ilustrado o modo de funcionamento da biblioteca GD, caracterizando uma poderosa ferramenta para edio de imagens dinamicamente. O artigo demonstrou a criao de uma imagem, bem como seu processamento para a criao de palavras-passe. O script demonstrado pode ser modificado para ser utilizado em sistemas de segurana de login em stios da Internet.

Referncias e links sugeridos


[PHP Manual] http://www.php.net

Leandro Schwarz - leandroschwarz@gmail.com Engenheiro eletricista pela Universidade Federal de Santa Catarina (UFSC). Atuando desde 2000 com desenvolvimento WEB, possui slidos conhecimentos em PHP e MySQL. Atualmente mestrando em Engenharia Eltrica no Instituto de Engenharia Biomdica da UFSC. Projeta websites e lojas virtuais como autnomo.

Quinta edio!
Participe da quinta edio da PHP Magazine. Visite nosso portal e veja as informaes para submisso de artigos para a revista. No esquea o deadline: 25/04/2008.

Visite nosso Portal

www.phpmagazine.com.br

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 3a Edio - 35

Você também pode gostar