Construindo uma aplicação PHP à prova de balas (Por Rafael Jaques)
Posted by Thiago Colares in PHP on July 6, 2010
Pessoal, acabei de ler este slide compartilhado pelo Rafael Jaques do phpit.com.br. Muito bacana mesmo! É tudo que se precisa saber para se abrir a mente com relação à segurança de uma aplicação PHP. Não deixem de ler!
Workshop Online de Zend Framework – School of Net: 31/07/2010
Posted by Thiago Colares in Eventos, Zend Framework on July 1, 2010
Remake de Doom com uma nova arma: Vuvuzela
Posted by Thiago Colares in Outros on June 29, 2010
Creio que 95% dos leitores deste blog já jogaram Doom (pelo menos os que tiverem mais do que uns 22 anos de idade). Então curtam esse remake com uma nova “super arma”…
Tutorial Series: Orientação a objetos utilizando PHP #1
Posted by Thiago Colares in Desenvovimento em Geral, PHP on June 14, 2010
Ver Tutorial Series: Orientação a objetos utilizando PHP
Introdução a orientação a objetos
Um pouco de história
O conceito de programação orientada a objeto não é algo novo. No final da década de 60, a linguagem Simula67, desenvolvida na Noruega, introduzia conceitos hoje encontrados nas linguagens orientadas a objetos. Em meados de 1970, o Centro de Pesquisa da Xerox (PARC) desenvolveu a linguagem Smalltalk, a primeira totalmente orientada a objetos. No início da década de 80, a AT&T lançou a Linguagem C++, uma evolução da linguagem de programação C em direção à orientação a objetos. Atualmente, um grande número de linguagens incorpora características de orientação a objeto, tais como Java, Object Pascal, Python , PHP etc.
Conceitos básicos
O paradigma de programação orientada a objeto é baseado em alguns conceitos que definem uma forma de criar programas para computadores.
A filosofia principal desse paradigma de programação é solucionar um problema (via programação) através da representação computacional dos objetos existentes nesse problema (objetos do mundo real), usando para isso os conceitos mencionados acima. Com isso, essa maneira de se desenvolver programas fica mais próxima das situações, dos problemas como eles acontecem no mundo real. Será um pouco difícil entender todas as vantagens de OO (Orientação a Objetos). Agora, portanto, vamos mencionar apenas duas:
- É mais fácil conversar com o cliente que pediu o software se falarmos com objetos que existem no mundo dele (o mundo do software fica mais perto do mundo real).
- O software feito com OO pode ser feito com maior qualidade e pode ser mais fácil de escrever e, principalmente, alterar no futuro.
O nosso mundo está repleto de objetos, sejam eles concretos ou abstratos. Qualquer tipo de objeto possui atributos (características) e comportamentos que são inerentes a esses objetos.
Exemplos de objetos CONCRETOS:
1) Caneta
Atributos de qualquer Caneta:
- Altura
- Espessura
- Cor
Nesse caso, o nosso objeto Caneta tem os seguintes dados em cada característica:
- Altura: 10 cm
- Espessura: 2 cm
- Cor: rosa
Comportamentos
- Desenhar
- Escrever
- Etc.
2) Pessoa
Atributos de qualquer Pessoa:
- Altura
- Peso
- Idade
Nesse caso, o nosso objeto Pessoa tem os seguintes dados em cada característica:
- Altura: 1,80
- Peso: 70
- Idade: 25
Comportamentos de qualquer Pessoa:
- Andar
- Sorrir
- Ler
- Etc.
Exemplos de objetos que NÃO SÃO CONCRETOS:
1) Retângulo
Atributos de qualquer retângulo:
- Base
- Altura
Nesse caso, o nosso objeto retângulo tem os seguintes dados em cada característica:
- Base: 10
- Altura: 5
Comportamentos de qualquer Retangulo
- Calcular área
- Calcular perímetro
- Etc.
2) Disciplina
Atributos de qualquer Disciplina:
- Código da disciplina
- Nome da disciplina
Nesse caso, o nosso objeto Disciplina tem os seguintes dados em cada característica:
- Código da disciplina: 1
- Nome da disciplina: Álgebra Linear
Comportamentos de qualquer Disciplina
- Listar o nome da disciplina
- Etc.
Para usar objetos na programação, primeiro precisamos distinguir entre um objeto real e a representação de um objeto. No desenvolvimento de programas, sempre trabalhamos com representações de objetos. Essa representação precisa refletir os objetos reais, ou seja, objetos existentes no problema do mundo real que queremos solucionar. Por exemplo, um sistema de conta corrente não manipula diretamente os clientes, contas e cheques (esses são os objetos reais do problema).
Em vez disso, o software deve criar representações desses objetos, com os mesmos atributos e comportamentos dos objetos do mundo real. Essa representação é chamada de ABSTRAÇÃO.
Para entender isso, vamos voltar ao exemplo do sistema de conta corrente.
No mundo real existem vários objetos Cliente, vários objetos Conta e vários objetos Agência (pode ser somente um), ou seja, muito provavelmente não existirá somente um cliente, uma conta e uma agência.
Todos os objetos cliente possuem o mesmo conjunto de atributos, por exemplo, todos os objetos cliente possuem nome e endereço, assim como todos os objetos conta possuem um número, um saldo, um histórico de transações e todos os objetos agência possui um número e um nome.
Assim como os atributos, todos os objetos de um mesmo tipo compartilham do mesmo conjunto de comportamentos, por exemplo, todos os objetos Cliente fazem depósitos e saques.
Apesar de cada objeto ter o mesmo conjunto de atributos, cada objeto possui valores próprios para cada atributo, ou seja, cada objeto é único.
Essa explicação para objetos do mundo real vale para quando trabalhamos com a representação desses objetos no contexto de desenvolvimento desse sistema (programação).
Portanto, podemos perceber que o sistema de conta corrente (programa de conta corrente) será composto de vários objetos, cada qual com um conjunto de atributos e comportamento em comum (se forem do mesmo tipo) e com valores próprios nos seus atributos. A figura abaixo ilustra os vários objetos cliente, conta e agência.
O termo instância é freqüentemente usado para descrever um objeto com valores próprios em seus atributos. Por exemplo, observe a figura acima:
- Ana é uma instância de Cliente
- 9916 é uma instância de Conta
Todo objeto deve ter:
- Estado
- Comportamento
- Identidade
1) Estado
É representado pelos valores dos atributos de um objeto em um determinado instante do tempo. O estado do objeto usualmente muda ao longo da existência do objeto.
2) Comportamento
Determina como um objeto age e reage: suas modificações de estado e interações com outros objetos.
O comportamento é determinado pelo conjunto de operações ou métodos que o objeto pode realizar. Operações ou métodos são algo que você pede para o objeto fazer, como fazer um depósito (comportamento de qualquer objeto do tipo Conta).
Fazer depósito é um comportamento de qualquer objeto do tipo Conta e não de qualquer objeto do tipo Cliente, como você deve ter pensado a princípio.
Isso acontece porque há diferenças grandes quando pensamos no comportamento de representações de objetos, ou seja, objetos do mundo do software.
Ao identificar comportamentos de objetos do mundo do software devemos levar em conta os seguintes princípios:
- Primeiro princípio: não vamos modelar todo o comportamento dos objetos. Exemplo: Clientes tomam café no mundo real, mas provavelmente não no software.
- Segundo princípio: os comportamentos freqüentemente são assumidos por objetos diferentes. Exemplo: No mundo real, quem faz um depósito? Um Cliente.
No software, quais objetos assumiriam a responsabilidade de fazer um depósito? Objetos do tipo Conta.
A primeira grande regra de programação Orientada a Objeto é a seguinte:
“Comportamentos são associados aos objetos que possuem os atributos afetados pelo comportamento”.
Um depósito afeta duas coisas, do ponto de vista de um sistema bancário:
- O saldo de uma conta.
- O histórico de transações feitas a uma conta.
Como se pode ver, o depósito afeta apenas atributos de uma Conta. Portanto, esse comportamento está associado à Conta e não ao Cliente, embora, no mundo físico, seja o Cliente que faz o depósito.
Outros comportamentos associados aos objetos do tipo Conta:
- Fazer um saque, informar seu saldo, etc.
3) Identidade
Refere-se à identificação do objeto. Como cada objeto é único, ou seja, tem seus próprios valores nos atributos, ele deve ser identificado por algum nome. Mesmo que seu estado seja idêntico ao de outro objeto ele tem identificação própria.
A identificação do objeto do tipo Agência mostrado na figura abaixo é Centro. Esse objeto poderia ter qualquer nome identificando-o.
Agora você já sabe que qualquer programa orientado a objeto deve trabalhar com representações de objetos que reflitam as características e comportamento de objetos do mundo real e já aprendeu os principais conceitos relacionados a objetos.
No sistema de conta corrente foram identificados, a princípio, 3 tipos ou grupos de objetos: Cliente, Agência e Conta.
Sabemos que poderão existir vários objetos de cada um desses tipos e todos eles irão possuir o mesmo conjunto de atributos e comportamentos do seu tipo.
Para criar uma representação de cada objeto dentro do programa, devemos antes criar uma estrutura, uma espécie de molde ou template que represente os atributos e comportamentos do tipo do objeto.Essa estrutura é chamada de classe.
Portanto, devemos ter uma classe Cliente, uma classe Agência e uma classe Conta.
É a partir dessa estrutura conhecida como classe que iremos criar as representações de objetos que precisamos para desenvolver o programa, ou seja, precisamos criar a estrutura (classe) apenas uma vez e, a partir dela, serão criadas as representações dos objetos.
Classes e Objetos
Uma classe é a descrição de atributos e comportamentos de um grupo de objetos com propriedades similares (atributos) e comportamento comum (operações ou métodos).
Por representar atributos e comportamento de um determinado tipo de objeto que existe no mundo real, uma classe é uma abstração da realidade, pois nela estão especificados somente parte dos atributos e comportamentos de um objeto do mundo real. Somente parte, porque não são todos os atributos e comportamentos dos objetos do mundo real que interessam ao sistema.
A figura a seguir, ilustra a representação gráfica das classes do sistema de conta corrente. Na primeira parte da figura está o nome da classe, na parte do meio, estão os atributos e, na parte final, está o comportamento (métodos ou operações).
Observe que a classe Conta e Agencia ainda não estão com os comportamentos definidos. Faremos isso na medida que avançarmos nos conceitos de OO.
Um objeto é uma instância de uma classe. Essa instância possui valores próprios em cada atributo definido na classe. As figuras a seguir ilustram a classe Cliente e os vários objetos (instâncias) da classe Cliente.
A notação que estamos utilizando para representar classes e objetos é a utilizada pela UML (Unified Modelling Language) ou Linguagem de Modelagem Unificada. A UML não é uma linguagem de programação e sim, uma linguagem composta de vários diagramas (cada qual com seu conjunto de símbolos gráficos) que expressam como um sistema orientado a objetos deve funcionar. Ela é utilizada nas fases iniciais do desenvolvimento de um software, ou seja, antes da programação propriamente dita, com o objetivo de especificar e documentar o funcionamento do sistema. O diagrama que iremos utilizar é o Diagrama de Classes que especifica as classes do sistema e o relacionamento entre elas.
Para finalizar este módulo, uma pequena revisão:
Um programa orientado a objeto é composto por vários objetos do mesmo tipo e de outros tipos que se relacionam. Chamamos esses objetos do mundo do software de representações de objetos. Como num programa muito provavelmente existirão vários objetos do mesmo tipo, devemos criar uma estrutura ou template que represente os atributos e comportamentos desses objetos do mesmo tipo, essa estrutura é chamada de classe. Portanto classe é uma estrutura a partir da qual os objetos (do software) são criados.
Dúvidas? Comentem! Até a próxima!
Tutorial Series: Orientação a objetos utilizando PHP
Posted by Thiago Colares in Desenvovimento em Geral, PHP on June 14, 2010
Pessoal, boa tarde!
Vou iniciar (esta semana se possível) uma série de tutoriais sobre orientação a objetos utilizando o PHP. Sempre tive um certo “bloqueio” com orientação a objetos. Se você ainda fica meio perdido na orientação a objetos, esta pode ser uma boa hora pra aprender! Usarei como base um material de EaD muito bom criado pela Andréa Bordin. No material, a linguagem utilizada foi o Java. Meu trabalho será transcrevê-lo para o PHP.
PS: Nos tutoriais irei partir do princípio que você já sabe PHP, mas podem tirar dúvidas à vontade nos comentários.
Iremos começar com um módulo introdutório em breve.
Um abraço!
Um vídeo bacana sobre o Linux…
Posted by Thiago Colares in Linux on June 14, 2010
“O futuro é aberto.”
Caixa filia-se ao consórcio WWW – W3C
Posted by Thiago Colares in Outros on June 10, 2010
Adesão ao World Wide Web Consortium permitirá ao banco ampliar a oferta de serviços baseada na Internet e promover maior acessibilidade dos cidadãos às novas tecnologias.
A Caixa Econômica Federal e o World Wide Web Consortium (W3C) firmaram, hoje(9), em São Paulo (SP), a assinatura de adesão do banco ao consórcio. Com o acordo, a Caixa é a primeira instituição financeira do Brasil a se filiar a esse consórcio internacional de empresas que é voltado ao desenvolvimento de tecnologias visando ao crescimento da Internet em todo o mundo.
A ação foi realizada durante o encontro do CIAB-Febraban com a participação da vice-presidente de Tecnologia da CAIXA, Clarice Copetti, que declarou na ocasião: “A CAIXA possui 49 milhões de clientes, temos um dos sites bancários mais acessados do mundo pela diversidade de serviços que prestamos à população brasileira como habitação, loterias e fundo de garantia e, portanto, precisamos implementar os padrões que ampliem e facilitem acesso a informações e serviços deste banco 100% público”.
Também presente na mesma oportunidade, o gerente do escritório do W3C no Brasil, Vagner Diniz, observou que “a iniciativa da CAIXA, além de proporcionar acesso às novas tecnologias como HTML 5 e CSS 3, também vai inserí-la na discussão internacional em torno de padrões específicos para acesso a dados financeiros na web (XBRL) e para segurança da informação (XML Security)”.
Com a filiação, a CAIXA vai poder se relacionar continuamente com os maiores especialistas do mundo da Web que definem os padrões internacionais. Assim, poderá se antecipar ao mercado na oferta aos seus usuários de sítios na Internet que se caracterizem pela excelência em acessibilidade, independência de navegadores, dispositivos e plataformas operacionais, garantindo dessa forma total interoperabilidade. Trata-se, portanto, de uma iniciativa cujo propósito é proporcionar de fato uma Web para todos.
Além disso, a filiação é de grande relevância para a empresa, já que vem ao encontro de sua política de inovação tecnológica, alinhada às diretrizes do Governo Federal, aderente aos padrões abertos estabelecidos que prevejam a oferta de produtos e serviços com uso intensivo de Tecnologia da Informação e Comunicação.
Fonte: Carlinhos Cecconi (W3C Brasil) por email
W3C Brasil: http://www.w3c.br/
Quando programadores vão ao oftalmologista…
Posted by Thiago Colares in Outros on May 18, 2010
Controle de acesso com Zend_Acl
Posted by Thiago Colares in PHP, Zend Framework on May 5, 2010
A muito tempo não posto um bom “php” por aqui, então vamos lá… A algum tempo postei sobre Zend_Auth e fiquei devendo um post sobre Zend_Acl.
Problemas com controle de acesso viram soluções com Zend_Acl. A alguns meses precisei implementar o controle de acesso para um sistema com ZF e me encantei com a facilidade e praticidade do Acl. Primeiro, alguns conceitos básicos…
Roles: São os perfis definidos. Basicamente, quem tem ou não acesso.
Resources: São as funcionalidades a serem controladas.
Usarei como exemplo o código que implementei já citado anteriormente. Criamos uma tabela simples para as funcionalidades, uma para perfis e duas tabelas associativas: uma entre perfis e funcionalidades e outra entre usuários e funcionalidades. Para abreviar, vou mostrar somente a tabela de funcionalidades:
-
cd_funcionalidade NUMBER NOT NULL,
-
descricao VARCHAR2(150) NOT NULL,
-
funcionalidade VARCHAR2(200) NOT NULL,
-
PRIMARY KEY(cd_funcionalidade));
Nesta tabela de funcionalidades será cadastrado uma descrição e a url da funcionalidade (resource). Ex: /usuarios ou /administracao/perfil
Assim que o usuário se autentica no sistema, redireciono ele para um controller chamado “acesso” para montar o objeto Acl. Neste exemplo, o usuário pode ter as funcionalidades definidas pelo perfil ou definidas diretamente para ele. Da seguinte forma…
-
-
//Model da tabela associativa entre Usuário e Perfil
-
$objPerfilUsuario = new PerfilUsuario();
-
-
//Model da tabela de funcionalidades
-
$objFuncionalidade = new Funcionalidade();
-
-
//Dados da autenticação do usuário…
-
$nsAutenticacao = new Zend_Session_Namespace('autenticacao');
-
-
$idUser = $nsAutenticacao->id;
-
-
//Recuperando os dados do perfil do usuário
-
$arrPerfil = $objPerfilUsuario->getPerfilUsuario($idUser);
-
-
$nsAutenticacao->idPerfil = $arrPerfil['idPerfil'];
-
$nsAutenticacao->perfil = $arrPerfil['perfil'];
-
-
//Criando o objeto Acl
-
$acl = new Zend_Acl();
-
-
//Crio uma role com o nome do perfil do usuário
-
$acl->addRole(new Zend_Acl_Role($arrPerfil['perfil']));
-
-
//Funcionalidades definidas por perfil
-
-
//Recupero as funcionalidades definidas para o perfil…
-
$arrFuncionalidades = $objFuncionalidade->getFuncionalidadesAcl($arrPerfil['idPerfil']);
-
-
//Em um foreach, adiciono ao objeto Acl as funcionalidades (resources) e a permissão
-
foreach($arrFuncionalidades['allow'] as $array) {
-
$acl->add(new Zend_Acl_Resource($array));
-
$acl->allow($arrPerfil['perfil'],$array);
-
}
-
-
if(isset($arrFuncionalidades['deny'])){
-
foreach($arrFuncionalidades['deny'] as $array) {
-
$acl->add(new Zend_Acl_Resource($array));
-
$acl->deny($arrPerfil['perfil'],$array);
-
}
-
}
-
-
//Funcionalidades definidas por usuário
-
-
//Model da tabela associativa entre usuário e funcionalidade…
-
$objUserFunc = new UsuarioFuncionalidade();
-
-
//Recupero as funcionalidades definidas para o usuário
-
$arrFuncUser = $objUserFunc->getFuncionalidadesAcl($idUser);
-
-
//Como a role já está criada no objeto Acl, apenas adiciono as permissões…
-
foreach($arrFuncUser as $arr) {
-
$acl->allow($arrPerfil['perfil'],$arr);
-
}
-
-
//Crio um namespace para o objeto Acl
-
$ns = new Zend_Session_Namespace();
-
$ns->acl = $acl;
Obs: Nos métodos getFuncionalidadesAcl() das modelos utilizadas retorno um array com a seguinte estrutura: array(’idDaFuncionalidade’ => ‘Url da funcionalidade’). No caso da model Funcionalidades, existe uma particularidade: o array “deny”:
-
-
public function getFuncionalidadesAcl($idPerfil) {
-
-
$select = 'Seu sql';
-
-
$rs = $this->fetchAll($select)->toArray();
-
$arrFinal = array();
-
-
foreach($rs as $arrAllow) {
-
-
$arrFinal['allow'][$arrAllow['cd_funcionalidade']] = $arrAllow['TX_URL'];
-
-
}
-
-
unset($rs);
-
-
$rs = $this->fetchAll()->toArray();
-
-
/** Neste foreach eu verifico se existe alguma funcionalidade que está cadastrada na tabela funcionalidades
-
* mas não está definida para o perfil. Se existir, precisamos tirar a permissão de acesso a ela.
-
* Toda funcionalidade que não estiver cadastrada na tabela de funcionalidades tem seu acesso liberado.
-
*/
-
-
-
foreach($rs as $arrDeny) {
-
if((!array_key_exists($arrDeny['cd_funcionalidade'], $arrFinal['allow'])) AND ($arrDeny['funcionalidade'])) {
-
$arrFinal['deny'][$arrDeny['cd_funcionalidade']] = $arrDeny['funcionalidade'];
-
}
-
}
-
-
return $arrFinal;
-
-
}
Pronto, o objeto Acl está criado e com as permissões setadas. Agora basta fazer a verificação sempre que o usuário tentar acessar os controllers do sistema. No caso deste exemplo, temos uma classe que extende da Zend_Controller_Action, ou seja, qualquer redirecionamento do sistema passará por ela. Nesta classe, adicionei o seguinte código para realizar a verificação da permissão:
-
-
//Recupero o objeto Acl do namespace…
-
$ns = new Zend_Session_Namespace();
-
-
if(isset($ns->acl)) {
-
$acl = $ns->acl;
-
//Monto a Url que está tentando ser acessada para a verificação…
-
$url = '/'.$this->_request->getControllerName().'/'.$this->_request-getActionName();
-
-
if($acl->has($url)) {
-
-
//Recupero os dados de autenticação do usuário…
-
$nsAutenticacao = new Zend_Session_Namespace('autenticacao');
-
-
//Verifico se o perfil do usuário tem acesso à url
-
if(!$acl->isAllowed($nsAutenticacao->perfil, $url)) {
-
-
//Caso não seja, redireciono o usuário para algum lugar avisando que ele não tem acesso…
-
$this->_redirect('/index/sem-acesso');
-
}
-
}
-
}
Caso o usuário tenha o acesso, não preciso fazer nada… Apenas deixo a requisição continuar a sua execução e o usuário chegará à url.
Simples, não? Caso tenha alguma dúvida ou tenha alguma crítica ou sugestão para melhorar, deixe seu comentário ou entre em contato por email
Um abraço!
Uma mão na roda… IE TAB
Posted by Thiago Colares in Desenvovimento em Geral on April 27, 2010
Creio que a maioria dos programadores web (inclusive eu) programa sempre utilizando o Firefox. E também creio que a maioria também (inclusive eu) sempre esquece de testar seus sistemas no Internet Explorer.
Pois é, passei por isso hoje aqui no trabalho. O CSS de uma tela funciona 100% no IE 8 mas não funciona no IE 7. Um amigo me indicou um plugin do Firefox bem bacana chamado IE TAB. Ele emula a visualização do Internet Explorer em uma aba do Firefox. Além disso, você ainda pode criar uma listra de filtros para definir os sites que você quiser sempre visualizar na aba “emulada” do IE.
O único “porém” que encontrei até agora foi que não consigo utilizar o Firebug nas abas do IE… Caso encontre alguma solução para isso, aviso a vocês.
Enfim, uma mão na roda para designers e programadores. Recomendo!
Update em 28/04/2010:
Uma outra opção para quem possui o Internet Explorer 8 instalado é o modo de compatibilidade. No IE 8, pressionando F12 (ou Ferramentas -> Ferramentas para desenvolvedores) é exibido uma ferramenta “parecida” com o Firebug. Basta selecionar o “Modo do Navegador”. Resolveu meu problema de testes no IE 8 e IE 7…





