Professional Documents
Culture Documents
com>
SUMRIO
editorial
Apresentao Equipe Mensagens de leitores Chamadas
artigos
phpDocumentor
por Maykel dos Santos Braz
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.
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
mensagens de leitores
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.
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 logomarca no site do portal liberta A tecnologia que 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.
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:
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
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].
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.
@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.
@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.
@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
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.
@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
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.
@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.
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.
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.
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
script
por Helton Eduardo Ritter
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.
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.
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.
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.
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).
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
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!
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.
segurana
por Ricardo Striquer Soares
Ataque de sobrecarga
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.
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.
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
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-
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.
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.
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.
PHP-GTK
por Pablo DallOglio
PHP-GTK PHPNeste 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.
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
(). 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
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);
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(); } }
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.
Nesta tela seguinte, voc confere a planilha eletrnica gerada no formato Excel.
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.
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-
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.
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
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;
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();
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
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);
?>
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.
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.
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).
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
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.
4. Tecnologias Envolvidas
Nesta seo resumiremos as principais ferramentas e tecnologias envolvidas na execuo do mtodo proposto.
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); ?>
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
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.
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
imagem
Por Leandro Schwarz
Criao de imagens
on-the-fly on-theUma 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
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: 012225 - Jhonny Freire Oliveira <jhonny.informatica@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: 012225 - Jhonny Freire Oliveira <jhonny.informatica@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.
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:
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); ?>
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.
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.
www.phpmagazine.com.br