Um colega comentou recentemente que, embora meu último post tenha dado uma explicação válida de como um 408 poderia ter uma associação com uma medida de segurança, ele não ofereceu nenhuma solução.
O log de acesso canalizado é minha solução pessoal.
O seguinte deve funcionar de forma imediata na maioria das configurações do Ubuntu, e com o mínimo de ajustes em outras configurações do Apache. Eu escolhi o PHP porque é o mais fácil de entender. Existem dois scripts: o primeiro impede que um 408 seja gravado no seu log de acesso. O segundo script envia todos os 408s para um arquivo de log separado. De qualquer forma, o resultado não é mais 408s no seu log de acesso. É sua escolha qual script implementar.
Use seu editor de texto favorito, eu uso nano. Abra o arquivo onde você tem suas diretivas 'LogFormat' e 'CustomLog'. Comente os originais com o usual # e adicione o seguinte. Você pode encontrar essas diretivas no arquivo abaixo.
sudo nano / etc / apache2 / sites-disponíveis / padrão
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe
CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog
NOTA: Não registro imagens no meu log de acesso. No meu arquivo etc / apache2 / httpd.conf incluo a linha
SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog
Se isso não for de seu interesse, remova o env=!dontlog
da diretiva CustomLog
.
Agora crie um dos seguintes scripts PHP ( #!/usr/bin/php
é uma referência à localização do interpretador, verifique se o local está correto para o seu sistema - você pode fazer isso digitando no prompt $; whereis php
- isso deve retornar algo como php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
. Como você pode ver, o #!/usr/bin/php
é o ideal para minha configuração).
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) == "") {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$file408 = '/var/log/apache2/408.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) != "") {
file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
}
else {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
Tendo salvo o script PipedAccessLog.php
; Certifique-se de que o root possua a propriedade executando o seguinte no prompt $.
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
O script PipedAccessLog.php
precisará de permissões de leitura / gravação e execução, portanto, execute o seguinte no prompt $.
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
Finalmente, para que tudo funcione, você precisa reiniciar o serviço Apache. Execute o seguinte no prompt $.
sudo service apache2 restart
Se os seus logs do Apache estiverem localizados em outro lugar, altere os caminhos para adequá-los à sua configuração. Boa sorte.