alexmontoanelli

a place to have some 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

One Response to “Interceptando funções internas no PHP”

  1. alexm Says:

    Obrigado pela dica.
    Parabéns pelo blog, bom conteudo.
    E legal que és vizinho..heheh Tijucas/Camboriu é um pulo.
    Abraços

Leave a Reply