Image Image Image Image Image
Scroll to Top

Topo

php

21

maio
2012

Sem Comentários

Em Blog
Código
PHP

Por Allison

Sparks: abrindo novos horizontes para o CodeIgniter

Em 21, maio 2012 | Sem Comentários | Em Blog, Código, PHP | Por Allison

Fonte: Ademir Cristiano Gabardo/IMaster

O assunto não é tão novo assim, mas vem se tornando popular a cada dia e é provável que, daqui a algum tempo, tudo o que você precisar acoplar ao seu framework seja feito pelo sparks.

O CodeIgniter está se popularizando muito desde a mudança da metodologia de atualizações e da aceitação da comunidade internacional de desenvolvedores como parte colaboradora para novas funcionalidades. A velocidade com que o framework cresce e se estrutura vem ganhando proporções mais atraentes para profissionais e empresas desenvolvedoras de software.

Aplicativos que consomem serviços, uso da soluções REST, do SOAP, ORMs, sistemas de templates e, é claro, muitos “módulos” de terceiros fazem parte deste caminho. É possível encontrar bibliotecas para quase tudo, desde autenticação de usuários a templates. Essa evolução trouxe a necessidade de gerenciar a instalação desses módulos. E, com isso, surgiu o sparks.

Mas, então, o que é sparks?

Segundo o website sparks.org, “sparks é um sistema de gestão de pacotes para CodeIgniter que lhe permitirá instalar bibliotecas de alta qualidade em seus aplicativos instantaneamente”.

Que tal entender melhor na prática? Para isso, vamos criar um aplicativo capaz de exibir a sua timeline do Twitter:

1. Comece baixando a última versão do CodeIgniter. Descompacte em um caminho que possa ser acessado pelo seu servidor web. Eu escolhi uma pasta chamada “sparks”. Desse modo, posso acessar em http://localhost/sparks/. Até esse ponto, nada de diferente foi feito e nesse momento você deverá ver a tela de boas vindas do CodeIgniter.

2. Na pasta raíz do seu projeto, crie uma pasta chamada “tools”. Então, vamos seguir os passos encontrados neste artigo.

3. Baixe o arquivo spark-manager.zip aqui.

4. Descompacte o conteúdo do arquivo que você acabou de baixar. Você deverá ter na pasta “tools” um arquivo chamado spark sem nenhuma extensão.

5. Agora será necessário criar uma classe Loader, estendendo a classe Loader do CodeIgniter. Acesse aqui para obter o código fonte; copie-o para o seu editor e salve-o em “applicatton/core” com o nome de arquivo MY_Loader.php.

6. Estamos prontos para começar! Agora vamos utilizar o prompt de comando para obter os sparks seguindo os passos “Get Sparks” aqui.

Abra o seu prompt do DOS (Iniciar->Executar e digite CMD). Navegue até a pasta do projeto. No meu caso, CD C:/Webs/2012/Sparks. Obedeçam ao caminho de acordo com a instalação do seu servidor web. Você deverá ver algo como a tela a seguir:

Obs: Usuários do Linux provavelmente já sabem o que têm que fazer no Terminal.

Então, vamos utilizar o PHP via linha de comando para instalar um spark de exemplo, digitando o seguinte:

php tools\spark install -v1.0.0 example-spark

Embora apresentando um erro, o comando foi executado com sucesso exibindo ao final a mensagem “You´re on Fire!”, indicando que o conteúdo foi baixado e descompactado de acordo com o esperado.

Agora que o sparks “example” foi baixado e adicionado à pasta do projeto, você deverá ver na raíz do projeto uma pasta “sparks” com uma subpasta “example-spark” e a estrutura dos arquivos partindo da versão do spark instalado.

Para testar, abra o controlador e adicione o seguinte código ao método index da classe Welcome (estou presumindo que você não alterou nada além em seu projeto):

public function index(){      $this->load->spark('example-spark/1.0.0');
$this->example_spark->printHello(); }

Se tudo correr bem, ao acessar a URL no navegador, você deverá visualizar algo semelhante à figura a seguir:

Se você chegou até este ponto, tudo foi feito corretamente e poderemos prosseguir para nosso aplicativo.

Obtenha o CURL instalando via sparks com o seguinte comando no prompt:

php tools\spark install –v1.2.1 curl

E você deverá ver algo como a tela a seguir:

O próximo passo será, então, obter o RestClient. Do mesmo modo, digite no prompt de comando:

php tools\spark install –v2.1.0 restclient

Se tudo correr bem, ao final da operação, algo semelhante a tela a seguir será exibido:

Pronto, agora temos CURL e um cliente REST disponíveis, vamos aproveitar e utilizar para obter a timeline do Twitter. Precisamos alterar o método index da classe welcome para o seguinte código fonte:

public function index(){    $this->load->spark('curl/1.2.1');
$this->load->spark('restclient/2.1.0');
// Carregando a biblioteca Rest    $this->load->library('rest');
// Inicializando apontando o servidor do Twitter.
$this->rest->initialize(array('server'=> 'http://twitter.com/'));
// Recebendo os twitters do usuário agabardo, troque para o seu usuário.
$tweets = $this->rest->get('statuses/user_timeline/agabardo.xml');

//Exibindo na tela para propositos de teste.
echo "<pre>";    print_r($tweets);    echo "</pre>";
}

