Posts tagged ‘php’

27 de agosto de 2010

Problema com session em frame / iframe no Internet Explorer

por adlerparnas

Fala pessoal!

Hoje estou aqui para mostrar uma solução para os problemas com sessões nos  frames/iframes no Internet Explorer versões 6, 7 e 8. Não sou muito adepto aos  elementos  frame e iframe, mas sei que muitas pessoas usam e que são uma ótimo recurso.

Desenvolvendo um projeto no meu trabalho, nossa página seria aberta em  um iframe na  aplicação do cliente. Eis que me aparece o problema, a sessão do usuário em nosso sistema  não era gravada.

Pesquisando pela WEB, descobri no site ASPBRASIL que o problema acontecia por causa de uma diretiva de segurança do Internet Explorer que restringe a gravação de cookies na máquina do usuário. Essa diretiva denominada P3P é descrita pelo W3C.

Seguindo as instruções do site ASPBRASIL, basta alterar a propriedade P3P no cabeçalho do HTTP para que a página consiga gravar os cookies na máquina do cliente. Aqui senha um exemplo em ASP e em PHP de como alterar essa diretiva no cabeçalho HTTP.

<%
Response.AddHeader("P3P", "CP=\"IDC DSP COR CURa ADM ADMa DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT PHY ONL COM STA\"");
%>
<?php
header('P3P: CP="IDC DSP COR CURa ADM ADMa DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT PHY ONL COM STA"');
?>

ATENÇÃO: a diretiva deve ser alterada na página que irá abrir dentro do frame.

Ainda não estudei todas essas diretivas, mais sei que vai funcionar! 😀

É isso ai pessoal! Espero que essa dica seja útil a todos vocês e caso tenha dito algo errado,  favor me corrijam!

Fontes:

24 de agosto de 2010

Criar daemons em PHP

por adlerparnas

Fala Pessoal!

Meu nome é Adler Parnas, depois de um tempo OFF, venho falar de como criar daemons utilizando PHP.

Todos nós, programadores PHP, sabemos que essa linguagem funciona muito bem rodando sobre um servidor WEB (Apache, IIS, etc..), mas quantas vezes precisamos rodar uma rotina de backup automática no servidor ou mesmo criar um daemon para monitorar uma fila? OK! Podemos criar scripts em SHELL, Phyton, PERL e etc…, mas eu domino PHP!

A execução de um script PHP pela linha de comandos é extremamente fácil! Basta que você chame o executável do PHP passando como parâmetro o nome do arquivo a ser executado.

#executando script pela linha de comandos (GNU/Linux)
$ php meu_script.php

Este tipo de recurso, nos permite por exemplo criar scripts que serão executados no CRON de um servidor, resolvendo por exemplo a necessidade de rotinas de backup.

Outra possibilidade é criar daemons( programas que rodam em background no servidor num loop infinito) para monitorar portas ou filas de requisições. Como um daemon é um loop infinito, nada melhor que um while para fazer com que sua rotina execute eternamente.

<?php
while(TRUE){

// Faça sua mágica aqui!!

}
?>

O grande pulo do gato, para que você não acabe com os recursos do seu servidor, você DEVE incluir a chamada da função sleep, para que seu servidor respire a cada iteração.

<?php
while(TRUE){

// Faça sua mágica aqui!!
sleep(10);  //sua rotina será executada a cada 10 segundos
}
?>

Como disse, este tipo de recurso é ótimo para monitoramento de portas ou filas (usei para isso :D). Então digamos que você compre um plano de hospedagem de site que lhe permita o acesso via SSH, assim você poderá executar seu daemon. O único problema é que quando você finalizar a sessão, todos os aplicativos executados por você também serão finalizados. Isso ocorre porque os aplicativos executados são filhos da sua sessão. Para resolver isso utilizei um script que executa meu daemon e finaliza, deixando o daemon “órfão”, deixando que eu finalize minha sessão SSH, sem que meu daemon pare de rodar.

Este é um exemplo de um daemon em PHP que a cada 10 segundos escreve num arquivo na pasta /tmp/ do meu servidor (GNU/Linux):


<?php
/**
* Programa daemon.php que escreve na diretório /tmp
*/

// guardando a hora de início da execução do daemon
$init = microtime(true);

//iniciando loop infinito
do{
 exec('echo "Estou rodando a '.(microtime(true) - $init).' segundos" >> /tmp/daemon.log');

 // adormecendo o daemon por 10 segundos
 sleep(10);
}while(TRUE);
?>

