マネージド ストアド プロシージャまたはその他のマネージド データベース オブジェクトをビルドする場合、SQL Server によって実行される特定のコード チェックは、データベースに最初に登録されたときに、 CREATE ASSEMBLY
ステートメントを使用して、実行時にもマネージド コード アセンブリに対してチェックを実行します。 マネージド コードは実行時にもチェックされます。アセンブリ内には、実行時に実際には到達できないコード パスがある可能性があるためです。 これにより、サードパーティのアセンブリを登録する柔軟性が得られます。特に、クライアント環境で実行するように設計された "安全でない" コードがあるが、ホストされている CLR では実行されない場合にアセンブリがブロックされないようにします。 マネージド コードが満たす必要がある要件は、アセンブリが SAFE
、 EXTERNAL_ACCESS
、または UNSAFE
として登録されているかどうかによって異なります SAFE
、以下に示します。
マネージド コード アセンブリには、制限事項に加えてコード セキュリティ権限も付与されます。 共通言語ランタイム (CLR) では、マネージド コードのコード アクセス セキュリティ (CAS) と呼ばれるセキュリティ モデルがサポートされています。 このモデルでは、コードの ID に基づいてアセンブリに権限が許可されます。
SAFE
、EXTERNAL_ACCESS
、および UNSAFE
の各アセンブリには、それぞれ異なる CAS 権限が付与されます。 詳細については、「 CLR 統合コード アクセス セキュリティを参照してください。
CREATE ASSEMBLY チェック
CREATE ASSEMBLY
ステートメントを実行すると、セキュリティ レベルごとに次のチェックが実行されます。 いずれかのチェックが失敗した場合、 CREATE ASSEMBLY
はエラー メッセージで失敗します。
グローバル (すべてのセキュリティ レベル)
参照されるすべてのアセンブリは、次の条件のうち 1 つ以上を満たす必要があります。
既にデータベースに登録されていること。
サポートされているアセンブリの 1 つであること。 詳細については、「 サポートされている .NET Framework ライブラリ」を参照してください。
CREATE ASSEMBLY FROM
<location> を使用しており、参照されているすべてのアセンブリとその依存関係を <location> で使用できます。CREATE ASSEMBLY FROM
<bytes ...> を使用しており、すべての参照はスペース区切りバイトで指定されます。
EXTERNAL_ACCESS
すべての EXTERNAL_ACCESS
アセンブリは、次の条件を満たす必要があります。
静的フィールドは、情報の格納には使用されません。 読み取り専用の静的フィールドは許可されます。
PEVerify テストに合格しました。 MSIL コードと関連するメタデータが型の安全性要件を満たしていることを確認する PEVerify ツール (peverify.exe) は、.NET Framework SDK で提供されます。
たとえば、
SynchronizationAttribute
クラスとの同期は使用されません。ファイナライザー メソッドは使用されません。
EXTERNAL_ACCESS
アセンブリでは、次のカスタム属性が許可されません。
System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute
金庫
-
EXTERNAL_ACCESS
アセンブリの条件がすべてチェックされていること。
ランタイム チェック
コード アセンブリは、実行時に次の条件をチェックされます。 これらの条件のいずれかが見つかった場合、マネージド コードの実行は許可されず、例外がスローされます。
UNSAFE
バイト配列から System.Reflection.Assembly.Load()
メソッドを呼び出してアセンブリを明示的に読み込むか、 Reflection.Emit
名前空間を使用して暗黙的に読み込むのは許可されません。
EXTERNAL_ACCESS
UNSAFE
の条件がすべてチェックされていること。
サポートされているアセンブリの一覧の中で、次のホスト保護属性 (HPA) 値で注釈を付けられている型およびメンバーはすべて許可されません。
SelfAffectingProcessMgmt
SelfAffectingThreading
同期化
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
ユーザーインターフェース
HPA の詳細と、サポートされているアセンブリの許可されていない型とメンバーの一覧については、「 ホスト保護属性と CLR 統合プログラミング」を参照してください。
金庫
EXTERNAL_ACCESS
の条件がすべてチェックされていること。
こちらもご覧ください
サポートされている .NET Framework ライブラリ
CLR 統合コード アクセス セキュリティ
ホスト保護属性と CLR 統合プログラミング
アセンブリの作成