E, se tudo correr bem, você deverá visualizar a array com o conteúdo da sua timeline:

E como diriam meus amigos do Rio Grande: “mais simples que painel de Jipe”! Por isso acredito que muita coisa nova e boa deverá surgir empacotada com sparks.

Se você não tem afinidade com a linha de comando, existem outras alternativas, mas, convenhamos, digitar três ou quatro linhas no prompt do DOS ou terminal do Linux não é assim tão dolorido.

Não funcionou? Baixe os arquivos do projeto aqui.

***

Artigo original disponível em: http://codeigniter.com/news/a_quick_look_at_sparks

Abraços a todos!

Tags | , , ,

12

maio
2012

Sem Comentários

Em Blog
PHP

Por Allison

Criando uma biblioteca para controle de acesso por usuário com CodeIgniter

Em 12, maio 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: Ademir Cristiano Gabardo/IMasters

As aplicações PHP estão se tornando a cada dia mais complexas. Aplicações de uso comercial, acadêmico e das mais diversas finalidades fazem necessário um controle mais apurado de acesso.

No CodeIgniter, estamos, obrigatoriamente, sempre acessando uma classe e um método de um controlador. Dessa forma, é possível mapear todas as possíveis ações e/ ou caminhos disponíveis em uma aplicação e adicionar o controle de acesso aos métodos que desejamos controlar.

Eu desenvolvi uma biblioteca (library) para controlar o acesso dos usuários. O seu funcionamento se dá da seguinte forma: em uma tabela no banco de dados (sys_metodos), ficam guardados os nomes de classe e os métodos, mapeando todos os possíveis caminhos. Em outra tabela (sys_permissoes), ficam as ids dos usuários com os respectivos métodos a que eles têm acesso. Essa segunda tabela está relacionada à tabela de cadastro de usuários (tb_usuarios).

Figura 01: Estrutura das tabelas necessárias ao sistema de autenticação.

Seria bastante trabalhoso ter que popular a tabela de métodos manualmente, ou criar um Admin para ela. Dessa forma, inclui uma rotina na própria biblioteca, para que quando um método invocado por ela não seja encontrado na tabela sys_metodos, ele seja automaticamente criado. Assim, na primeira vez em que um método for acessado, ninguém terá permissão de acesso, sendo, então, necessário parametrizar o sistema uma única vez no primeiro acesso. Depois pode-se construir uma área de administração para varrer a tabela de métodos e adicionar ou remover as permissões dos usuários.

O CodeIgniter provê uma maneira de checarmos “onde estamos”, ou seja, em que classe e em que método. Para verificar o nome da classe, utilize a seguinte linha de código.

$this->router->class

E para recuperar o nome do método utilize:

$this->router->method

Podemos passar para a biblioteca o caminho completo de onde estamos da seguinte forma:

$this->auth->check_logged($this->router->class , $this->router->method);

Auth é o nome da biblioteca e check_logged é o método que estamos acessando. Como essa biblioteca será acessada em muitas classes e métodos, é preferível carregar no autoload para que ela esteja sempre disponível em qualquer parte da aplicação. Para proteger um método, basta incluir a linha de código:

<?php
class AreaRestrita extends Controller {
function __construct(){
parent::Controller();
}
function index(){
$this->auth->check_logged($this->router->class , $this->router->method);
}
}
?>

Vejamos, então, como fica o código fonte da biblioteca. Salve-o com o nome de arquivo auth.php na pasta system/application/libraries:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Auth
{
private $ci;
public function __construct(){
$this->ci = &get_instance();
}
 
function check_logged($classe,$metodo)
{
/*
* Criando uma instância do CodeIgniter para poder acessar
* banco de dados, sessionns, models, etc...
*/
$this->CI =& get_instance();
 
/**
* Buscando a classe e metodo da tabela sys_metodos
*/
$array = array('classe' => $classe, 'metodo' => $metodo);
$this->CI->db->where($array);
$query = $this->CI->db->get('sys_metodos');
$result = $query->result();
 
// Se este metodo ainda não existir na tabela sera cadastrado
if(count($result)==0){
$data = array(
'classe' => $classe ,
'metodo' => $metodo ,
'apelido' => $classe .  '/' . $metodo,
'privado' => 1
);
$this->CI->db->insert('sys_metodos', $data);
redirect(base_url(). $classe . '/' . $metodo, 'refresh');
}
//Se ja existir tras as informacoes de publico ou privado
else{
if($result[0]->privado==0){
// Escapa da validacao e mostra o metodo.
return false;
}
else{
// Se for privado, verifica o login
$nome = $this->ci->session->userdata('nome');
$logged_in = $this->ci->session->userdata('logged_in');
$data = $this->ci->session->userdata('data');
$email = $this->ci->session->userdata('email');
$id_usuario =  $this->ci->session->userdata('id_usuario');
 
$id_sys_metodos = $result[0]->id;
 
// Se o usuario estiver logado vai verificar se tem permissao na tabela.
if($nome && $logged_in && $id_usuario){
 
$array = array('id_metodo' => $id_sys_metodos, 'id_usuario' => $id_usuario);
$this->CI->db->where($array);
$query2 = $this->CI->db->get('sys_permissoes');
$result2 = $query2->result();
 
// Se não vier nenhum resultado da consulta, manda para página de
// usuario sem permissão.
if(count($result2)==0){
redirect(base_url().'home/sempermissao', 'refresh');
}
else{
return true;
}
}
// Se não estiver logado, sera redirecionado para o login.
else{
redirect(base_url().'home/login', 'refresh');
}
}
}
}
 
/**
* Método auxiliar para autenticar entradas em menu.
* Não faz parte do plugin como um todo.
*/
function check_menu($classe,$metodo){
$this->CI =& get_instance();
$sql = "SELECT SQL_CACHE
count(sys_permissoes.id) as found
FROM
sys_permissoes
INNER JOIN sys_metodos
ON sys_metodos.id = sys_permissoes.id_metodo
WHERE id_usuario = '" . $this->ci->session->userdata('id_usuario') . "'
AND classe = '" . $classe . "'
AND metodo = '" . $metodo . "'";
$query = $this->CI->db->query($sql);
$result = $query->result();
return $result[0]->found;
}
}

