6

Javaの安全なコーディングが重要である理由を理解するのに苦労しています。たとえば、変数をプライベートとして宣言することが重要なのはなぜですか?つまり、クラスの外部からこれらの変数にアクセスできなくなるということですが、クラスを逆コンパイルして値を取得するだけで済みます。同様に、クラスをfinalとして定義すると、このクラスをサブクラス化できなくなります。クラスのサブクラス化がセキュリティにとって危険なのはいつですか?必要に応じて、元のクラスを逆コンパイルし、必要な悪意のあるコードで再実装することもできます。アプリケーションがユーザーによって「信頼」されている場合に問題が発生しますか?そして、人々はこの信頼をどうにかして悪用する可能性がありますか?基本的に私が探しているのは、安全なコーディングガイドラインに従う必要がある理由についての良い例です。

4

7 に答える 7

15

プログラミングは難しいです。

公開されるはずのない変数を公開しない厳密なAPIを定義すると(このカプセル化と呼びます)、APIのユーザーを支援し、プログラミングを容易にします。これは良いことだと考えられています。

その理由は、主に「セキュリティ」ではなく、秘密を秘密にすること、明快さ、単純さ、理解しやすさなどです。

もちろん、APIのユーザーが背後で「自分の」変数を変更していないことを知っていれば、ボーナスとして、物事を正しく機能させるのがはるかに簡単になります。

于 2009-05-12T07:50:11.557 に答える
4

これは「安全」であり、クラスの内部作業はそれを使用するすべての人に隠されていることを意味します。

「サーバーの保護」のように「セキュア」という用語は使用されません。あるクラスのユーザーが、クラスが希望するタスクをどのように実行するかを心配する必要がないという事実を意図するために使用されます。

あなたの例を取る:

クラスの変数を公開すると、クラスのユーザーにその存在を知らせることができます。これは、たとえば、ボタンを押してライトをオンにするだけで、その中にある必要はありません。銅またはそれがタスクを実行するために必要なものです。

于 2009-05-12T07:51:53.833 に答える
4

Javaはオブジェクト指向プログラミング言語であり、オブジェクト指向プログラミングの重要な概念の1つはカプセル化です。

カプセル化の背後にある考え方は、オブジェクトの状態を保持する内部変数やアルゴリズムなどの内部動作などの実装の詳細を「隠し」、他のオブジェクトがオブジェクトで機能を実行するために使用できるインターフェイスのみを提供することです。 。

その概念を使用して、private変数を使用して内部状態を非表示にし、他のオブジェクトが内部状態に直接影響を与えないようにします。Javaでは、オブジェクトを操作するためにゲッターとセッター(例getColorと)が表示されるのが一般的です。setColor

また、カプセル化により、コードの堅牢性も向上します。

たとえば、内部状態へのアクセスを制限することにより、オブジェクトが変更される前にいくつかの健全性チェックを実行することが可能になります。

確かな例として、との間に値Scoreを持つオブジェクトがあったとします。指定された値が許容範囲内にあることを検証するメソッドを提供することにより、オブジェクトが許容できない状態に設定されるのを防ぎます。percent0100setPercent(int)Score

したがって、メソッドがエラーを引き起こしたり、指定された値が受け入れられない場合にをスローしたりする場合、のようなステートメントを記述して内部状態を直接操作しようとするscore.percent = 150ことを防ぐことができます。setPercentException

于 2009-05-12T08:07:53.307 に答える
3

ここには2つの問題があります。

最初に、変数を保護またはプライベートとして宣言する場合、それらはパブリックAPIの一部にはなりません。他のクラスは将来クラスに依存する可能性があります。新しい機能を含めたり、パフォーマンスを向上させたりする場合は、可能な限り自由に変更できることが重要です。すべての値が内部のすべてよりも公開されている場合値とメカニズムは公開されています。それらを変更すると、あなたに依存する他のクラスが壊れる可能性があります。

