Отключить ввод кода, работающего в SQLCLR

Недавно мне удалось заставить синтаксический анализатор Razor работать под .NET 3.5 и размещаться на SQL Server 2008. На данный момент это просто эксперимент, чтобы увидеть, что возможно. Это работает, включая динамическую компиляцию сборок шаблонов Razor, которые затем загружаются в AppDomain (это была миссия! ).

Поскольку SQLCLR не позволяет использовать Assembly.Load() в любом размещенном коде SQLCLR, даже с PERMISSION_SET = UNSAFE. Мой обходной путь для этого - зарегистрировать сборку сразу после компиляции, используя sp_executesql, который я создаю оператором CREATE ASSEMBLY. Когда я динамически визуализирую эти сборки шаблонов, я делаю это с PERMISSION_SET = SAFE, чтобы убедиться, что они не делают ничего, кроме того, что разрешено для безопасных сборок.

Теперь самое сложное заключается в том, что эти шаблоны бритвы работают в контексте подключенного пользователя, поэтому у них есть доступ к базе данных, например, в моем шаблоне я мог бы сделать:

@import System.Data.SqlClient
@{
    using (var conn = new SqlConnection("Context Connection = true"))
    {
        conn.Open();
        // Execute something against the database
    }
}

PERMISSION_SET = SAFE позволит это сделать, так как это одна из причин, по которой SQLCLR вообще существует, но в этих сборках шаблонов я хочу ввести некоторую дополнительную защиту, которая позволит мне предотвратить выполнение пользователями каких-либо действий с базой данных.

Кто-нибудь знает способ отключить типы, такие как SqlConnection или SqlCommand, возможно, с помощью Code Access Security или другого метода?


person Matthew Abbott    schedule 16.09.2011    source источник


Ответы (1)


SqlClientPermission можно использовать для предотвращения использования SqlConnection.

person Jared Moore    schedule 21.09.2011