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

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

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

```cpp
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`\. Если количество элементов формата окажется меньше, то некоторые аргументы просто не будут вставлены в результат, а если больше — будет выброшено исключение\.

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

```cpp
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;
}
```