セキュリティで保護されたコーディングのガイドラインSecure coding guidelines

エビデンスベース セキュリティとコード アクセス セキュリティは、セキュリティを実現するための強力で明示的なメカニズムを提供します。Evidence-based security and code access security provide very powerful, explicit mechanisms to implement security. ほとんどのアプリケーション コードは、.NET で実装されるインフラストラクチャを使用して単純にできます。Most application code can simply use the infrastructure implemented by .NET. 場合によっては、アプリケーション特有の追加のセキュリティが必要になります。これは、セキュリティ システムを拡張するか、または新しい特有の方法を使用して構築されます。In some cases, additional application-specific security is required, built either by extending the security system or by using new ad hoc methods.

アクセス許可と、コードでは、その他の強制を適用する .NET を使用して、悪意のあるコードから、必要であることを必要しない情報へのアクセスまたはその他の望ましくないアクションを実行するようにするための障壁を築く必要があります。Using .NET enforced permissions and other enforcement in your code, you should erect barriers to prevent malicious code from accessing information that you don't want it to have or performing other undesirable actions. また、信頼されるコードを使用するすべての想定されるシナリオで、セキュリティと使いやすさのバランスを取る必要があります。Additionally, you must strike a balance between security and usability in all the expected scenarios using trusted code.

この概要では、セキュリティ システムと連携するようコードを設計するさまざまな方法を説明します。This overview describes the different ways code can be designed to work with the security system.

リソースへのアクセスをセキュリティで保護します。Securing resource access

コードを設計して作成する場合、作成元が不明なコードを使用したり呼び出したりする際は特に、コードがリソースに対して持つアクセス権の保護と制限を行う必要があります。When designing and writing your code, you need to protect and limit the access that code has to resources, especially when using or invoking code of unknown origin. そのため、コードの安全性を確保するために次の点に注意します。So, keep in mind the following techniques to ensure your code is secure:

  • コード アクセス セキュリティ (CAS) を使用しないでください。Do not use Code Access Security (CAS).

  • 部分的に信頼されたコードを使用しないでください。Do not use partial trusted code.

  • 使用しないでください、 AllowPartiallyTrustedCaller属性 (APTCA)。Do not use the AllowPartiallyTrustedCaller attribute (APTCA).

  • .NET リモート処理を使用しないでください。Do not use .NET Remoting.

  • 分散コンポーネント オブジェクト モデル (DCOM) を使用しないでください。Do not use Distributed Component Object Model (DCOM).

  • バイナリ フォーマッタを使用しないでください。Do not use binary formatters.

コード アクセス セキュリティと透過的セキュリティ コードが部分的に信頼されたコードでセキュリティ境界としてサポートされていません。Code Access Security and Security-Transparent Code are not supported as a security boundary with partially trusted code. 発生元の不明なコードの読み込みと実行に関しては、他のセキュリティ対策を適切に導入することなく行わないようにしてください。We advise against loading and executing code of unknown origins without putting alternative security measures in place. 代わりのセキュリティ対策は次のとおりです。The alternative security measures are:

  • 仮想化Virtualization

  • AppContainersAppContainers

  • オペレーティング システム (OS) のユーザーおよびアクセス許可Operating system (OS) users and permissions

  • Hyper-V コンテナーHyper-V containers

セキュリティ中立なコードSecurity-neutral code

セキュリティ中立なコードは、セキュリティ システムに対して明示的な操作を何も行いません。Security-neutral code does nothing explicit with the security system. これは何であれ自分が受け取ったアクセス許可を使用して動作します。It runs with whatever permissions it receives. (ファイルやネットワー キングの使用) などの保護された操作に関連付けられているセキュリティ例外をキャッチする失敗したアプリケーションは、ハンドルされない例外により、セキュリティに中立なコードも所要のセキュリティ テクノロジを利用で .NET.Although applications that fail to catch security exceptions associated with protected operations (such as using files, networking, and so on) can result in an unhandled exception, security-neutral code still takes advantage of the security technologies in .NET.

セキュリティ中立なライブラリは、理解しておくべき特別な特性を持っています。A security-neutral library has special characteristics that you should understand. ライブラリ ファイルを使用して、またはアンマネージ コードを呼び出す API 要素を提供するとします。Suppose your library provides API elements that use files or call unmanaged code. コード対応するアクセス許可のないの説明に従って実行されません。If your code doesn't have the corresponding permission, it won't run as described. しかし、コードがアクセス許可を持っているとしても、そのコードを呼び出すアプリケーション コードが同じアクセス許可を持っていなければ、正しく機能しません。However, even if the code has the permission, any application code that calls it must have the same permission in order to work. 呼び出し元のコードは、適切なアクセス許可を持っていない場合、SecurityExceptionコード アクセス セキュリティのスタック ウォークの結果として表示されます。If the calling code doesn't have the right permission, a SecurityException appears as a result of the code access security stack walk.

