Насколько опасно разрешать пользователям указывать шаблоны RazorEngine? - PullRequest
7 голосов
/ 14 октября 2011

У меня есть функция, подобная слиянию почты, которая берет шаблон, некоторый бизнес-объект и создает HTML, который затем превращается в PDF.

Я использую RazorEngine , чтобы сделать шаблон + модель в HTML-бит.

Если я позволю пользователям указывать шаблоны, какие риски я принимаю? Можно ли снизить риски?

Например, могут ли пользователи выполнять произвольный код? (удалить файлы, изменить базу данных и т. д.?) Есть ли способ, как я могу обнаружить такого рода вещи? (Я знаю, что это было бы вообще невозможно, но биты кода в шаблоне бритвы должны быть получены из свойств модели или, возможно, если операторы основаны на значениях свойств модели).

Я в основном доверяю пользователям здесь (это небольшой частный проект), но поскольку движки шаблонов идут, этот кажется слишком мощным для этого приложения.

Ответы [ 3 ]

11 голосов
/ 14 октября 2011

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

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

Я поместил раннюю версию RazorEngine (v3) на GitHub несколько дней назад. Не стесняйтесь проверить это. https://github.com/Antaris/RazorEngine

6 голосов
/ 14 октября 2011

Файл cshtml Razor способен выполнить любой. NET код в контексте сайта, так что да, это угроза безопасности, позволяющая пользователям предоставлять их.

Вам будет лучше, если вы примете более общий шаблон HTML с пользовательскими токенами для ввода данных модели.

1 голос
/ 14 октября 2011

Я считаю, что удаление using операторов и замена любых @System.[...], таких как System.IO.File.Delete(filepath) с использованием регулярных выражений, может уменьшить значительное количество возможных дыр в безопасности.

Имейте в виду, что шаблон работает внутри контекста и может получать доступ только к тому, что доступно в нем, но также включает сборки .NET Framework.

...