Para chamar meu daemon, sem que ele morra no final da sessão, escrevi uma script que utiliza a função proc_open para iniciar o processo:

<?php
/**
* Programa para executar o daemon
*/

//array de pipes, parâmetro obrigatório da função proc_open
$array_pipes = array();

//executando o daemon
proc_open("php daemon.php &", array(), $array_pipes);

exit;
?>

É isso ai pessoal! Espero que essa dica seja útil a muitos de vocês como foi para meu projeto. Caso tenha dito algo errado, favor me corrijam! Postem suas dúvida e/ou comentários!

PS.: O Próximo artigo será como criar daemons no Code Igniter! 😀

26 de julho de 2010

PHPUnit no CodeIgniter com CIUnit

por adlerparnas

Fala Pessoal!

Meu nome é Adler Parnas e hoje vou falar da instalação do PHPUnit no CodeIgniter utilizando a biblioteca CIUnit. Não tenho o objetivo de explicar o funcionamento nem a utilização do CodeIgniter nem o PHPUnit.

O PHPUnit é um Framework para automatização de testes unitários,  muito utilizado para Desenvolvimento Baseado em Testes. O CIUnit é uma série de códigos em PHP para a integrar o PHPUnit ao CodeIgniter para que você possa realizar testes de seus Models, Controllers e Helpers de uma maneira bem mais fácil.

A instalação do PHPUnit pode ser feita através do PEAR. Para quem não possui o PEAR intalado basta seguir o tutorial no site oficial da PEAR, pra quem usar WAMP + Windows 7 pode ler esta explicação que escrevi.

O CIUnit pode ser baixado no site do oficial do projeto que possui um tutorial muito fácil de ser acompanhado. Apesar de seguir os passos como é dito no site oficial, tive problemas ao executar os teste. Fuçando nos códigos do CIUnit e nas mensagens de erros geradas, descobri que o mapeamento do CIUnit para a pasta de bibliotecas do CodeIgniter está errado.

No arquivo: system\application\libraries\fooStack\fooBase\index.php:


// existe a seguinte atribuição
$application_folder = "../../application";

// o correto seria
$application_folder = "/application";

Um outro arquivo com problemas é o \system\application\tests\CIUnit.php que possui um código comentado que deve ser descomentado:

########################################
# descomente estas linha abaixpo         #
########################################

// $CI->load->library('fooStack/Spyc');
// CIUnit::$spyc = &$CI->spyc;
$CI->load->library('fooStack/Fixture');
CIUnit::$fixture = &$CI->fixture;

É isso ai pessoal! Espero que esta dica seja útil a vocês e caso tenha dito algo errado me corrijam.

26 de julho de 2010

Instalando PEAR no WAMP sobre o windows 7

por adlerparnas

Fala Pessoal!

Meu nome é Adler Parnas e hoje vou falar do da instalação do PEAR no WAMP sobre o Windows 7. Não tenho como objetivo explicar o que é o PEAR nem a instalação do WAMP.

No WAMP 2.0 existe o arquivo C:\wamp\bin\php\php5.3.0\go-pear.bat que é um script para a instalação do PEAR. Entrei no console, fui para a pasta especificada e  executei o arquivo go-pear.bat e encontrei o seguinte erro:


