terça-feira, 8 de agosto de 2017

SimpleXML: Manipulando arquivos XML no PHP

Manipulando XML com PHP usando SimpleXML

O que é XML?

A eXtensible Markup Language (ou XML para quem tem intimidade) é uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais. Isso quer dizer que o XML pode ser usado para tabular informações dentro de um determinado padrão fácil de ser compreendido e assim, permitindo a troca de informações de forma mais simples. Na internet, isso é uma "mão na roda", já que sites e sistemas web (ou desktop) muitas vezes são feitos em linguagens de programação diferentes, usam diferentes bancos de dados, estruturas de redes  e até sistemas operacionais.

O formato desses arquivos é simples. Eles sempre começam com um cabeçalho como esse:

<?xml version="1.0" encoding="UTF-8"?>

Essa tag indica que isso é um documento xml.
Ele também pode (nem sempre é, mas pode) ser salvo em um arquivo com extensão xml (ex: cidades.xml).

Dentro desse documento, os dados são estruturados dentro de tags que, geralmente (mas nem sempre) tem uma tag de abertura e outra de fechamento. Ex:

<contatos>
  <contato>
    <nome>Fulano de Tal</nome>
    <telefone>(44)9999-8888</telefone>
  </contato>
  <contato>
    <nome>Beltrano da Silva</nome>
    <telefone>(41)99999-9999</telefone>
  </contato>
</contatos>

O exemplo acima mostra como podemos organizar uma lista de contatos usando xml. Grave todo esse conteúdo em um arquivo (vamos escolher um nome bem criativo, tá?) chamado contatos.xml e pronto, você tem um documento XML que você pode manipular usando PHP.

Lendo arquivos com SimpleXML

Para que possamos fazer isso, vamos usar uma biblioteca nativa do PHP chamada SimpleXML. Ela oferece uma forma simples de carregar os dados de um documento para sua posterior manipulação. Vamos começar gravando os dados da nossa lista de contatos em XML em um banco de dados:

$contatos = simplexml_load_file("contatos.xml");
foreach($contatos->contatos as $contato){
    $nome = $contato->nome;
    $telefone = $contato->telefone;
    $sql = "insert into contatos (nome,telefone) values ('$nome','$telefone');";
    mysqli_query($sql);
}

Como podem ver, gosto de usar MySQL, mas depois do sql gerado, ele pode ser salvo em qualquer banco de dados.

Usamos o comando simplexml_load_file() para carregar o conteúdo do arquivo xml para a variável contatos. Ela então torna-se um objeto estruturado conforme as orientações do documento.Essa estrutura permite que façamos um loop usando o foreach e assim percorrendo todos os dados contidos no documento. A cada volta do loop, os dados são transferidos para outras variáveis (aproveite esse momento para tratar esses dados) que formarão o comando SQL, que por sua vez vai gravar essas informações no banco de dados.

Se o conteúdo que queremos manipular estivesse em uma variável em vez de um arquivo (você pode ter criado um xml "na hora", por exemplo), trocaríamos o comando simplexml_load_file() por simplexml_load_string(). O restante, ficaria do mesmo jeito.

Gostou? Tem dúvidas? Deixe seu comentário :D

segunda-feira, 16 de julho de 2012

Instalando CkEditor no Rails 3


Comecei a "brincar" com Ruby on Rails 3 graças à influência de um amigo. Desenvolver usando esse framework é algo muito divertido. 
Tudo estava indo bem até esbarrar em um problema: Precisava usar um editor html em um campo de texto do meu site (um dos vários que fiz apenas com fins didáticos) e não sabia como implementar um. A tarefa parecia ser mais difícil pelo fato de estar utilizando a gem Rails Admin para criar o painel administrativo do site. Foi então que encontrei no github uma versão do ckeditor para Rails que era compatível com essa gem.
Já conhecia o CkEditor de "outros carnavais", então resolvi seguir os passos do turorial de instalação contido nele. Para minha surpresa, não consegui instalá-lo (sim, achei isso estranho. Em geral, as coisas são bem simples de serem feitas no Rails). Resolvi estudar a documentação um pouco mais a fundo e depois de alguns testes, descobri a melhor forma de instalá-lo.