再利用可能なコンポーネントのないアプリケーション コードApplication code that isn't a reusable component

コードが他のコードによって呼び出さしないアプリケーションの一部である場合は、セキュリティが単純にあり、特別なコーディングは必要ありません。If your code is part of an application that won't be called by other code, security is simple and special coding might not be required. ただし、悪意のあるコードがそのコードを呼び出す可能性があることを忘れないでください。However, remember that malicious code can call your code. 悪意のあるコードによるリソースへのアクセスをコード アクセス セキュリティが阻止する可能性もありますが、機密情報を含んだフィールドやプロパティの値をそのようなコードが読み取ることも考えられます。While code access security might stop malicious code from accessing resources, such code could still read values of your fields or properties that might contain sensitive information.

また、コードがインターネットやその他の信頼できないソースからのユーザー入力を受け付ける場合には、悪意のある入力にも注意する必要があります。Additionally, if your code accepts user input from the Internet or other unreliable sources, you must be careful about malicious input.

ネイティブ コードの実装へのマネージ ラッパーManaged wrapper to native code implementation

一般にこのシナリオは、何らかの有用な機能がネイティブ コードで実装されており、これをマネージド コードで利用したいというケースに該当します。Typically in this scenario, some useful functionality is implemented in native code that you want to make available to managed code. マネージド ラッパーは、プラットフォーム呼び出しか COM 相互運用を使用して簡単に作成できます。Managed wrappers are easy to write using either platform invoke or COM interop. ただしこの場合には、操作を成功させるために、ラッパーの呼び出し元がアンマネージ コードの権利を持っている必要があります。However, if you do this, callers of your wrappers must have unmanaged code rights in order to succeed. 既定のポリシーでは、つまり、コードがイントラネットからダウンロードまたはラッパーで、インターネットは機能しません。Under default policy, this means that code downloaded from an intranet or the Internet won't work with the wrappers.

これらのラッパーを使用するすべてのアプリケーションにアンマネージ コードの権利を与える代わりに、ラッパー コードのみにこれらの権限を付与することをお勧めします。Instead of giving unmanaged code rights to all applications that use these wrappers, it's better to give these rights only to the wrapper code. 基になる機能が何もリソースを公開しておらず、かつ実装も同様に安全である場合、ラッパーは、自分の権利をアサートしさえすれば、あらゆるコードが自分を通して呼び出しを行えるようにできます。If the underlying functionality exposes no resources and the implementation is likewise safe, the wrapper only needs to assert its rights, which enables any code to call through it. リソースが関係する場合のセキュリティ コーディングは、次のセクションで説明するライブラリ コードのケースと同じです。When resources are involved, security coding should be the same as the library code case described in the next section. ラッパーはこれらのリソースに対して呼び出し元を公開する可能性があるため、ネイティブ コードの安全性を慎重に確認する必要があり、その責任はラッパーにあります。Because the wrapper is potentially exposing callers to these resources, careful verification of the safety of the native code is necessary and is the wrapper's responsibility.

保護されたリソースを公開するライブラリ コードLibrary code that exposes protected resources

次のアプローチはため、最も強力な (間違えるなら) が危険を伴うセキュリティ コーディング: ライブラリが他のコードは .NET クラスに適用するのと同じようにそれ以外の場合、使用可能な特定のリソースにアクセスするためのインターフェイスとして機能使用しているリソースのアクセスを許可します。The following approach is the most powerful and hence potentially dangerous (if done incorrectly) for security coding: your library serves as an interface for other code to access certain resources that aren't otherwise available, just as the .NET classes enforce permissions for the resources they use. どこでリソースを公開しようと、コードはまずそのリソースに適したアクセス許可を要求し (つまりセキュリティ チェックを実行しなければなりません)、それから通常は実際の操作を実行するための権利をアサートする必要があります。Wherever you expose a resource, your code must first demand the permission appropriate to the resource (that is, it must perform a security check) and then typically assert its rights to perform the actual operation.

タイトルTitle 説明Description
状態データの保護Securing State Data プライベート メンバーを保護する方法について説明します。Describes how to protect private members.
セキュリティとユーザー入力Security and User Input ユーザー入力を受け取るアプリケーションのセキュリティ問題について説明します。Describes security concerns for applications that accept user input.
セキュリティと競合状態Security and Race Conditions コードで競合状態を回避する方法について説明します。Describes how to avoid race conditions in your code.
セキュリティと実行時のコード生成Security and On-the-Fly Code Generation 動的なコードを生成するアプリケーションのセキュリティ問題について説明します。Describes security concerns for applications that generate dynamic code.
ロール ベースのセキュリティRole-Based Security .NET の役割ベースのセキュリティの詳細について説明し、コードで使用する方法について説明します。Describes .NET role-based security in detail and provides instructions for using it in your code.