JScript のセキュリティに関する考慮事項

どの言語においても、安全なコードを記述することは重要な課題です。 JScript では、最も効果的な手順の使用を開発者に強制しないため、開発者が気付かないうちに安全でない方法で言語を使用する可能性のある領域がいくつかあります。 JScript は、セキュリティの確保も 1 つの目標として設計されていますが、最大の目標は、便利なアプリケーションを迅速に開発できるようにすることです。 場合によっては、この 2 つの目標が相反することがあります。

セキュリティに影響を与える可能性のある、いくつかの主な問題を以下に示します。これらの問題を認識しておくことによって、セキュリティ上の危険を回避できます。 eval メソッドを除くこれらの問題は、.NET Framework により新機能が導入されたために考慮することが必要になりました。

eval メソッド

JScript で最も誤用されやすい機能は eval メソッドです。このメソッドにより、JScript のソース コードを動的に実行できます。 eval メソッドを使用する JScript アプリケーションは、プログラムから渡されるどのようなコードでも実行できるため、eval メソッドのすべての呼び出しにセキュリティ上の危険性があります。 どのようなコードでも実行する柔軟性がアプリケーションで必要とされない限り、アプリケーションが eval メソッドに渡すコードを明示的に記述することを検討してください。

セキュリティ属性

.NET Framework のセキュリティ属性を使用して、JScript の既定のセキュリティ設定を明示的にオーバーライドできます。 ただし、この操作を確実に理解していない限り、既定のセキュリティ設定は変更しないでください。 特に、AllowPartiallyTrustedCallers 属性 (APTCA) カスタム属性の使用は避けてください。これは、通常、信頼できない呼び出し元は JScript コードを安全に呼び出すことができないためです。 APTCA を使用して信頼できるアセンブリを作成し、そのアセンブリがアプリケーションによって読み込まれた場合は、部分的に信頼されている呼び出し元から、アプリケーションの完全に信頼できるアセンブリにアクセスできてしまいます。 詳細については、「安全なコーディングのガイドライン」を参照してください。

部分的に信頼されるコードとホストされる JScript コード

JScript をホストするエンジンでは、呼び出されたすべてのコードによって、グローバル変数、ローカル変数、オブジェクトのプロトタイプ チェーンなど、エンジンの一部を変更できます。 また、関数は、渡される expando オブジェクトの expando プロパティまたはメソッドを変更できます。 このため、JScript アプリケーションが、部分的に信頼されたコードを呼び出す場合や、他のコードで記述されたアプリケーション (Visual Studio for Applications [VSA] ホストからなど) で実行される場合は、アプリケーションの動作が変更される可能性があります。

上記の問題点を考慮すると、アプリケーション内または AppDomain クラスのインスタンス内の JScript コードは、アプリケーション内の他のコードと同等以下の信頼レベルで実行する必要があります。 他のコードよりも高い信頼レベルで実行される場合は、他のコードが JScript クラスのエンジンを操作し、それによってエンジンがデータを変更し、アプリケーション内の他のコードに影響を与える可能性があります。 詳細については、「_AppDomain」を参照してください。

アセンブリ アクセス

JScript は、厳密な名前とテキストの簡易名の両方を使用してアセンブリを参照できます。 厳密な名前参照には、アセンブリのバージョン情報と、アセンブリの整合性および ID を確認する暗号署名が含まれています。 アセンブリを参照する場合は簡易名を使用する方が簡単ですが、厳密な名前を使用すると、機能の異なる他のアセンブリが同じ簡易名を持つ場合にコードが保護されます。 詳細については、「方法 : 厳密な名前のアセンブリを参照する」を参照してください。

スレッド処理

JScript ランタイムは、スレッド セーフに対応するように設計されていません。 このため、マルチスレッド JScript コードは、予期しない動作をする場合があります。 JScript でアセンブリを開発する場合は、マルチスレッド コンテキストでそのアセンブリが使用される可能性があることに注意してください。 Mutex クラスなどの System.Threading 名前空間にあるクラスを使用して、アセンブリ内の JScript コードが適切な同期をとって実行されるようにする必要があります。

適切な同期コードを記述することはどの言語でも難しいため、必要な同期コードの実装方法をよく理解していない限り、JScript で汎用アセンブリを記述しないでください。 詳細については、「System.Threading」を参照してください。

注意

ASP.NET は生成するすべてのスレッドの同期を管理するため、JScript で作成された ASP.NET アプリケーションの同期コードを記述する必要はありません。 ただし、JScript で作成された Web コントロールはアセンブリのように動作するため、これらのコントロールには同期コードが含まれている必要があります。

ランタイム エラー

柔軟に型指定された言語である JScript では、Visual Basic や Visual C# などの他のいくつかの言語よりも潜在的な型の不一致が許容されます。 型の不一致によってアプリケーションでランタイム エラーが発生する場合があるため、コードの開発時には、発生する可能性のある型の不一致を検出することが重要です。 コマンド ライン コンパイラで /warnaserror フラグを使用するか、ASP.NET ページの @ Page ディレクティブの warninglevel 属性を使用することができます。 詳細については、「/warnaserror」および「@ Page」を参照してください。

互換モード

互換モードで /fast- オプションを使用してコンパイルされたアセンブリは、既定の高速モードでコンパイルされたアセンブリよりも暗号化の度合いが低くなります。 /fast- オプションを使用すると、既定では使用できない言語機能が有効になります。JScript Version 5.6 以前のバージョン用に記述されたスクリプトとの互換性を実現するためには、これらの機能が必要になります。 たとえば、互換モードでは、String オブジェクトなどの組み込みオブジェクトに expando プロパティを動的に追加できます。

互換モードは、JScript のレガシ コードからスタンドアロン実行可能ファイルを作成する場合に役立ちます。 新しい実行可能ファイルまたはライブラリを開発する場合は、既定のモードを使用してください。 既定のモードでは、安全なアプリケーションを作成できるだけでなく、パフォーマンスや他のアセンブリとの互換性も向上します。 詳細については、「/fast」を参照してください。

参照

概念

前のバージョンの JScript で作成されたアプリケーションのアップグレード

その他の技術情報

ネイティブ コードと .NET Framework コードのセキュリティ