Note que a biblioteca se encarrega de inserir os dados de métodos e classes que ainda não estão cadastrados na tabela sys_metodos.

Quando um usuário tentar acessar uma área do site ou sistema no qual ele não tenha privilégios, ele será redirecionado para uma página específica:

redirect(base_url().'home/sempermissao', 'refresh');
 

E, quando ele não estiver logado, será redirecionado para a página de login:

redirect(base_url().'home/login', 'refresh');

Incluí também um método na biblioteca para checar se o usuário logado no sistema tem permissão para acessar um determinado método de uma classe chamado check_menu. Para utilizar a autenticação no menu, basta checar se o usuário tem permissão para o caminho. Isso pode ser feito diretamente na view do menu:

 
<?php
if($this->auth->check_menu('home','index')==1){
echo "<li><a href='". base_url() ."home'>Home</a></li>";                }
?>

Observe também que na tabela sys_metodos existe um campo chamado privado, que tem por objetivo liberar o acesso de métodos que estejam protegidos; caso você construa um sistema de admin para gerenciar essa tabela, quando um método estiver com o campo privado definido como 1, ele estará com seu acesso restrito somente a usuários com permissão de acesso. Quando estiver ajustado como 0, estará liberado como método público.

Outro detalhe dessa tabela é um “apelido”. Ele é cadastrado em um primeiro momento como classe/método, mas poderá ser alterado para qualquer nome amigável e mais compreensível para os usuários, como, por exemplo, Home/login poderia ser substituído por Acesso à tela de login.

Para autenticar um usuário no sistema, crie um formulário com os campos usuário, cnpj e senha, e aponte para uma classe de sua preferência (eu uso a classe de nome home) com os seguintes métodos:

<?php
class Home extends Controller {
 
function __construct(){
parent::Controller();
$this->load->helper('logs');
$this->load->helper('cookie');
}
 
function index(){
redirect(base_url().'home/login', 'refresh');
}
 
function void(){
$data['js_to_load'] = null;
$this->load->view('libs/html-header',$data);
$this->load->view('libs/menu');
$this->load->view('libs/html-footer');
}
function sempermissao(){
 
echo "<html>";
echo "<title>Acesso Negado</title>";
echo "<body bgcolor='#EEEEEE'>";
echo "    <div style='padding:20px;background-color:#FFCC00;'>";
echo "<h2>Você não tem permissão para acessar esta funcionalidade.</h2>
echo "</div>";
echo "</body>";
echo "</html>";
exit();
}
 
function login(){
$this->load->view('login',$data);
}
 
function dologin(){
$usuario = $this->input->post('usuario');
$cnpj = $this->input->post('cnpj');
$senha = md5($this->input->post('senha'));
 
if($usuario=="" || $cnpj=="" || $this->input->post('senha')==""){
redirect(base_url().'home/login', 'refresh');
exit();
}
 
if(isset($_POST['lembrar'])){
setcookie("usuario", $usuario);
setcookie("cnpj", $cnpj);
setcookie("lembrar", "checked");
}
 
$sql = "SELECT id,cnpj,login,nome,email
FROM tb_usuarios
WHERE login ='" . $usuario . "'
AND cnpj ='" . $cnpj . "'
AND senha ='" . $senha . "'";
 
$query = $this->db->query($sql);
$result = $query->result();
if(count($result)<1){
redirect(base_url().'home/login', 'refresh');
exit();
}
else{
$login = array(
'id_usuario'   =>     $result[0]->id,
'cnpj'   =>     $result[0]->cnpj,
'usuario'   =>     $result[0]->login,
'nome'      =>    $result[0]->nome,
'email'     =>     $result[0]->email,
'logged_in' => TRUE,
'data' => date("d/m/Y h:i:s")
);
 
$data['ip'] = getenv("REMOTE_ADDR");
$data['usuario'] = $result[0]->id;
$this->db->insert('tb_acessos',$data);
 
$this->session->set_userdata($login);
redirect(base_url().'home/void', 'refresh');
}
}
 
function logout()
{
$this->session->sess_destroy();
$this->login();
}
}