Nesse exemplo, quero usar o CkEditor no meu módulo Posts, que possui apenas título e conteúdo (onde quero utilizar o editor).

Primeiramente, precisamos modificar o arquivo Gemfile, para adicionar a lista de gems que iremos utilizar no projeto. Basicamente, usei RailsAdmin para o painel, Paperclip para upload de imagens, Therubyracer para javascript e Devise para autenticação.

sexta-feira, 11 de maio de 2012

Recupere seu hotmail se for capaz

Hoje, quando fui acessar minha conta do Hotmail para ver minhas mensagens me deparei com essa tela:



Ela diz algo mais ou menos assim: "Sua conta foi bloqueada por que muitos e-mails (spams) estavam sendo enviados a partir deste endereço. Para acessar sua conta, é necessário desbloqueá-la. Clique em continuar para efetuar o desbloqueio".

Até aí, tudo bem. O problema está justamente quando eu clico em 'continuar' e me deparo com essa tela:

Essa aqui diz algo assim: "O código para desbloqueio foi enviado para sua conta de e-mail. Digite-o no campo abaixo e clique em continuar".

Como assim? Como vou pegar esse código de segurança se minha conta está bloqueada? Como vou acessar um serviço que está indisponível? Não se pode abrir uma porta por dentro estando do lado de fora, certo?

Se ao menos eles mandassem para um e-mail alternativo, seria outra história, mas não é isso que está sendo mostrado pelo sistema.

Se você está tentando entrar em contato comigo através do e-mail leandro.admo@ hotmail.com (endereço que deixei na minha apostila de PHP e MySQL), esqueça. Não poderei responder (por motivos óbvios). Em vez disso, entre em contato pelo endereço leandro.admo@ gmail.com .

Depois dessa, não pretendo usar os serviços do Hotmail tão cedo. (momento usuário Linux xiita :D )

quarta-feira, 18 de abril de 2012

Dilema dos projetos de software

Quando se trata de desenvolvimento de software, quase todo projeto segue o mesmo dilema do desenho abaixo:

erros incomuns #1

Erros incomuns: Opera
Como assim? Deu erro por que a página foi encontrada?

E o link ainda leva para o mesmo lugar onde eu já estava...


segunda-feira, 12 de dezembro de 2011

UD Web Rádio está no ar!

UD Web Rádio está no ar! Do que se trata? É uma radio web focada em software livre.

Do blog Ubuntu Dicas, tem uma programação que alterna entre a divulgação de notícias e eventos sobre software livre e a execução de músicas registradas em copyleft (as chamadas 'músicas livres'). Quer saber o melhor disso tudo? A rádio não tem intevalos comerciais! Não é o máximo?

Para saber mais, acesse UD Web Radio.

Ouça, compartilhe e (se puder) colabore!



sexta-feira, 14 de outubro de 2011

projeto simples (ou não)

Projeto de desenvolvimento de um site simples. Será? Repare na descrição:
Como assim "Site Institucional simples" que gera ordens de serviço?
Muito controverso, não acham?

quinta-feira, 28 de julho de 2011

Primeiros passos - Python

O que é Python?

Python é uma linguagem de programação de alto nível, interpretada, imperativa, orientada a objetos, de tipagem dinâmica e forte. Foi lançada por Guido van Rossum em Atualmente possui um modelo de desenvolvimento comunitário, aberto e gerenciado pela organização sem fins lucrativos Python Software Foundation.
A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros. (fonte: Wikipedia)

Isso significa que python visa facilitar o trabalho do programador, sendo uma linguagem simples, de fácil aprendizado e ao mesmo tempo muito poderosa, graças aos módulos desenvolvidos para ela.

Neste artigo vamos dar o primeiro passo para o desenvolvimento de aplicações com esta linguagem.

Instalação
Ambiente Linux
A instalação em ambiente Linux é bem simples. Abra seu gerenciador de pacotes (em distros derivadas do Debian, geralmente utiliza-se o Synaptic) e procure pelo pacote python. Você pode encontrar diversas versões do mesmo, como python2.5, python 2.6, etc. Escolha uma versão para instalar em seu sistema. Não recomendo instalar a última versão, ainda mais se ela for beta. É mais seguro instalar uma versão um pouco anterior. Hoje, 14 de Fevereiro de 2010, a versão 3.0 é a mais recente, mas recomendo a instalação da versão 2.5 ou 2.6 .

