安全なコーディングのガイドライン

証拠ベースのセキュリティとコード アクセス セキュリティによって、セキュリティを実装するための強力で明確な機構がもたらされます。 ほとんどのアプリケーション コードでは、.NET Framework によって実装されたインフラストラクチャを単純に使用できます。 ただし、アプリケーションによっては、セキュリティ システムを拡張するか、新しい特別な方法を使用することによって構築した、アプリケーション専用の追加セキュリティが必要になることもあります。

.NET Framework が実施するアクセス許可やコード内のその他の強制的な方法によって、悪意のあるコードが機密情報を盗用したり、望まないアクションを実行したりするのを防ぐために、防御機構を構築する必要があります。 さらに、信頼できるコードを使用する、意図するすべてのシナリオにおいて、セキュリティと使い勝手を両立させる必要があります。

ここでは、セキュリティ システムと共に動作するコードのさまざまなデザイン方法について説明します。

メモメモ

.NET Framework Version 4 では、.NET Framework のセキュリティ モデルと用語に重要な変更が加えられています。これらの変更の詳細については、「.NET Framework 4 におけるセキュリティの変更点」を参照してください。

セキュリティに中立的なコード

セキュリティに中立的なコードは、セキュリティ システムとは明示的には何もしません。 受け取ったアクセス許可に基づいて実行するだけです。 保護された操作 (ファイルの使用、ネットワーク接続など) に関連するセキュリティ例外のキャッチに失敗したアプリケーションが、処理されない例外という結果になることもありますが、それでもセキュリティに中立的なコードは .NET Framework のセキュリティ技術を利用できます。

セキュリティに中立的なライブラリは特殊な特徴を持っていて、これを理解する必要があります。 ライブラリが、ファイルを使用するかアンマネージ コードを呼び出す API 要素を提供するものとします。このコードは、対応するアクセス許可を持たないと、目的どおりには実行されません。 しかし、コードがアクセス許可を持っていたとしても、それを呼び出す任意のアプリケーション コードが動作するためには、同じアクセス許可が必要になります。 呼び出し元のコードが正しいアクセス許可を持っていない場合は、コード アクセス セキュリティのスタック ウォークの結果として SecurityException が発生します。

再利用可能なコンポーネントではないアプリケーション コード

コードが、他のコードから呼び出されることのないアプリケーションの一部の場合は、セキュリティは単純で、特別なコーディングは必要ありません。 しかし、悪意のあるコードは他のコードを呼び出せるため注意が必要です。 コード アクセス セキュリティが、悪意のあるコードに対しリソースへのアクセスを停止しても、このようなコードは、機密情報を含むフィールドやプロパティ値を読み取ることができる可能性があります。

また、アプリケーションがインターネットまたは他の信頼できないリソースからのユーザー入力を受け付ける場合は、悪意のある入力にも注意が必要です。

ネイティブなコード実装へのマネージ ラッパー

このシナリオでは、一般的に、マネージ コードで利用するいくつかの役に立つ機能がネイティブ コードで実装されています。 マネージ ラッパーは、プラットフォーム呼び出しまたは COM 相互運用を使用して簡単に書くことができます。 ただし、これを行う場合、ラッパーの呼び出し元は、呼び出しを成功させるためにアンマネージ コードの権限を持つ必要があります。 既定のポリシーでは、これは、イントラネットまたはインターネットからダウンロードしたコードは、ラッパーと共には動作しないことを意味します。

これらのラッパーを使用するすべてのアプリケーションにアンマネージ コードの権限を与えるよりも、これらの権限をラッパー コードだけに与える方が優れています。 基になる機能がリソースを公開せず、さらに実装がセーフな場合は、ラッパーは自分自身の権限をアサートするだけでよく、それを通じて呼び出す任意のコードが有効になります。 リソースが含まれる場合は、セキュリティのコーディングは、次のセクションで説明するライブラリ コードのケースと同じにする必要があります。 ラッパーは呼び出し元をこれらのリソースに公開する可能性があるため、ネイティブ コードの安全性を慎重に検証する必要があります。これはラッパー側で行うことが必要です。

保護されたリソースを公開するライブラリ コード

これは、セキュリティ コーディングにとって最も強力で、それゆえ危険性のある (誤って行った場合) 方法です。ライブラリは、他の方法では利用できない特定のリソースへ他のコードがアクセスするときのインターフェイスとして機能します。ちょうど、.NET Framework のクラスが、使用するリソースへのアクセス許可を強化するのに似ています。 どこでリソースを公開する場合でも、コードは最初にリソースに適したアクセス許可を要求する (つまり、セキュリティ チェックを実行する) 必要があります。次に、実際の操作を実行するために自分自身の権限をアサートします。

関連トピック

タイトル

説明

方法 : サンドボックスで部分信頼コードを実行する

制限されたセキュリティ環境で、部分的に信頼されたアプリケーションを実行する方法について説明します。この場合、アプリケーションに付与されるコード アクセス許可が制限されます。

アクセス許可要求

セキュリティ要求を使用して .NET Framework セキュリティ システムとやり取りする方法について説明します。

状態データの保護

プライベート メンバーを保護する方法について説明します。

メソッド アクセスの保護

部分的な信頼のコードにメソッドが呼び出されることを防ぐために役立つ方法について説明します。

ラッパー コードの保護

他のコードをラップするコードのセキュリティについて説明します。

セキュリティとパブリックの読み取り専用配列フィールド

.NET Framework ライブラリ内にあるパブリックの読み取り専用配列を使用するコードのセキュリティについて説明します。

例外処理の保護

例外処理のセキュリティについて説明します。

セキュリティとユーザー入力

ユーザーからの入力を受け付けるアプリケーションのセキュリティについて説明します。

セキュリティとリモート処理の考慮事項

アプリケーション ドメインを越えて通信するアプリケーションのセキュリティについて説明します。

セキュリティとシリアル化

オブジェクトのシリアル化の際のセキュリティについて説明します。

セキュリティと競合状態

コードでの競合状態を避ける方法について説明します。

セキュリティと実行時のコード生成

動的なコードを生成するアプリケーションのセキュリティについて説明します。

危険なアクセス許可とポリシー管理

セキュリティが回避される可能性のあるアクセス許可について説明します。

セキュリティとセットアップの問題

アプリケーションのテストとセットアップにおける考慮事項について説明します。

ASP.NET Web アプリケーションのセキュリティ

ASP.NET セキュリティの詳細、およびコードで使用する方法について説明します。

コード アクセス セキュリティ

.NET Framework のコード アクセス セキュリティの詳細、およびコードで使用する方法について説明します。

ロール ベース セキュリティ

.NET Framework のロール ベース セキュリティの詳細、およびコードで使用する方法について説明します。