Com isso, concluímos nosso sistema de autenticação com controle de nível de acesso por classe e método. Não é exatamente a coisa mais simples do mundo, mas também não é a mais complicada. É importante ressaltar que estou guardando as sessões do codeIgniter no banco de dados. As demais funções de cadastro de usuário e o cadastro de usuários na tabela de permissão devem ser construídos separadamente.

Implementações futuras estão previstas e um inconveniente deste sistema é que, quando você altera um nome de classe ou método, será necessário ajustar a tabela sys_metodos.

Código fonte da biblioteca disponível aqui.

Espero que o artigo lhes tenha sido útil!

Tags | , , ,

11

maio
2012

Sem Comentários

Em Blog
PHP

Por Allison

Equipe do PHP libera nova correção para falha de segurança na linguagem

Em 11, maio 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: IMasters

Com informações de The H

A equipe de desenvolvimento do PHP fez outra tentativa para corrigir a vulnerabilidade crítica que afeta servidores rodando o PHP em modo CGI. O problema é que, no modo CGI, é possível chamar parâmetros do PHP direto pela URL.

Por exemplo, ao acessar o endereço http://localhost/index.php?-s, o servidor executaria o PHP com o parâmetro -s, que exibe o código-fonte do arquivo, e não o HTML gerado por ele. Só isso já seria problema suficiente (afinal, é comum inserir dados como senhas do banco de dados no código fonte), mas o time que descobriu a falha também percebeu que ela permite inserir código malicioso no arquivo e executá-lo.

Os detalhes da vulnerabilidade foram revelados publicamente por engano. Originalmente, o problema teria sido corrigido nas versões 5.3.12 e 5.4.2 do PHP, que foram liberadas na semana passada. Mas logo foi descoberto que as atualizações forneciam uma solução incompleta e outras maneiras de explorar a falha apareceram.

Agora, os desenvolvedores liberaram as versões 5.3.13 e 5.4.3, que, segundo eles, corrige o problema. Os primeiros testes realizados pelo especialista em PHP Christopher Kunz indicam que a solução deu certo desta vez.

Além disso, um buffer overflow na função apache_request_headers também foi corrigido no branch 5.4.

Tags | , , ,

05

maio
2012

Sem Comentários

Em Blog
PHP

Por Allison

Falha crítica de segurança é encontrada no PHP

Em 05, maio 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: IMasters

Por Paulo Graveheart

Uma falha recente encontrada no PHP e liberada para o público por engano pode deixar qualquer página no servidor aberta para inserção de código malicioso. A vulnerabilidade, que afeta apenas servidores rodando o PHP em modo CGI, foi descoberta por um time de hackers durante uma competição.

A essência da falha é que hoje é possível chamar parâmetros do PHP direto pela URL. Por exemplo, ao acessar o endereço http://localhost/index.php?-s, o servidor executaria o PHP com o parâmetro -s, que exibe o código-fonte do arquivo, e não o HTML gerado por ele. Só isso já seria problema suficiente (afinal, é comum inserir dados como senhas do banco de dados no código fonte), mas o time que descobriu a falha também percebeu que ela também permite inserir código malicioso no arquivo e executá-lo.

Descobertas desse tipo normalmente são enviadas para os desenvolvedores que primeiro resolvem o problema e lançam uma atualização para só então os veículos anunciarem a falha e a correção, mas por uma falha humana o bug foi acidentalmente enviado como “público” no sistema de bugs do PHP.

Embora o time de desenvolvedores já tenha liberado uma correção, há informações de que elas não resolvem totalmente o problema. O ideal é usar o PHP de outra forma que não em modo CGI (em modo FastCGI essa falha não acontece) ou incluir uma regra para que o Apache bloqueie URLs com “-” no arquivo .htaccess, evitando assim o uso de parâmetros do PHP. A regra é esta abaixo:

 
RewriteCond %{QUERY_STRING} ^(%2d|-)[^=]+$ [NC]
RewriteRule ^(.*) $1? [L]

Uma nova atualização deve sair em breve, já com uma correção mais eficiente. Até lá, todo cuidado é pouco.

Tags | , ,

30

abr
2012

Sem Comentários

Em Blog
PHP

Por Allison

PHP 5.4.1 e PHP 5.3.11 são lançados

Em 30, abr 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: IMasters

Com informações de The H

Os desenvolvedores do PHP liberaram a primeira atualização para o PHP 5.4, a mais recente versão da linguagem, e uma atualização para o PHP 5.3. Segundo os desenvolvedores, todos os usuários do PHP devem atualizar para as novas versões.

O PHP 5.4.1 traz mais de 20 correções para bugs, incluindo alguns relacionados à segurança. Já o PHP 5.3.11 conserta cerca de 60 bugs, incluindo a correção de uma regressão aplicada anteriormente a uma correção de segurança para magic_quotes_gpc.

Uma lista completa com melhorias e correções de bugs para ambas as versões pode ser encontrada no change log do PHP 5. O PHP 5.4.1 e o PHP 5.3.11 estão disponíveis para download como fonte ou como binários do Windows a partir do site do projeto.

Tags | , ,

17

mar
2012

Sem Comentários

Em Blog
PHP

Por Allison

PHP você sabe o que é isso?

Em 17, mar 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: Gustavo D. Castro/CriarNet