Ambiente Windows
Para a instalação do python em ambiente windows, baixe o instalador aqui . O procedimento de instalação é simples e intuitivo (basicamente consiste em confirmar todas as opções)

Primeiro exemplo: Alô Mundo!!!
Nosso primeiro exemplo de código python é ridiculamente simples. Abra seu editor preferido e adicione as seguintes linhas:
#!/usr/bin/env python
# apenas para quem usa linux, adicionar a linha acima

# -*- coding: iso-8859-15 -*-
print “Alo mundo!!!”
Pronto. Salve o arquivo como alomundo.py.

Compreendendo o código
Compreender o exemplo acima não é difícil. A primeira linha (#!/usr/bin/env python) diz para o Linux que este arquivo é um script python e que, na execução, deve ser enviado para o interpretador python, que irá executar os comandos em tempo real, como uma máquina virtual. No caso do Windows, a extensão .py é relacionada ao interpretador python.
A linha logo abaixo é um comentário. Comentários são ignorados pelo compilador/interpretador, portanto pode-se colocar o que quiser neles.
Na linha 4 temos a indicação da codificação do arquivo. Todo arquivo texto é escrito sob uma codificação.O sistema deve ser capaz de traduzir o texto conforme a codificação informada e mostrar (principalmente) a acentuação correta. Muitas vezes, a codificação padrão do sistema não condiz com a utilizada no arquivo, então temos de informá-la manualmente, para forçarmos o sistema a usar a codificação correta. Isso evita problemas com acentuação. A quarta linha indica que o arquivo foi escrito utilizando codificação iso-8859-1, que aceita acentuação. Em muitos casos, códigos de programas são escritos em unicode (geralmente, UTF-8), o que torna o uso de caracteres especiais mais complexo.

A sexta linha possui apenas a instrução print e uma mensagem entre aspas que será exibida na tela.
Códigos python não precisam ser encerrados com “;” , como na maioria das linguagens de programação. A existência de uma nova linha determina o fim da linha anterior. A identação do código também é diferente, mas será discutida mais adiante.

Uma experiência nova
Quando instalamos o python, obtemos um interpretador dinâmico (para usuários Linux, pode-se encontrálo no menu aplicações > programação > python e para usuários Windows, está em iniciar > programar python idle (gui) )
A janela que se abre é um canal direto para o interpretador da linguagem, ou seja, o python vai executando todas as linhas que forem digitadas nesta janela. Quer fazer um teste? Abra o interpretador e digite: “ print 2 + 2 ” . Além da mensagem ser mostrada imediatamente depois do Enter ser pressionado (nenhuma linha será executada sem que o Enter seja pressionado), a expressão é lida como um cálculo e processada. Por isso o resultado é 4. Se colocar a expressão entre aspas, ele irá interpretar os números como se fossem string ( letras ) e escreverá “ 2 + 2 ” na tela. Mas sem as aspas, os números são interpretados como números mesmo e o cálculo é realizado.
Faça alguns teste com print utilizando (ou não) as aspas e apóstrofos ( popular “aspas simples” ) e observe o resultado.

quinta-feira, 14 de julho de 2011

Apostila PHP e MySQL

Há algum tempo atrás escrevi uma apostila de PHP e MySQL para servir como material didático em cursos que ministrei. O material foi feito especialmente para iniciantes, explicando em detalhes o básico sobre programação para quem está começando no desenvolvimento web.
O site scribd disponibiliza este material atualmente. Para baixar, é necessário estar logado no site (pode-se usar sua conta do facebook para o login). Após logar-se você pode baixar a apostila de PHP e MySQL nas versões PDF ou TXT. O material está disponibilizado sob licença creative commons.

Caso não consiga baixar via Scribd, tente fazer o download diretamente do meu Dropbox pelo link abaixo (é preciso compartilhar o link para poder baixar o arquivo).


 Bom download e bons estudos :D

quinta-feira, 16 de junho de 2011

PHP: protegendo formulários de ataque XSS

O ataque XSS consiste em enviar um script pelo formulário (seja de cadastro, login, etc) para ser executado pelo servidor. Muitas pessoas utilzam-se dessa técnica para capturar dados de um site, como dados de sessão, senhas, etc.
Prevenir esse tipo de ataque é muito simples. Nesse post vou apresentar alguns comandos que são uma 'mão na roda' contra esse tipo de ataque:

htmlentities():
Essa função transforma caracteres especiais (e letras com acento) html em entidades html. Exemplo:
Ele converte o sinal '<' em '&lt;' e o sinal '>' em '&gt;' . Dessa forma, impede que códio PHP seja executado quando o script interpretar os dados do formulário. Ele também é utilizado para tratar caracteres com acento, já que os converte em suas respectivas entidades html. Exemplo: a palavra 'ação' depois de tratada por essa função é convertida em 'a&ccedil;&aacute;o' , permitindo melhor interpretação do navegador.
Obs: Para que a conversão de caracteres acentuados ocorra corretamente, use essa função combinada com utf8_decode().

Exemplo de uso:
$comentario = htmlentities(utf8_decode($_POST['comentario']));

Dessa forma, o comentário enviado tem seus caracteres especiais convertidos como nos exemplos acima.

strip_tags()
Problema resolvido! Ainda não. Se o conteúdo do comentário for um código javascript como esse:
'<script>alert('eu sou o XSS!');</script>'. Por se tratar de código javascript, pode ser executado pelo navegador do cliente na hora em que for exibido no site. O ideal seria remover todas as tags html do conteúdo, certo? Então vamos utilizar a função strip_tags(). Ele remove todas as tags html do código (removendo assim a tag script), impedindo a execução de códigos como esse. Além disso, remove a formatação feita pelo usuário, que geralmente causa problemas de layout (usuário altera o tamanho da letra usando a tag font, por exemplo).

Vamos então melhorar nosso código:
$comentario = htmlentities(utf8_decode(strip_tags($_POST['comentario'])));

O ideal é executar a função strip_tags() antes de htmlentities(), para que ele seja usado apenas para tratar os acentos.

addslashes():
Essa talvez seja uma das funções mais importantes a ser comentada aqui. Ela coloca uma barra '\' antes dos caracteres especiais, como aspas, apóstrofos, cifrões, etc. Em geral, ataques de injeção de SQL (quando o usuário mal intencionado tenta enviar comandos sql pelo seu formulário para obter informações) são feitos utilizando-se de aspas ou apóstrofos, para manipular o código sql definido no script. Ao filtrar os dados com essa função, as aspas e apóstrofos não serão tratadas como delimitadoras da string, mas como parte dela, evitando assim esse tipo de ataque.

Nosso código agora está assim:
$comentario = addslashes(htmlentities(utf8_decode($_POST['comentario'])));

trim():
Por último e não menos importante, a função trim remove espaços em branco do início e do fim da string. Eu sei, isso não ajuda em nada na segurança do site, mas previne erros na hora da gravação. Espaços em branco são considerados parte da string. E se por acaso você tiver um campo no banco de dados que aceita apenas 30 caracteres e o usuário envia 31 (incluindo os espaços)? O resultado é um erro na hora da gravação. Para evitar esse tipo de dor de cabeça, o melhor que temos a fazer é prevenir esse tipo de situação.

Agora, o código final:
$comentario = addslashes(htmlentities(utf8_decode(trim($_POST['comentario']))));

Extenso, não? Mas previne muita dor de cabeça. Para facilitar sua vida, crie uma função que execute todas as citadas acima:

function tratarStrings($string){
    return addslashes(htmlentities(utf8_decode(trim($string))));
}
Em seguida, basta executá-la onde for necessário:
$comentario = tratarStrings($_POST['comentario']);

Campos de data (que geralmente estão no formato dd/mm/aaaa) podem ser tratados tranquilamente com essa função.
Caso a informação ser tratada seja um número inteiro ou de dupla precisão ('quebrado'), pode-se converte-lo da seguinte forma:
$id = (int) $_GET['id'];
$valor = (double) $_POST['valor'];

Dessa forma, os números enviados serão convertidos para os tipos informados entre parênteses. Se a informação enviada for uma string, o resutado será zero.

Dúvidas? Deixe nos comentários :D