Escape-символы в строках формата ETW?

Я использую новый класс EventSource для записи в журнал событий Windows из моих приложений, и пока это здорово. Однако я наблюдаю две вещи, которые вызывают проблемы, которые, вероятно, связаны с этим: строки формата, передаваемые атрибуту Event, по-видимому, не подвергаются обычной строке. Обработка формата перед записью в журнал событий.

Рассмотрим этот блок:

[Event((int)LogEvent.UserCreated, Keywords=Keywords.Directory, Channel=EventChannel.Operational,
Message="Created username {0} with forum post signature {1} and homepage {2}.")]
public void UserCreated(string username, string signature, string homepageAddress)
{
    WriteEvent((int)LogEvent.UserCreated, username, signature, homepageAddress);
}

Происходит несколько вещей:

  • Если я попытаюсь вставить \ n в строку формата сообщения, новая строка не будет напечатана в журнале событий.
  • Если строка подписи содержит новую строку, новая строка печатается естественным образом в журнале событий.
  • Если строки сигнатуры или homepageAddress содержат ETW-подобные токены (%1, %2 или%3), то ETW начинает заменять эти псевдо-токены самими переменными, и в итоге я получаю переменные, вложенные в себя.

Я предполагаю, что если бы для ETW был escape-символ, его можно было бы использовать для добавления новых строк в строки формата, а также позволил бы мне предварительно обработать мои строковые значения для защиты от этих ошибок стиля sql-инъекций.

Существует ли такой экранирующий персонаж? Как это обычно делается?

1 ответ

Решение

Перевод, выполняемый генератором манифеста EventSource:

{0} -> %1
...
{n} -> %(n+1)

&   -> &
<   -> &lt;
>   -> &gt;
'   -> &apos;
"   -> &quot;

Для справки, преобразование происходит в string EventProviderBase.TranslateToManifestConvention(string),

Затем вы попадаете в компилятор сообщений. Побеги следующие:

%n[!format_specifier!]  Describes an insert. Each insert is an entry in the 
    Arguments array in the FormatMessage function. The value of n can be a number 
    between 1 and 99. The format specifier is optional. If no value is specified, 
    the default is !s!. For information about the format specifier, see wsprintf. 
    The format specifier can use * for either the precision or the width. When 
    specified, they consume inserts numbered n+1 and n+2.

%0  Terminates a message text line without a trailing newline character. This can 
    be used to build a long line or terminate a prompt message without a trailing 
    newline character.

%.  Generates a single period. This can be used to display a period at the 
    beginning of a line, which would otherwise terminate the message text.

%!  Generates a single exclamation point. This can be used to specify an 
    exclamation point immediately after an insert.

%%  Generates a single percent sign.

%n  Generates a hard line break when it occurs at the end of a line. This can be 
    used with FormatMessage to ensure that the message fits a certain width.

%b  Generates a space character. This can be used to ensure an appropriate number 
    of trailing spaces on a line.

%r  Generates a hard carriage return without a trailing newline character.
Другие вопросы по тегам