2つ目は、変数を公開するときに、他のクラスが値を変更できるようにすることです。それらがプログラムを壊す可能性がある場合に内部値を変更し、奇妙な予期しない動作を引き起こす場合。クラスの1つの正確なパフォーマンスに依存するシステムを作成し、内部値が変更された場合、そのシステムに依存できなくなります。サブクラス化により、これはより複雑になります。システムは、期待されるアクションを実行するために特定のタイプのクラスに依存している場合があります。サブクラス化することにより、同じタイプのように見えるが、期待されるアクションを実行しない新しいクラスを作成することができます。

たとえば、保護された関数getArea()を持つクラスの正方形がある場合、正方形の面積を返すことを期待します。ただし、正方形を拡張する新しいクラスを作成できます。たとえば、クラスの長方形は正方形を拡張します。これで、rectangeはgetArea()をオーバーライドできますが、それでもsquare型であるため、squareの機能に依存する何かが壊れる可能性があります。クラスをファイナルにすることで、これがシステムで発生することは決してないと断言できます。

このタイプの「安全なコーディング」は、誰かがあなたのソースコードを見るのを妨げることはありませんが、将来的にあなたのコードをより信頼でき、使いやすくするのに役立ちます。

于 2009-05-12T08:07:24.477 に答える
1

他の人がすでに言ったことに加えて、これらの機能のいくつかは、単に意図を述べる方法と見なすこともできます。メンバーprivateを作成すると、他の人がアクセスできないようになります(可能ですが、それはここでのポイント以外です)が、さらに重要なことに、これは実装の詳細であり、信頼してはならないことをユーザーに伝えます。

于 2009-05-12T07:55:19.753 に答える
1

オブジェクトに非公開 (非表示) ではない内部プロパティがあり、このプロパティにアクセスするコードがたまたまマルチスレッド環境で実行されている場合を想像してみてください。そのため、N 個のスレッドが同時にアクセスを開始し、5 つのスレッドがこのプロパティを変更し、4 つのスレッドがこのプロパティを変更したいとします。読んだ。物事がきちんと実行されることを確認する方法はありません。どちらのスレッドも、現在保持しているデータを認識せず、そのオブジェクトのプロパティを正常に変更しました。

同期アクセスを処理する特別なコードをプログラムする必要がありますが、直接アクセスしないようにそのプロパティにアクセスするプログラムの残りの 680 クラスをチェックする必要があるため、コードが正しく機能することを保証するものではありません。 .

要するに、あなたは大きな問題に直面しており、データがいつ変更されたのか、どのスレッドがそれを行ったのか、どこから発生したのかなどがわからないため、デバッグは悪夢です.

カプセル化しない場合に何が起こるかの 1 つのシナリオ...

良いことです。コードの実行速度が 1% 向上し、スタックの負荷が少なくなり、システムの定期的なクラッシュとデバッグが成功するわずかな可能性で支払うことになるパフォーマンスの向上はおそらく無視できます。

于 2009-05-12T10:03:01.997 に答える
1

「安全なコーディング」という用語は、C、Java、Ruby、アセンブリ言語など、セキュリティの脆弱性を明らかに回避しようとするソフトウェアの構築を指します。おそらく、安全な言語システムを選択した後の最も重要な部分は、優れたプログラミング プラクティスを維持することです。プログラムが不明確な場合、信頼に値する可能性はほとんどありません。

Java については、注目すべきガイドが 2 つあります。

Java には、安全なコーディングの 2 つの異なるモードがあります。

1 つは、コードが持つすべての特権を持っていない可能性のあるコードを扱っている場合です。たとえば、ライブラリを作成したり、コードに署名したりする場合は、これを行う必要があります。悪意のあるコードが意図しない方法でアクセス許可を利用することは不可能であるべきです。これは難しい!

より一般的には、信頼できないデータのみを扱うプログラムを扱っています。たとえば、Web サーバー (XSS と SQL インジェクションを考えてください) や、信頼されていないファイルを扱うデスクトップ アプリケーション プログラム (通常、問題はバッファ オーバーフローを持つ C コードにあります - 本物の C++ の方が優れています)。状況によっては、サービス拒否 (DoS) が深刻な問題になる可能性があります。

一部重複があります。たとえば、インタープリターはインタープリター コードのアクセス許可で実行され、非常に「強力」な場合があります。

于 2009-05-12T10:07:22.003 に答える