phar "C:\wamp\bin\php\php5.3.0\PEAR\go-pear.phar" does not have a signaturePHP Warning:  require_once(phar://go-pear.phar/index.php): failed to open stream: phar error: invalid url or non-existent phar "phar://go-pear.phar/index.php" in C:\wamp\bin\php\php5.3.0\PEAR\go-pear.phar on line 1236

Warning: require_once(phar://go-pear.phar/index.php): failed to open stream: phar error: invalid url or non-existent phar "phar://go-pear.phar/index.php" in C:\wamp\bin\php\php5.3.0\PEAR\go-pear.phar on line 1236
Pressione qualquer tecla para continuar. . .

C:\wamp\bin\php\php5.3.0>

No meu caso, a pasta de binários do PHP não estava na variável de ambiente PATH do meu usuário, então quando o script era executado ele não reconhecia o comando php.exe.
A solução que tomei foi editar o arquivo go-pear.bat adicionar um comando que levasse o script a pasta de binários do php:

@ECHO OFF
# esta linha foi adicionada
cd C:\wamp\bin\php\php5.3.0
set PHP_BIN=php.exe
%PHP_BIN% -d output_buffering=0 PEAR\go-pear.phar
pause

Quando executei o script pela segunda vez, encontrei o mesmo erro, o que me levou a desconfiar das permissões do meu usuário para executar o script. Então abri o console como administrador e executei o arquivo novamente e tchan!, o mesmo erro aconteceu! Resolvi então copiar e executar o comando que estava no script e ainda sim o mesmo erro ocorria!

Perguntando ao pai dos burros, ele me informou um link para o blog phphints onde existe este comando milagroso:

> cd C:\wamp\bin\php\php5.3.0
> php -d phar.require_hash=0 PEAR/go-pear.phar

Após informar o local onde o PEAR seria instalado, bastou colocar o diretório dos binários do PEAR na variável de ambiente PATH do meu usuário e tudo funcionando.

É isso ai pessoal! Espero que esta dica seja útil a todos os programadores PHP Windows e caso tenha dito algo errado me corrijam!

14 de julho de 2010

Nunca mais você vai usar as variáveis $_GET e $_POST

por adlerparnas

Olá! Pessoal!

Meu nome é Adler Parnas e hoje vou falar de um técnica para acessar, validar e filtrar dados das variáveis $_POST e $_GET no PHP.

Caminhando na minha jornada rumo a Certificação PHP, me deparei com um artigo na PHP Architect, que exemplificava a utilização das funções filter_input e filter_input_array. Tais funções foram inseridas no PHP a partir da versão 5.2 e são uma ótima forma para tratar dados das variáveis $_GET e $_POST deixando seu código mais legível e seguro.

Como é falado no artigo original, é incrível a quantidade de sites/sistemas em PHP com falhas de segurança por  não tratar a entrada de dados pelo usuário. Existe também o tempo gasto para escrever códigos de tratamento dos dados de entrada.

Veja como seu código fica mais limpo e claro utilizando a função filter_input para tratar um parâmetro via GET:


<?php

$user_name = filter_input(INPUT_GET, 'user_name', FILTER_SANATIZE_STRING);

?>

Na página de documentação do PHP, também existe um exemplo utilizando a função filter_input_array, onde é criado um array com as opções de validação do POST esperado pelo programa.

<?php
error_reporting(E_ALL | E_STRICT);

/* data actually came from POST
$_POST = array(
   'product_id'    => 'libgd<script>',
   'component'   => '10',
   'versions'       => '2.0.33',
   'testscalar'    => array('2', '23', '10', '12'),
   'testarray'     => '2',
);
*/
/**
 * Arry com as opções de validação
 */
$args = array(
   'product_id'     => FILTER_SANITIZE_ENCODED,
    'component'   => array(
                                    'filter'    => FILTER_VALIDATE_INT,
                                    'flags'     => FILTER_REQUIRE_ARRAY,
                                    'options'   => array('min_range' => 1, 'max_range' => 10)
    ),
    'versions'     => FILTER_SANITIZE_ENCODED,
    'doesnotexist' => FILTER_VALIDATE_INT,
    'testscalar'   => array(
                                    'filter' => FILTER_VALIDATE_INT,
                                    'flags'  => FILTER_REQUIRE_SCALAR,
    ),
    'testarray'    => array(
                                    'filter' => FILTER_VALIDATE_INT,
                                    'flags'  => FILTER_REQUIRE_ARRAY,
    )
);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
?>

O resultado deste tratamento seria:

array
   'product_id'     => string 'libgd%3Cscript%3E' (length=17)
   'component'    => boolean false
   'versions'        => string '2.0.33' (length=6)
   'doesnotexist'  => null
   'testscalar'     => boolean false
   'testarray'      => boolean false

Existem vários tipos de filtros que podem ser utilizados, sendo eles divididos em “dois grupos”, SANATIZE e VALIDATE. Os filtros dos tipo SANATIZE limpam os dados da variável, já os filtros do tipo VALIDATE, retornam FALSE caso o dados não passe pelo filtro.

As funções filter_input e filter_input_array não tratam todos os tipos de dados e nem vão deixar seu programa 100% seguro, mas já é uma boa parte da segurança realizada de forma elegante.

É isso ai galera! Espero que essa dica seja útil a todos vocês e caso tenha dito algo errado, favor me corrijam.

Fontes: