﻿# V5621\. OWASP\. Error message contains potentially sensitive data that may be exposed\.

Анализатор обнаружил раскрытие потенциально чувствительных данных, содержащихся в сообщении об ошибке\. К таким данным относятся сообщения и стеки исключений\.

Ошибки, связанные с неявным раскрытием чувствительных данных, относятся к категории [A04:2021 – Insecure Design](https://owasp.org/Top10/A04_2021-Insecure_Design/) списка OWASP Top 10 Application Security Risks\.

Рассмотрим пример уязвимости:

```cpp
public void Foo(string value)
{
  try
  {
    int intVal = int.Parse(value);
    ....
  }
  catch (Exception e)
  {
    Console.WriteLine(e.StackTrace);  // <=
  }
}
```

Не рекомендуется показывать пользователям стеки исключений\. Это может привести к раскрытию информации о деталях реализации проекта\. Например, могут быть раскрыты названия используемых в проекте библиотек, а они могут содержать известные уязвимости\. Злоумышленник может использовать эту информацию для атаки на проект\. 

Также стек исключения для стандартных классов исключений \.NET может быть раскрыт через метод 'ToString':

```cpp
public void Foo(string value)
{
  try
  {
    int intVal = int.Parse(value);
    ....
  }
  catch (Exception e)
  {
    Console.WriteLine(e.ToString());  // <=
  }
}
```

Следует помнить, что 'ToString' вызывается внутри методов вывода, принимающих 'object' в качестве аргумента:

```cpp
Console.WriteLine(e);
```

Решением этой проблемы архитектуры может быть предотвращение вывода чувствительной информации пользователю\. Например, можно использовать ресурсы, явно связанные с исключениями, но не содержащие чувствительной информации\. Простой пример с использованием 'enum':

```cpp
enum ErrorCode
{
  /// <summary>
  /// ArgumentNull exception occurred
  /// </summary>
  ArgumentNull,
  ....
  Unknown
}
public void Foo(string value)
{
  try
  {
    int intVal = int.Parse(value);
    ....
  }
  catch (Exception e)
  {
    ErrorCode errCode = e switch
    {
      ArgumentNullException => ErrorCode.ArgumentNull,
      ....
      _ => ErrorCode.Unknown
    };
    Console.WriteLine("An error has occurred: " + errCode);  // <=
  }
}
```