Анализатор обнаружил класс исключения, недоступный для внешних классов. Если такое исключение будет выброшено, внешний код будет вынужден отлавливать объекты ближайшего доступного предка или вообще базового класса всех исключений – 'Throwable'. В этом случае усложняется обработка конкретных исключительных ситуаций, ведь внешний код не сможет чётко идентифицировать возникшую проблему.
Отсутствие чёткой идентификации возникшей проблемы несёт дополнительные риски с точки зрения безопасности, так как для каких-то определённых исключительных ситуаций может понадобиться специфичная обработка, а не общая. Недостаточное логирование и мониторинг (в том числе, обнаружение проблем) выделены в отдельную категорию рисков в OWASP Top 10 Application Security Risks 2017: A10:2017-Insufficient Logging & Monitoring.
Простой пример из реального проекта:
public class TxnLogToolkit implements Closeable
{
static class TxnLogToolkitException extends Exception
{
....
private int exitCode;
TxnLogToolkitException(int exitCode, ....)
{
super(....);
this.exitCode = exitCode;
}
int getExitCode()
{
return exitCode;
}
}
....
}
Чтобы можно было корректно обработать конкретную исключительную ситуацию, необходимо задать в объявлении класса модификатор доступности 'public':
public class TxnLogToolkit implements Closeable
{
public static class TxnLogToolkitException extends Exception
{
....
private int exitCode;
public TxnLogToolkitException(int exitCode, ....)
{
super(....);
this.exitCode = exitCode;
}
public int getExitCode()
{
return exitCode;
}
}
....
}
Теперь код внешних классов сможет отлавливать данное исключение и обрабатывать конкретную ситуацию.
Следует учитывать, что для вложенных классов модификатора 'public' у объявления исключения может быть недостаточно. Например:
class OperatorHelper
{
public static class OpCertificateException extends CertificateException
{
private Throwable cause;
public OpCertificateException(String msg, Throwable cause)
{
super(msg);
this.cause = cause;
}
public Throwable getCause()
{
return cause;
}
}
}
В данном примере класс исключения вложен в класс 'OperatorHelper', который неявно объявлен как 'package-private'. Вследствие этого исключение 'OpCertificateException' также будет видимо только в пределах текущего пакета, несмотря на то, что имеет модификатор доступа 'public'. Анализатор обнаруживает такие случаи и выдаёт соответствующие предупреждения.
Данная диагностика классифицируется как:
|