É uma falha de segurança registrar o nome da classe e do método quando ocorre uma exceção?

8

Eu tenho o seguinte:

public class doCheck(){

    public void performCheck(){
        try {
            perform all checks......
        }
        catch(Exception e){
            logger.error("Exception occured in class doCheck in method performCheck");
            thrown new MyNewException(e.getMessage());
        }
    }
}

É seguro registrar o nome da classe e do método?

céu azul
fonte

Respostas:

8

Isso depende se sua base de código está oculta ou não. Se você enviar o produto ao cliente, ele poderá inspecionar o código de bytes Java trivialmente de qualquer maneira, para que o registro de nomes de classes não revele nenhuma informação que o usuário não possa obter.

Para um aplicativo do lado do servidor, isso ainda é verdade. No entanto, pode ser uma falha de segurança exibir esses logs para o cliente. É por isso que a maioria das estruturas de aplicativos da web distingue entre uma configuração de desenvolvimento e produção: durante o desenvolvimento, as informações de depuração são exibidas ao usuário no caso de um erro. Na produção, essas informações são registradas no servidor, mas não são mais exibidas no navegador da web / no cliente.

Konrad Rudolph
fonte
Sim, e é importante garantir que os próprios logs sejam seguros - não podem ser acessados ​​por usuários externos e absolutamente não podem ser modificados.
Donald.McLean
2
Em resumo, registrar a classe / método é uma coisa boa . Permitir que o log (ou um rastreamento de pilha) escape é uma coisa ruim .
Qwerky
6

A @Konrad respondeu à pergunta direta, no entanto, o tratamento de exceções tem um problema menor e dois graves. Desde que você postou originalmente no codereview.SE, aqui estão eles:

  1. Registrar uma exceção antes de lançar é inútil. Registre onde você lida com isso e não se preocupe em pegá-lo se não planeja lidar com ti.
  2. Se você deseja registrar uma exceção, registre a exceção; não diga simplesmente "uma exceção aconteceu" e espere que as pessoas adivinhem qual é a exceção. Todas as estruturas de log comuns fornecem um método de dois argumentos: o primeiro é a mensagem, o segundo é o lançamento.
  3. Relançar uma exceção com apenas uma mensagem é o mesmo problema, mas é uma instância pior. Entendo (apenas) por que você pode não querer que um rastreamento de pilha de exceção apareça em seus logs. Mas uma vez lançada a nova exceção, você não tem absolutamente nenhuma maneira de dizer qual é o verdadeiro problema . Especialmente se você mantiver o hábito de capturar e relançar.

OK, vou adicionar uma quarta questão: você registra onde a exceção aconteceu, mas não diz o que estava fazendo quando ocorreu, nem fornece informações contextuais. Se você registrar a exceção real (ponto 1), saberá onde aconteceu. Mais importante é dizer algo como "não é possível abrir o arquivo foo.txt".

parsifal
fonte
1

Não é particularmente inseguro; portanto, a menos que haja algo crítico que você queira ocultar nesta classe ou se a classe fizer parte de um caminho crítico (como um aperto de mão seguro ou um recurso "oculto"), eu não consideraria isso um problema em absoluto.

Além disso, estamos falando sobre Java aqui. Portanto, se estamos falando de um aplicativo do lado do cliente executando Java no cliente, eles sempre podem modificar o JRE para adicionar suas próprias rotinas de depuração e / ou usar um carregador de classes personalizado e acessar suas classes da maneira que desejar. Tornar isso mais difícil para eles (por meio da ocultação de coisas mais profundas, ou mesmo do código ofuscante) é sempre uma possibilidade, mas geralmente não é rentável quando você considera o tempo e o esforço necessários para conseguir isso contra as perdas causadas por fatores estatisticamente improváveis. usuários mal-intencionados.

Se estivermos falando de um software do servidor que pode gerar logs para os clientes (por exemplo, no navegador do usuário), provavelmente não é muito importante, mas já é mais simples de corrigir: configure seu contêiner portanto, e use uma estrutura de log ou multiplexador para gerar os arquivos apropriados no servidor para fins de depuração. Dessa forma, você mantém registros úteis para depuração, mas não compromete informações potencialmente úteis.

Mas, em geral, isso provavelmente não seria um problema. é mais o que você coloca na mensagem de depuração que pode ser um problema, pois geralmente desenvolvemos como desenvolvedores a saída das coisas em que trabalhamos (você não deseja deixar essas saídas de depuração para nomes de usuário, senhas, sais e tokens de segurança à vista) )

haylem
fonte