Medalha de Prata no phpclasses.org |
Como monitorar erros que possam surgir em um sites publicados? Por
e-mail? Que tal via RSS e usando o log gerado pelo próprio PHP? |
Quando lançamos um site, pensamos: missão cumprida. “Próximo!!!”
Mas não é bem assim. Apesar dos testes, é somente quando ele estiver funcionando
que alguns erros imprevistos aparecerão.
Como monitorar estes erros? Usei e-mail durante anos, mas não é uma boa,
pois você tem que especificar no próprio código que tipo de erro quer ser
notificado:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or
die(mail(“meuemail @ meusite.com”, “Epa! Um erro ocorreu!”, mysql_error());
Ou, pior ainda:
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or
die(echo mysql_error());
Isto seria entregar o ouro para o bandido. Erros devem ser escondidos. Não
por uma questão de ego ou mesmo marketing pessoal, mas sim para proteger
seu site de invasores e pessoas mal intencionadas. Lembre-se: quanto menos
informação seu inimigo tiver, melhor.
Por outro lado, você precisa saber as falhas do seu site para poder corrigi-las.
Bem melhor do que receber um telefonema do seu cliente reclamando...
Foi pensando nisso que escrevi essa classe bem simples, mas que quebra um
galhão e te mantém informado, de maneira organizada, do que está rolando
no seu site.
Depois de instalada, você
receberá feeds dos erros, avisos e notificações do seu site, como a tela
capturada abaixo, usando o Google Reader.
Como você pode ver, a classe reproduz a notificação e mostra a linha que
apresentou problemas. Além disso, se você clicar no título do erro, ele abrirá o
arquivo na sua cópia local do site para edição. Isso funcionou bem com o Sage, a extensão do Firefox.
Mas não com leitores on line, como o Google Reader ou
o Bloglines, pois eles alteram o código. Isto está na lista
de melhorias para próxima versão. J
Agora, olhe só isso:
É aqui que mora o perigo. Veja que nosso amiguinho tentou injetar um código
externo, aproveitando-se de uma vulnerabilidade do Mambo. É um bug que permite
um ataque de Code Injection: a variável $spb não está sendo
tratada. E você nunca saberia disso, a menos que olhasse o arquivo de log
do PHP.
Preparando o sistema
Antes de tudo, você vai precisar alterar algumas coisinhas no php.ini. Isto
significa que você tem que ter ou um servidor próprio ou um host que lhe
permita acesso via shell. Felizmente, a Dreamhost permite
isso. Se você tem conta na Dreamhost ou
pretende ter, aqui estão as instruções para
você configurar seu próprio php.ini. Basicamente, você precisará editar o
seguinte no seu php.ini.:
error_reporting = E_ALL
display_errors = off
log_errors = On
error_log = "/home/user/domain/.logs/.error_log"
Coloque o arquivo de erro em um local que não tem acesso externo, por segurança.
Não coloque no mesmo diretório do seu site. Comece o arquivo com um “.”,
para ele ficar oculto. Todo cuidado é pouco. É importante definir um local
fixo para o arquivo de log. Gozado que eu não achei nenhuma referência sobre
isto no manual do PHP. Se você não discrimina o caminho do arquivo, ele vai
espalhar arquivos de log por todos os diretórios do seu site!
Feito isto, baixe o arquivo da classe.
Centralizei lá no phpclasses.org para
facilitar a manutenção do software. A instalação é super simples, mas se
você tiver problemas, dê uma olhadinha na documentação da
classe.
Descompacte o arquivo em um diretório da sua escolha. Depois crie um arquivo
com um nome
“secreto”, não obvio, e coloque as seguintes linhas:
Arquivo nadahaver.php
include_once('RSSerror.php');
$args = array( "root" => "/home/.gizelle/aajj/sgd.com.br/",
"local" => "file:///C:/Documents%20and%20Settings/SeuNome/My%20Documents/SeuSite/",
"log" => "/home/user/domain/.logs/.error_log",
"url" => "http://www.seusite.com.br/",
"lines" => 5,
"password" => "123456"
);
$param = array( "encoding" => "UTF-8",
"language" => "pt-BR",
"title" => "Error Report for www.seusite.com.br",
"description" => "Please corrects some errors occurred in the site www.seusite.com.br",
"stylesheet" => "http://www.seusite.com.br/class_RSSerror/rsserror.css",
"stylesheet" => "",
"link" => "http://www.seusite.com.br/"
);
$rss = new RRSerror($args, $param);
Para ver o resultado, no seu agregador, adicione o FEED:
http://www.seusite.com.br/nadahaver.php?p=123456
Segurança
Pesquisei sobre segurança em feeds e o que existe é agregadores que suportam
autenticação via servidor, como a do apache. Google Reader e Bloglines não aceitam. Mesmo que aceitassem, a segurança
seria praticamente a mesma desta que eu implementei. Afinal, os dados iam
trafegar abertos na rede. Se alguém estiver sniffando sua conexão, pegaria
tanto de uma forma quanto da outra.
Por isso, a melhor política é:
- Manter um nome difícil no arquivo, que não tenha nada haver com o resultado
que mostrará;
- Colocar uma senha difícil também, beeeem diferente do exemplo acima;
- Colocar o arquivo do log fora do acesso público;
- Colocar arquivos com senhas fora do acesso público, como senhas de banco
de dados;
E, claro, desabilitar algumas coisas no seu php.ini
expose_php = Off
safe_mode = On
disable_functions = exec,passthru,shell_exec,system,escapeshellarg,escapeshellcmd
Há, entretanto, uma alternativa boa que pretendo implementar futuramente,
que é criptografar o
próprio conteúdo do Feed. Mas esta solução requer obrigatoriamente o Firefox e
o Greasemonkey.
`
Mas isto não é exatamente um problema, não é? J
Ah, é importante que suas páginas não tenham o comando init_set(“display_errors”,
0), senão os arquivos de log não serão gerados.
Este script é novo e pode haver bugs. Se você encontrar algum, avise. Estou
usando há um 1 mês em dois sites e até agora tudo bem. Para comentar bugs,
deixe um comentário.
Update [03/01/2006 08:32:00]
Fiquei bastante contente ao saber que esta classe foi indicada para ganhar
o Prêmio de Inovação de dezembro, do site www.phpclasses.org.
December 2006 Number 2 |
"Error logs are important to determine when something wrong happened
with an application. Inspecting error logs may require special access
to the server, which sometimes it may not be possible to access. This
class provides an interesting solution that consists in serving error
logs as RSS feeds. This way, the logs may be inspected using a Web browser
that supports displaying RSS feeds."
Manuel Lemos |
Se for escolhida, ótimo. Será um incentivo a mais para melhorar a idéia.
Mas só o fato de ser indicada, já é uma honra e satisfação enorme.
Conheça as classes que estão concorrendo no site www.phpclasses.org.
Update [02/02/2007 11:28:00]
Medalha de prata! Uhhuhh, esquindô, ueueueue!!! Fiquei em segundo lugar junto a classe Session in Cookies. Legal, é um grande incentivo! Obrigado a todos que votaram na minha classe, espero que seja útil. E parabéns ao vencedor, o Khaled Al-Shamaa com sua classe ArDate, e a todos que participaram também! Achei muito divertido! Adora dá licença que preciso contar para minha mãe. Ops! Será que foi ela que votou?
Publique este artigo no seu site | Visto: 25459 | Imprimir
Powered by AkoComment Tweaked Special Edition v.1.4.6 AkoComment © Copyright 2004 by Arthur Konze - www.mamboportal.com All right reserved |