PHP é uma linguagem de programação mais utilizada no mundo com ela podemos fazer qualquer sistema na internet que executa todo tipo de funções, com o PHP podemos desenvolver simples sistemas como um formulários até aplicações complexas com conexões a bancos de dados.

Odiada por muitas pessoas mas adorada e ovacionada pela maioria assim como eu, ela certamente já fez parte da sua via direta ou indiretamente e devemos muito ao PHP.

Porque o PHP é a linguagem mais utilizada no mundo?

Qualquer um pode aprender PHP!

Ao contrário do que se diz por aí, não vou falar que é fácil aprender a programar em PHP, mas direi que é uma das linguagens mais completas e mais fáceis de se aprender, não há mistérios, quem deseja e tem força de vontade aprende a programar seus primeiros sistemas sem maiores dificuldades.

PHP é grátis!

Ao contrario de outras linguagens como por exemplo o ASP (linguagem de programação paga) o PHP é Open souce ou seja você pode usar sem pagar nada, é totalmente grátis! Mas nem por isso fica para traz em relação aos seus concorrentes.

Grande quantidade de documentação disponível

Talvez pelos dois fatos acima citados é uma das linguagens de programação mais utilizadas e por isso possui grande quantidade de documentação, sites especializados, apostilas, entre outros conteúdos relacionados ao PHP o que facilita bastante na hora de estudar sobre a linguagem ou mesmo encontrar suporte para resolver algum eventual problema, a comunidade PHP é uma das maiores do mundo e só vem crescendo.

PHP é uma das linguagens mais dinâmicas que existe!

O PHP trabalha de forma diferente de outras linguagens como por exemplo javascript, pois a mesma é interpretada diretamente no servidor, isso garante tamanha dinamicidade a linguagem que nos permite dizer que é uma linguagem completa que nos permite fazer o que quisermos com a mesma.

O PHP trabalha com praticamente qualquer banco de dados, porem é mais comum ouvirmos o nome de PHP associada ao nome MySql que é o nome de um tipo de banco de dados.

Tem muita gente ganhando dinheiro com o PHP

É isso mesmo, muita gente ganha dinheiro graças a ele seja diretamente ou indiretamente, basta aprender a linguagem que não faltará serviços para desenvolvimento de sistemas, ou você mesmo poderá desenvolver um sistema para você e passar a ganhar dinheiro com o mesmo! Aprender só traz benefícios.

Tags | , , ,

16

mar
2012

Sem Comentários

Em Blog
PHP

Por Allison

Decodificar Código PHP no Blog! Ferramenta Online Base Decode

Em 16, mar 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: Rogerio Gomes/WRG


Talvez nunca tenha ouvido falar em uma ferramenta decode, e sinceramente torço para que não venha precisar dela tão cedo.

Essa semana precisei desvendar um trecho que código que praticamente invadiu o blog, a ponto de deixar a WRG barrada pelo Internet Explorer, fora que o antivírus detectava o blog como arquivo malicioso.

Quando fui atrás do problema, percebi que tinha um código esquisito que se alojou em todos os arquivo PHP do blog e na primeira linha de todos eles haviam um código como esse,

