Tags
Recent Comments
- Letting Agents Cardiff on IPP2P for Recent Kernels
- marcelus on Listinha dos Apps instalados no meu N95
- alexm on Interceptando funções internas no PHP
- alexm on Linux: deauthenticating from by local choice (reason=3)
- Gilberto Albino on Linux: deauthenticating from by local choice (reason=3)
Links
- blog ccna
- comgurus
- fofysfactory
- gestão e humor corporativo!
- ivan jerônimo
- ramalho.blog
- rodrigostoledo.com
- seventeen second
- symbian freak
- unetvale
- unetvale conectividade
- zend
Busca
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
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
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();
}
}
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é.
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
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
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:
Abraços
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
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