alexmontoanelli

a little fun!

Interceptando funções internas no PHP

Olá pessoal, dica rápida de como proceder para interceptar funções build-in no php.

Precisei usar para interceptar as chamadas da função mail, em um servidor em produção,
para gerar log, de abusos.

Para isso precisaremos instalar o modulo runkit, disponível em github.com/padraic/runkit.

O procedimento consiste em baixar o pacote via git, com o comando
git clonse git://github.com/padraic/runkit.git, executar um phpize no diretório, depois
o trio ./configure &&  make && make install

Feito isso basta configurar o php.ini para subir o modulo com as seguintes linhas:

extension=runkit.so
runkit.internal_override=1

A primeira linha carrega o módulo e a segunda, diz que vamos sobre-escrever funções internas no php.

Depois basta reiniciar o apache.

O script para interceptar fica mais ou menos assim:

//copiamos a funcao interna mail para o nome de intmail
@runkit_function_copy("mail", "intmail");

//removemos a funcao original mail
@runkit_function_remove("mail");
//atribuimos a funcao umail para o nome mail
@runkit_function_copy("umail", "mail"); 

//criamos a assinatura da funcao identica a original do mail
function umail($to,
               $subject,
               $message,
               $additional_headers = null,
               $additional_parameters = null) {
      //executamos aqui nossas rotinas
      //como por exemplo criar logs

      //chamaos a funcao mail original com os paramentros passados
      if (ini_get('safe_mode') === false){
        $x =  intmail($to,
                      $subject,
                      $message,
                      $additional_headers,
                      $additional_parameters);
      } else {
        $x =  intmail($to,
                      $subject,
                      $message,
                      $additional_headers);
      }

      return $x;
}

Para esse scritpt ter um funcionamento global, é preciso adiciona-lo na configuração auto_prepend_file  para
carrega-lo automaticamente em toda página.

Por hora é isso.

Abraços

May 17th, 2010 by alexm
Posted in php | 1 Comment »

Gerando relatórios com Jasper no PHP – mini how-to

Para quem tem a necessidade de gerar relatórios, o php não possui nenhuma ferramenta a nível da já  consagrada
Jasper, disponível no Java.

A solução então é usar o projeto phpJavaBridge para criar uma ponte entre o mundo Java e PHP e assim conseguir conversar
com o Jasper.

Vamos lá para a receita, lembre-se que vocẽ precisar ter um certo conhecimento para fazer isso e saber oque está acontencedo,
ter uma certa intimidade com Java e Tomcat e outros.

Primeiro você vai precisar de um servidor web  tomcat rodando -  vários how-to podem ser encontrados no google;

Depois disso baixe o  phpjavabridge (binário), disponível em http://php-java-bridge.sourceforge.net/pjb/download.php,e
baixe tambŕm o Java.inc, disponível na mesma página.

Copie o .war do phpjavabridge (JavaBridge.war) para a pasta webapps do tomcat para fazer o deploy da aplicação.

Acesse então: http://localhost:8080/JavaBridge e se tudo der certo você verá a tela de boas vindas do phpjavabridge.

Feito isso baixe o jasper aqui e após descompactar copie os  *.jar para a basta WEB-INF/lib dentro da pasta do JavaBridge
que esta no webapps do tomcat.

Aqui estão uns scripts para testar a a aplicação no console (linux), já com um modelo básico de relatório feito no iReport
usando csv para backend de dados.

Você pode usar xml e até conexão direta com o banco de dados como origem dos dados.

Nota: todos os paths são relativos ao tomcat e não ao php.

Aconselho a ler e reler muito a documentação que se encontra no site.

Mais uma vez digo, essa tarefa não é para iniciantes, então tenha muita paciência.

Abraços

April 13th, 2010 by alexm
Posted in php | No Comments »

ZendFramework – Usando parâmentros nas Actions

Para quem usa o ZendFramework, em modo MVC, sabe que o modo para pegar uma váriavel  passada por GET/POST/COOKIE, deve ser realizada através dos métodos: getRequest()->getParam(‘nome_da_variavel’), do objeto Zend_Coontroller_Action.

Abaixo mostro uma implementação, que extende a classe Zend_Action para que seja usado os parâmentros no corpo da função.

Hoje você utiliza da seguinte forma:

<?php
class IndexController extends Zend_Controller_Action {

public function indexAction(){

//obterá o parâmentro GET/POST teste
 echo $this->getRequest()->getParam('teste');

}

}

A nova forma será:

<?php
class IndexController extends My_Action {

public function indexAction(string $teste){

//obterá o parâmentro GET/POST teste
 echo $teste;

}

}

Abaixo a classe My_Action.

Abraços

—————

<?php                                                                                                                                  
/**                                                                                                                                    
 * Map request parameters to action method                                                                                             
 * @author Albert Varaksin                                                                                                             
 * @licence public domain                                                                                                              
 */                                                                                                                                    
class My_Action extends Zend_Controller_Action                                                                           
{                                                                                                                                      
 /**                                                                                                                                
 * Dispatch the requested action                                                                                                   
 *                                                                                                                                 
 * @param string $action Method name of action                                                                                     
 * @return void                                                                                                                    
 */                                                                                                                                
 public function dispatch($action)                                                                                                  
 {                                                                                                                                  
 // Notify helpers of action preDispatch state                                                                                  
 $this->_helper->notifyPreDispatch();                                                                                           

 $this->preDispatch();
 if ($this->getRequest()->isDispatched()) {
 if (null === $this->_classMethods) {  
 $this->_classMethods = get_class_methods($this);
 }                                                   

 // preDispatch() didn't change the action, so we can continue
 if ($this->getInvokeArg('useCaseSensitiveActions')
|| in_array($action, $this->_classMethods)) {
 if ($this->getInvokeArg('useCaseSensitiveActions')) {                                       
 trigger_error('Using case sensitive actions without word separators is deprecated;
please do not rely on this "feature"');
 }                                                                                                                             

 $reflMethod = new Zend_Reflection_Method($this, $action);                                                                     
 $actionParams = $reflMethod->getParameters();                                                                                 
 $requestParams = $this->_request->getParams();                                                                                
 $args = array ();                                                                                                             
 foreach ($actionParams as $param)
 {
 // get parameter type
 if (($reflClass = $param->getClass()) instanceof Zend_Reflection_Class) {
 $type = $reflClass->getName();
 } else if ($param->isArray()) {
 $type = 'array';
 } else {
 $type = $param->getType();
 }

 // get passed parameter
 $name = $param->getName();
 if (isset($requestParams[$name])) {
 $value = $requestParams[$name];
 } else if ($param->isDefaultValueAvailable()) {
 $value = $param->getDefaultValue();
 $type = '';
 } else {
 $docBlock = $reflMethod->getDocblock();
 if (($tagRefl = $docBlock->getTag("require_$name"))
instanceof Zend_Reflection_Docblock_Tag) {
 $tryClass = trim($tagRefl->getDescription());
 if (class_exists($tryClass, true))
 throw new $tryClass("Missing value for argument $name");
 else
 throw new Zend_Controller_Action_Exception("Missing value for argument $name");
 }
 $value = null;
 }

 // fix value type
 $basicTypes = array(
 'int', 'integer', 'bool', 'boolean',
 'string', 'array', 'object',
 'double', 'float'
 );
 if (in_array($type, $basicTypes)) settype($value, $type);
 else if (strlen($type) && class_exists($type, true)) $value = new $type($value);

 $args[] = $value;
 }
 // dispatch the action
 call_user_func_array(array($this, $action), $args);
 } else {
 $this->__call($action, array());
 }
 $this->postDispatch();
 }

 // whats actually important here is that this action controller is
 // shutting down, regardless of dispatching; notify the helpers of this
 // state
 $this->_helper->notifyPostDispatch();
 }
}
October 17th, 2009 by alexm

Threads no PHP

Exemplo básico de utilização de threads no PHP

$pid = pcntl_fork();

if ($pid == -1) {

     die('Erro ao lançar thread');

} else if ($pid) {

     // thread principal
     //aguardamos a thread child terminar
     pcntl_wait($status); 

     echo "Processo child terminado\n";

     exit(0);

} else {

     //thread secundario
     //mudamos para um usuário não privilegiado
     posix_setuid(1000);
     posix_setgid(1000);

     //colocamos a thread para fazer algo,
     //ate que uma condição seja satisfeita e ela termine
	$i=0;
	while(true){	

           if (file_exists('/tmp/stop')){
		echo "Terminado thread";
		exit(0);
	   }

	   echo "Iteração : ". ++$i . "\n";
	   sleep(2);

	}

}

 

Mais informações aqui.

Abraços e até.

August 29th, 2009 by alexm
Posted in php | No Comments »

Criptografia RSA em PHP em poucas linhas – the simple way

Abaixo descrevo os passos para implantar um sistema de chaves baseada em RSA,para que sua aplicação posso trocar dados de forma transparente.

Utilizei o procedimento para assinar um cookie,  na máquina do usuário e depois validá-lo, em um sistema de auto-login.

Você vai precisar do arquivo RSA.php, disponível em http://scripts.ringsworld.com/development-tools/rsa1.3/:

Após isso, vamos  passar por tres etapas, a geração das chaves, a assinatura dos dados, e por úlitmo a decodificação dos dados assinados.

Para gerar um par de chaves, e encriptar e decriptar os dados, usaremos o bloco de código abaixo comentado como exemplo.

<?php
require_once ‘RSA.php’;

//Iremos ter em $keys, um par de chaves, a pública e a privada,a
//a qual você deverá guardar para poder decriptar os dados mais tarde.
$keys = generate_keys ();

//com a chave sgerada iremos assinar uma string com a
//chave pública para futura comparação
$string_secreta = "Minha informação sigilosa";
$encoded = rsa_encrypt ($string_secreta,  $keys[1],  $keys[0]); 

//OK, nossa ‘informação sigilosa’ esta agora encriptada,
//e pode ser distribuida,porem apenas quem tiver o valor de $keys
//poderá ver o conteudo, entao é importante manter a chave geradada
//em um local seguro

//Podemos agora decriptar o valor,
//e verificar se tudo ocorreu certinho:
$decoded = rsa_decrypt($encoded,  $keys[2],  $keys[0]);
$result = ($decoded === $message);

//$result será um boolean onde se a mensagem
//decodifica foi igual a mensagem original
// retornará true } else { retornará false; }

 

Abraços

July 22nd, 2009 by alexm
Posted in php | No Comments »

Ativando o Xdebug no ZendStudio

Hello all.

Passos para usar o XDebug no ZendStudio4Eclipse.

1 -> Entre na pasta onde esta instalado o ZendStudio (/usr/local/Zend/ZendStudioForEclipse-6.1.1/)
2 -> Entre na Pasta plugins – cd plugins
3 -> Crie uma pasta chamada ‘disabled’ – mkdir disabled
4 -> Mova todos os arquivos com.zend.php.debug.* para a pasta disable – mv com.zend.php.debug.* disabled/
5 -> Inicie uma nova instancia do Zend limpando as configurações default – ../Zend -clean
6 -> Fecha e Abra novamente o Zend, e você irá ver em preferencia/php/debug o Xdebug com um dos modos disponiveis para debug.

Não esqueça de setar xdebug.remote_enable para 1 no php.ini.

Abraços

March 16th, 2009 by alexm
Posted in php | No Comments »

Easter Eggs no PHP

Abaixo seguem alguns eggs para o PHP.

Acesse um url php passando como variavel uma das strings abaixo, e você verá o poder delas.

-> PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

-> PHPE9568F34-D428-11d2-A769-00AA001ACF42

-> PHPE9568F35-D428-11d2-A769-00AA001ACF42

-> PHPE9568F36-D428-11d2-A769-00AA001ACF42

Aqui vai o exemplo de um url:

http://php.net/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

Abraços

October 27th, 2008 by alexm
Posted in php | No Comments »

PHP Encontrar/ Extrair Substrings

Uma tarefa bastante comum em PHP a encontrar e substituir partes de string por outras.

No PHP temos vários funções para manipulação de strings, entre as mais usadas e simples temos as strpos(), strstr(), substr() e substr_replace().

strpos() : Encontra a primeira ocorrência de uma string e retorna sua posição.

Exemplo: $pos = strpos(‘abcde’, ‘de’); //irá retornar 3

strstr() : Encontra a primeira ocorrência de uma string e retorna tudo apartir dela.

Exemplo: $string = strstr(‘email@dominio.com.br, ‘@’); //irá retornar @dominio.com.br

substr() : Retorna uma parte expecifica da string

Exemplo: $string = substr(‘abcdef, 1, 3); //ira retornar ‘bcd’

Para mais detalhes veja aqui.

Abraços

October 25th, 2008 by alexm
Posted in php | No Comments »

Resolvendo problemas de charset enconding com LDAP e PHP

Estamos vivos.

Depois de uma breve pausa para a política e outras coisinhas estamos de volta.

Para não perder a viagem aqui vai uma dica para quem tá com problemas de encoding entre ldap e PHP.

Se você tá passando por problemas ao gravar caracteres acentuados em uma base ldap, e ao mostrar eles, você vê um ‘?’ ou outros caracteres estranhos no local do original, basta usar a função utf8_encode antes de gravar os valores no banco, (ldap_add), e quando for recuperar (ldap_search) os valores do banco, utilizar utf8_decode para converte-los novamente e exibir normalmente.

Logo novidades por aqui. Aguardem!

Abraços

October 8th, 2008 by alexm
Posted in php | No Comments »

Certificação Zend/PHP – Parte 1 – Inscrição

Foi hoje o dia em que tomei a coragem e fiz a inscrição para tirar a Certificação ZCE.

Prova marcada para dia 29 de Agosto em Blumenau.

Agora é suar pra ter o nome lá na Yellow-Page.

Abraços

August 4th, 2008 by alexm
Posted in php | 1 Comment »