安全なコーディングガイドライン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.

  • 部分的に信頼された呼び出し元を許可する属性 (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 要素、またはアンマネージ コードを呼び出す 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場合は、コード アクセス セキュリティ スタック ウォークの結果として a が表示されます。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.