O código é gigante e se inicia por “eval(base64_decode(…”, e por ai vai em uma sequencia quase que doida para se entender a primeira, segunda ou terceira vista, rs.

O que acontece é que este trecho de código esta codificado, ou seja, o criador do programa ou arquivo que se alojou automaticamente no blog, não quer que ninguém a primeira vista saiba o que ele realmente faz, então, o criador decidiu complicar para quem não entende nada de php .

Existe uma forma de decodificar com uma função do próprio php, mas seria inviável para quem não entende muito. Por isso, deixo a dica da ferramenta Online base64_decode() function, http://www.tools4noobs.com/online_php_functions/base64_decode/, onde basta copia e colar toda a função no site, que ele decodifica e te mostra o verdadeiro código, como fiz abaixo,

obs: Basta copiar a função completa no quadrante A, clicar no botão e observar o verdadeiro código abaixo.

Tags | , , , ,

14

mar
2012

Sem Comentários

Em Blog
PHP

Por Allison

PHP 5.4: Sai o Register Globals, entra o suporte a Traits

Em 14, mar 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: Jonathan Allen/Marcelo Costa/InfoQ

O PHP 5.4, a maior atualização desde 2009, foi finalizado este mês. A nova versão inclui melhorias significativas na linguagem, incluindo suporte a traits, e a remoção de algumas de suas características controversas.

Traits

O PHP, assim como o .NET e o Java, faz uso de um modelo de herança simples. Embora isso seja suficiente na maioria dos cenários, há situações em que padrões comuns de codificação precisam ser repetidos em classes relacionadas (o método dispose no .NET é um bom exemplo deste tipo de código boilerplate (código que se repete em muitos lugares com pouca ou nenhuma alteração.) Para tratar esse tipo de situação, o PHP 5.4 oferece a funcionalidade de Traits.

Os traits são coleções de métodos que não pertencem a uma classe em si. Não existe uma forma de criar uma instância de um trait, ou chamar seus métodos diretamente. Em vez disso, traits devem ser incorporados a uma classe real. Quanto à precedência, um método trait substituirá um método herdado; da mesma forma, um método declarado na classe atual substituirá o método de trait.

Traits têm a mesma precedência, então por padrão é um erro usar dois traits na mesma classe, no caso em que os nomes de métodos de trait sejam iguais. Este erro pode ser evitado se os operadores “insteadof” e “as” forem utilizados para manualmente solucionar tais conflitos. O operador “as” também pode alterar a visibilidade de um trait.

Métodos de trait podem ser abstratos, o que é muito útil quando o trait pode ser apenas parcialmente generalizado. Traits também pode expor variáveis estáticas, apesar de cada classe receber sua própria cópia. Propriedades declaradas em traits não podem ser declaradas em uma classe que já faz uso daquele trait.

Outras melhorias na sintaxe da linguagem incluem:

  • Arrays agora podem ser declarados com colchetes ao invés de utilizar funções “array”. Isso visualmente deixa a declaração do array um pouco menor, mas não tem efeito além disso.
  • O array dereferencing agora funciona sobre os resultados de uma função. Anteriormente, o resultado teria de ser primeiro colocado em uma variável temporária; ex.: $FirstName = GetNames ()[0]
  • Closures no PHP 5.4 podem fazer uso do ponteiro $this, o que não era permitido anteriormente.
  • O acesso a uma classe membro durante a instanciação agora é permitido: ex. (newCustomerService) -> Delete (customerId).
  • Números binários agora podem ser identificados usando o prefixo “0b”.

Servidor web de linha de comando

O PHP 5.4 inclui seu próprio servidor web que pode ser iniciado a partir da linha de comando. Este servidor foi projetado apenas para fins de desenvolvimento e portanto não substitui um servidor web de produção.

Recursos removidos

O recurso Register Globals, muito criticado, finalmente foi removido do PHP. Este recurso é uma fonte bem conhecida de vulnerabilidades de segurança há mais de uma década e foi desativado por padrão desde 2002. O PHP versão 5.3, de 2009, já havia tornado a funcionalidade obsoleta.

Outra característica criticada que foi removida do PHP são as Magic Quotes, que foram uma tentativa de fazer o “escape” automático de strings numa tentativa de evitar ataques de SQL Injection. Mas como foi constatado que a forma utilizada depende do contexto, o recurso muitas vezes gerava mais problemas do que resolvia. Assim como Register Globals, o recurso havia sido marcado como obsoleto em 2009.

Declarações break e continue no PHP permitem a um parâmetro indicar quantos níveis devem ser quebrados. Quando não fornecido, a fluxo de execução sai do laço mais interno, assim como em VB, C# ou Java. Antes do PHP 5.4 desenvolvedores poderiam passar numa variável para a declaração break, agora é necessário uma constante.

O PHP permite a passagem de parâmetros por referência. Nas versões anteriores era possível informar que a variável foi passada por referência utilizando um decorator nas chamadas locais. Com o PHP 5.4, essa opção foi eliminada. Ao invés disso, a programação em PHP atual exige que o parâmetro esteja na declaração da função. Diferentemente do C#, nunca é necessário usar um parâmetro indicativo em ambas a declaração e a chamada local.

Tags | , , , , ,

05

mar
2012

Sem Comentários

Em Blog
PHP

Por Allison

Lançado – PHP 5.4

Em 05, mar 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Salve galera! Acabo de ver nesse exato momento que o PHP 5.4 acabou de sair do forno, isto pode ser conferido diretamente no site oficial do PHP.

Esta versão incluí um grande número de novas características e correções de bugs.

Dentre as principais novidades estão:

  • Traits
  • Servidor web integrado
  • Melhor desempenho e consumo reduzido de memória
  • Pequenas melhorias em várias extensões
  • Short Tags agora estão sempre disponíveis <?=
  • Alguns recursos legado foram definitivamente removidos, tais como: register_globals e allow_call_time_pass_reference.
  • Suporte a número binário; Exemplo: 0b001001101
  • Acesso ao membro da classe no momento da instancialização; (new Foo)->bar()
  • Derreferenciamento de array (poder usar colchetes sobre elementos que retornam array); Exemplo: foo()[0]
  • Sintaxe curta para arrays; Exemplo: $a = [‘um’ => 1, ‘dois’ => 2];

Tags | , , ,

11

fev
2012

Sem Comentários

Em Blog
PHP

Por Allison

Como rodar aplicações PHP no Windows Azure utilizando o Visual Studio 2010

Em 11, fev 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Fonte: Rafael Godinho/IMasters

Olá, pessoal!

Ouvi de muitas pessoas um mito que o Windows Azure somente consegue rodar aplicações desenvolvidas em .NET Framework e que não seria compatível com outras tecnologias. Como disse, isso é um mito, no Windows Azure a sua aplicação roda em um sistema operacional compatível com o Windows Server 2008 ou Windows Server 2008 R2, ou seja, praticamente tudo que é possível instalar e rodar nesses sistemas operacionais é possível fazer rodar no Windows Azure.

Tanto que a página sobre desenvolvimento do portal do Windows Azure, traz uma série de links e documentações sobre o assunto:

Existem várias maneiras de configurar um ambiente PHP no Windows Azure. Nos passos abaixo vou utilizar o Visual Studio 2010 para isso. Apenas notem que não utilizarei o Visual Studio 2010 para desenvolver nem depurar PHP, vou utilizá-lo apenas para deploy de uma aplicação web no Windows Azure.

O primeiro passo é criar um projeto de de Windows Azure e adicionar uma Web Role:

Depois remova os arquivos criados por padrão pelo Visual Studio até que seu projeto fique com uma estrutura similar à estrutura abaixo:

Em seguida adicione os arquivos da aplicação PHP no projeto da Web Role, no meu caso adicionei o arquivo index.php, que somente traz informações do ambiente PHP através da chamada phpinfo().

O próximo passo é instalar o PHP no Windows Azure. Lembre-se, estamos utilizando uma Web Role no nosso projeto que, na prática, instala nossa aplicação para rodar no IIS; o que precisamos fazer é configurar o PHP para rodar em conjunto com o IIS. Além dessa configuração básica de execução do PHP também pode ser interessante instalar drivers de comunicação com o SQL Azure e um acelerador, como o caso do WinCache.

Para realizar essas configurações, vou utilizar uma startup task responsável por disparar as instalações utilizando o WebPICmd, que é a versão linha de comando do Web Plataform Installer, facilitando bastante a automação da instalação de ambientes web.

O primeiro passo da startup task é adicioná-la no projeto da web application, no meu caso, criei uma pasta chamada startup e adicionei a WebPICmd descompactada e um arquivo batch, o setup.cmd. Neste ponto é importante definir a propriedade “Copy to Output Directory” de todos os arquivos com o valor “Copy always”. No print abaixo é possível ver a estrutura de pastas e arquivos:

O conteúdo do arquivo setup.cmd contém as chamadas para o WebPICmd realizar as instalações necessárias dos componentes do PHP no IIS

cd "%~dp0"
md appdata
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f
WebPICmdLine.exe /accepteula /Products:PHP53
WebPICmdLine.exe /accepteula /Products:SQLDriverPHP53IIS
WebPICmdLine.exe /accepteula /Products:WinCache53
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f
net start w3svc
iisreset /start
exit /b 0

Já a sua indicação como startup task fica no arquivo ServiceDefinition.csdef, conforme trecho abaixo (notem que o arquivo e nem todas as tags estão completas por economia de espaço):

<ServiceDefinition name="WindowsAzurePHP" …>
<WebRole name="PHPApp" vmsize="Small"> 
<Startup> 
<Task commandLine="startup\setup.cmd >> %Public%\Documents\setup.log"
      executionContext="elevated"
      taskType="simple" /> 
</Startup>…

Na definição da startup task digo que ela deverá executar de maneira elevada, ou seja, com permissões de administrador para poder realizar as instalações no ambiente e que também todos o texto que normalmente seria exibido na tela será redirecionado para o arquivo setup.log, podendo ser utilizado posteriormente em um diagnóstico em caso de problema.

Depois disso é só fazer o deploy e testar a aplicação

O código fonte deste projeto pode ser encontrado aqui.

Que tal testar o Windows Azure gratuitamente por 90 dias? Saiba mais aqui!

Tags | , , , , ,

08

fev
2012

Sem Comentários

Em Blog
PHP

Por Allison

Criando aplicativos móveis com PHP

Em 08, fev 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Texto original: http://phpadvent.org/2010

Fonte: BlogdoExpert

Há um bom tempo, o PHP era a escolha óbvia para as necessidades de todo programador. Ele estava disponível em todos os servidores web virtuais, tinha excelente documentação, e conseguia lidar com todas as necessidades dos programadores. Essas coisas são ainda mais verdadeiras hoje, e o PHP ainda é o middleware de escolha da maioria dos profissionais da área. No entanto, o uso do PHP mudou nos último anos.

Durante uma solicitação típica de página, o PHP fazia coisas como começar uma sessão, consultar um banco de dados, processar alguns dados, e, finalmente, gerar uma tonelada de métricas de HTML que seriam retornadas para o browser do usuário. Em outras palavras, toda a interface do usuário era gerada no lado do servidor pelo PHP. Ocasionalmente, era possivel incluir o prototype.js ou jQuery para fazer um pouco de validação de formulário, ou uma lista dropdown com um campo para “auto-completar”.

Mas então veio o iPhone…

Em 2007, o iPhone deu início a uma onda de interesse em computação móvel. Como milhares de desenvolvedores maravilhado por aquele pequeno dispositivo mágico que colocou a web no bolso de muita gente. Sempre conectado, navegadores excelentes, interação de toque intuitiva – é de fato incrível, e todos queriam entrar nessa de cabeça.

Quando o iPhone foi anunciado pela primeira vez, Steve Jobs pediu ao desenvolvedores terceirizados que construíssem aplicativos web se eles quisessem programar para o iPhone.

Claro que Jobs acabou voltando atrás menos de um mês depois, com o anúncio do Cocoa Touch e a iTunes App Store. E a guerra santa entre “web apps” e “apps nativos” nasceu.

E o que isso tem a ver com PHP?

Felizmente, agora temos a convergência de novas tecnologias que tornam a construção de web apps – móveis e outros – muito mais fácil.jQTouch, Sencha Touch, e mais recentemente, jQuery Mobile tornaram a vida mais fácil para escrever JavaScript para browsers móveis. O CSS3 nós dá transformações, transições e animações que nos permitem facilmente adicionar efeitos visuais sofisticados. E, mais drasticamente, o HTML5 define uma enorme quantidade de novos recursos  —  geolocalização, canvas, sockets, workers, armazenamento de dados do lado do cliente, suporte a cache offline da aplicação, cross-origin resource sharing, e por aí em diante.

Como resultado,muitas pessoas podem criar suas próprias UI com HTML estático, CSS e documentos JavaScript que conversam com uma API do lado do servidor construída com PHP. Esta abordagem baseada em API pode minimizar, de fato, a quantidade de dados enviados através do fio, porque é possível esconder os arquivos estáticos localmente, e somente requisitar atualizações de dados relativamente pequenos do PHP (normalmente na forma de JSON). Isso também tem grandes vantagens secundárias. Aqui estão as três maiores:

1. Divisão de trabalho:

Uma vez que você tem configurado uma API do lado do servidor, você pode facilmente ter seu trabalho de design do aplicativo no front end sem saber o mínimo de PHP, linguagens de templates, ou qualquer outra tecnologia do lado do servidor. Você não tem nem que dar acesso ao servidor para o designer – ele pode codificar contra a API com os arquivos no seu desktop.

2. Clientes múltiplos

O cenário da informática está sob massivo crescimento e transformação. Estamos vendo telas tão pequenas quanto cartões de credito, e tão grandes quanto um outdoor. E está acontecendo também uma grande separação entre dispositivos que suportam entrada de toque, de mouse e, em menor número, de voz.

Diferenças no tamanho físico, modos de interação e capacidades do dispositivo exigem que forneçamos experiências otimizadas ao usuário para o terminal em questão. Expor uma API do lado do servidor, construída em PHP, possibilita o suporte a clientes front end, sejam eles clientes menores, construídos em HTML, CSS, e JavaScript, ou maiores, construídos com frameworks nativos.

Os benefícios dessa abordagem têm sido demonstrados pelo Google, Yahoo, e, talvez, mais dramaticamente pelo Twitter, que documentou e lançou uma API simples para a comunidade de desenvolvedores. Graças a isso, todos os clientes do Twitter encontraram seu caminho no mundo digital. Começando com uma API que permite esse tipo de flexibilidade, que parece infinita, certamente ela contribuiu imensamente para a aceitação do Twitter.

3. À prova do futuro

O cenário da informática está evoluindo e é muito difícil prever o que vem a seguir. Muitas pessoas inteligentes estão trabalhando em novas tecnologias que irão mudar a maneira com que interagimos com computadores, e mais importante, um com o outro. Tudo, desde projeções holográficas de eventos de esporte ao vivo, até entradas das ondas cerebrais dos usuários estão em jogo. A melhor maneira de se manter flexível à vista de novos desenvolvimento é fornecer uma API robusta para lidar com o máximo do levantamento do back end possível.

Comece com sua API

Para trabalho web front end, você vai querer se familiarizar com a nova maravilha que é o HTML5 e o CSS3, e mais importante, aprender JavaScript! É uma sintaxe muito parecida com PHP e ela deveria parecer bem familiar para você (existe até um artigo do PHP Advent sobre isso). No entanto, existem muitas diferenças importantes entre PHP e JavaScript que você realmente precisa entender antes de se auto intitular um especialista. O livro JavaScript: The Good Parts, de Douglas Crockford é recomendado. Se você programa para a web, deve lê-lo.

Para finalizar, nunca houve um momento melhor para ser um desenvolvedor web. A convergência de uma conectividade ubíqua, serviços de cloud e telas de toque interativa estão criando um ambiente onde qualquer um pode construir experiências do usuário convincentes que tenham um alcance massivo com uma barreira de entrada muito pequena. Então volte para seu editor de texto e comece a codificar.

Tags | , , , , , ,

05

fev
2012

Sem Comentários

Em Blog
PHP

Por Allison

Vulnerabilidade crítica de segurança no PHP está sendo corrigida

Em 05, fev 2012 | Sem Comentários | Em Blog, PHP | Por Allison

Com informações de The H

Fonte: IMasters

Os desenvolvedores do PHP estão trabalhando para corrigir uma vulnerabilidade crítica de segurança no PHP que eles introduziram com um recente patch de segurança. Entretanto, não está claro se o questionável patch foi aplicado a versões mais antigas.

A causa do problema foi uma atualização de segurança no PHP 5.3.9, que foi feita para prevenir ataques de negação de serviço (DoS) usando colisões hash. Para fazer isso, os desenvolvedores limitaram o maior número possível de parâmetros de entrada para mil em php_variables.c, usando max_input_vars. Devido aos erros na implementação, os hackers podem intencionalmente exceder esse limite e injetar e executar código. O bug é considerado crítico, já que o código pode ser injetado remotamente através da web.

A versão de desenvolvimento do PHP já possui um patch para o bug, mas os desenvolvedores ainda precisam liberar um comunicado oficial. Ainda não está claro se há medidas imediatas sendo tomadas para administradores.

Atualização: A versão 5.3.10 do PHP foi liberada e está disponível para download a partir do site do projeto. Ela corrige a vulnerabilidade que permitia a execução de código remoto. Os desenvolvedores recomendam todos os usuários a atualizarem para a recente versão o mais rápido possível.

Tags | , , , ,