最近我設法使用了.NET 3.5下的SQL Server 2008託管的Razor解析器。此刻,它實際上只是一個實驗,以查看哪些可行。這是行得通的,包括動態編譯剃刀模板程序集,然後將其加載到AppDomain中(that was a mission!)。禁用在SQLCLR上運行的代碼的輸入
由於SQLCLR不允許在任何SQLCLR託管代碼中使用Assembly.Load(),即使使用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
,也許使用代碼訪問安全性或其他方法?