9

Java ベンダーとコミュニティは、「Java は他の言語よりも安全である」と述べています。しかし、私は方法を知りたいですか?

Java と .Net でのプログラミングを見ると、似ているように見えます。

.net プログラミング に必要な手順 クリックして詳細を確認

  1. .net プログラムを作成します。
  2. コードを MSIL にコンパイルする(コンパイルにより、ソース コードが Microsoft Intermediate Language (MSIL) に変換され、必要なメタデータが生成されます)。
  3. MSIL をネイティブ コードにコンパイルする(実行時に、ジャスト イン タイム (JIT) コンパイラが MSIL をネイティブ コードに変換します。このコンパイル中に、コードは、MSIL とメタデータを調べて、コードが変換できるかどうかを確認する検証プロセスに合格する必要があります。型安全であると判断されます)。
  4. コードの実行 (共通言語ランタイムは、実行を可能にするインフラストラクチャと、実行中に使用できるサービスを提供します)。

Java プログラミング に必要な手順 クリックして詳細を確認

  1. Java プログラムを作成する
  2. Java プログラムのコンパイル(Java コンパイラは Java ソース コードをバイト コードである .class ファイルに変換します)
  3. JVM によるメモリへのプログラムのロード(JVM は .class ファイルをメモリにロードし、バイト コードの検証を行い、.clsss ファイルを機械語で変換します)
  4. Java プログラムの実行 (Java プログラムに記述したアクションが何であれ、JVM はバイトコードを解釈してそれらを実行します。古い JVM について話すと、それらは遅く、一度に 1 つのバイトコードを実行および解釈していました。最新の JVM は、JIT コンパイル ユニットを使用します。ジャストインタイム コンパイルを呼び出すこともできます)。

両方の言語の手順を見ると、ほとんど同じです。「Java は他の言語と比べてなぜ安全​​なのですか?」

4

3 に答える 3

11

Javaが安全な言語である理由はたくさんあり、一部の言語よりも間違いなく安全ですが、他のすべての言語よりも安全であると言っても過言ではないと思います。

Javaには、さまざまな安全機能があります。

  1. プログラムがタイプエラーを起こさないようにするための、参照の自動ヌルチェック、配列の境界チェック、キャストの検証など。これをCまたはC++と比較してください。これらの同じエラー(いくつかの例外を除く)により、未定義の動作が発生します。

  2. 実行前のバイトコードの検証。これにより、プログラムが未定義の命令にジャンプしたり、存在しないオブジェクトに対して操作を実行したり、命令レベルで型エラーを発生させたりすることができなくなります。これを、プログラムが可能なCまたはアセンブリと比較してください。悪い命令にジャンプするか、存在しないパラメーターを関数に読み取ってみてください(think va_args)など)。

  3. 新しいコードをロードするときのランタイムセキュリティチェック。Javaランタイムを使用すると、システムリソースへのアクセスを仲介し、実行時にプログラムが任意のコードをロードまたは生成するのを防ぐことで、コンピュータ上で任意のコードが実行されるのを簡単に防ぐことができますSecurityManagerClassLoaderこれを、任意の値の読み取りと書き込み、任意のシステムコールの発行、任意のコードの生成と実行などが可能なCまたはC++と比較してください。

  4. 特定の機能のライブラリレベルの安全性。たとえば、Stringは不変でfinal、であるため、を受け取る関数Stringは文字列を検証でき、別のスレッドがその値を変更することを心配する必要はありません。

これは、Javaの安全機能の完全なリストではありませんが、他の言語には存在しないJavaの設計上の考慮事項の一部を理解できるはずです。

お役に立てれば!

于 2013-01-14T04:15:38.537 に答える
3

あなたはどこかで読んだと言っていますが、それが書かれたとき、作者はJAVAをC ++ / Fortran / Cなどと比較していると思うので、もう一度読んでください。

また、セキュリティのテスト可能性について読むことができる古い投稿がhttp://www.veracode.com/blog/2010/06/which-tastes-better-for-security-java-or-net/にあります。

どちらもほぼ同じであることがわかります。

于 2013-01-08T07:13:48.393 に答える
2

Java や .Net プログラムは、C などと比較して、いくつかの単純な種類のセキュリティ脆弱性 (バッファ オーバーフローやフォーマット文字列エラー) の影響を受けません。

これにより、リモートでコードが実行される可能性があるいくつかの方法が排除されますが、Java は、たとえば、Web アプリケーションの脆弱性を防ぐために何もしません。論理エラーにも役立ちません。

于 2013-01-09T01:31:56.993 に答える