# V5631. OWASP. Use of externally-controlled format string. Potentially tainted data is used as a format string.

Анализатор обнаружил использование полученной из внешнего источника строки в качестве формата без предварительной проверки. В случае, если количество ячеек в строке формата и количество аргументов не совпадёт, это приведёт либо к выбросу исключения, либо к потере информации.

Рассмотрим пример:

    static void Foo(string hostName, int port, params string[] args)
    {
      using (TcpClient tcpConn = new TcpClient(hostName, port))
      {
        using (StreamReader sr = new StreamReader(tcpConn.GetStream()))
        {
          var format = sr.ReadLine();
          var data = ApplyFormat(format, args);
          ....
        }
      }
    }

    static string ApplyFormat(string format, string[] args)
    {
      return string.Format(...., format, args);
    }

В данном примере значение `format` получается по сети, после чего передаётся в 'ApplyFormat', где сразу же используется в качестве формата в методе `string.Format`. Так как перед этим не было выполнено никаких проверок на количество элементов формата `{....}` в строке, существует вероятность, что оно не совпадёт с количеством аргументов в `args`. Если количество элементов формата окажется меньше, то некоторые аргументы просто не будут вставлены в результат, а если больше — будет выброшено исключение.

Чтобы избежать потенциальных проблем, перед использованием строки формата следует выполнить её валидацию, например, с помощью регулярного выражения:

    static bool TryApplyFormat(string format, string[] args, out string data)
    {
      if (Regex.Matches(format, ....).Count == args.Length)
      {
        data = string.Format(format, args);
        return true;
      }

      data = null;
      return false;
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как:

CWE-134 OWASP-1.3.10