Безопасность и создание кода "на лету"
Некоторые библиотеки создают и запускают код, выполняя определенную операцию для вызывающего объекта. Основная проблема заключается в создании кода от имени кода с более низким уровнем доверия и его выполнении в среде с более высоким доверием. Проблема усугубляется, если вызывающий объект может влиять на создание кода. Поэтому необходимо убедиться в том, что создается только код, который вы считаете безопасным.
Всегда нужно точно знать, какой код вы создаете. Это означает, что необходимо строго контролировать любые значения, получаемые от пользователя, будь то заключенные в кавычки строки (которые следует преобразовывать в escape-последовательности, чтобы исключить неожиданные элементы кода), идентификаторы (которые необходимо проверять на допустимость) и любые другие элементы. Идентификаторы могут представлять опасность, так как скомпилированную сборку можно изменить так, чтобы ее идентификаторы содержали необычные символы, что, вероятно, нарушит работу сборки (хотя во многих случаях это не создает уязвимости в защите).
Рекомендуется создавать код с помощью порождаемого отражения, что позволяет избежать многих описанных выше проблем.
При компиляции кода необходимо учитывать даже малейшую вероятность его изменения вредоносной программой. Существует ли хотя бы небольшой промежуток времени, в течение которого вредоносный код может изменить исходный код на диске до того, как тот будет считан компилятором, или до загрузки DLL-файла этим кодом? Если да, нужно защитить каталог, в котором хранятся эти файлы, с помощью списка управления доступом в файловой системе в зависимости от обстоятельств.