なぜjavaセキュアコーディングの重要になるのでしょうか。
-
21-08-2019 - |
質問
うまく理解はなぜjavaセキュアコーディングが重要になります。例えば、なぜことが重要な変数を宣言する個?だって取得しまうことができなくなると考えらアクセスする変数を外部からのクラスも簡単ンジニアリング、逆アセンブル、クラスの値です。同様に、定義されるクラスとして最終すことができなくなると考えるサブクラスはこのクラスです。するおそれがある場合は、サブクラスのクラスは危険ではなセキュリティ?必要な場合は再度、逆コンパイル元のクラスのメソッドを再実装しでも悪意のあるコードします。な問題になるの応用"信頼"により、ユーザー人々がその虐待にこの信頼か?基本的には私が求めていたものの良い例にな理由としては、セキュアコーディングガイドラインすることを可能とします。
解決
プログラミングます。
設定されていない場合は厳しいApiでは、そんな変なっているものです(おこ 封止)は、ユーザのApiは、こうしたニーズに応えるためにグします。であると考えているかもしれない。
その理由は、主に"セキュリティ"として守秘密のものが、どの明確性、簡単般.
ボーナスパーツとしていることでも正常に動作しきを知ることができるので、ユーザにAPIを変えない"、"変数の背後にあります。
他のヒント
これは、クラスの内部作業は、それを使用しています誰に隠されていることを意味する「セキュア」されます。
「サーバーの確保」のように使用されていない安全な用語は、一つのクラスのユーザーがクラスが、彼はそれが望んでいるタスクを実行する方法について心配する必要はないという事実を意図するために使用されます。
あなたの例を取るます:
たとえば、あなたがしたくない何かが、ある彼らのexistanceのクラスのノウハウ、のユーザーを聞かせクラスの変数を公開:あなただけのライトをオンにするボタンを押すと、あなたが今する必要はありませんその内部に銅やwhaterそれがタスクを実行する必要があります。
Javaはオブジェクト指向プログラミングにするのlangauge、および重要な概念の一つオブジェクト指向プログラミングではカプセルである。
カプセル化の背後にある考え方は、オブジェクトの状態を保持する内部変数と、そのようなアルゴリズムのような内部の仕組みとして実装の詳細を「隠れる」、および他の唯一の目的は、機能を実行するために使用できるインターフェイスを提供することですオブジェクトでます。
という概念を使用して、一つは直接内部状態に影響を与えることから、他のオブジェクトを防ぐためにprivate
変数を使用して内部状態を非表示にしたいと思います。 Javaでは、オブジェクトを操作するためにゲッターとセッター(例えばgetColor
とsetColor
)を参照するのが一般的である。
また、カプセル化は同様に、コードの堅牢性を高めることができます。
は、例えば、内部状態へのアクセスを制限することにより、オブジェクトが変更される前に、いくつかの健全性チェックを行うことが可能であろう。
固体例として、Score
とpercent
間0
値を有することであった100
オブジェクトがあったと言います。指定された値が許容範囲内であったことを検証setPercent(int)
方法を提供することによって、それは受け入れられない状態に設定されることScore
オブジェクトを妨げる。
だから、直接指定した値が受け入れられない場合score.percent = 150
メソッドはsetPercent
をエラーが発生したりスローした場合、防ぐことができException
のような文を書き込むことによって内部状態を操作しようとしています。
ここでは2つの問題があります。
保護やプライベートなどの変数を宣言するときに最初は、彼らがあなたの公開APIの一部にはなりません。自分の価値観のすべてがあなたの内部の全てより公開されている場合など、他のクラスには、将来的にはあなたのクラスに依存してもよいし、あなたが新しい機能を含める場合は、できるだけ多くを変更することが自由であることが重要である、パフォーマンスを向上させます値とメカニズムは、公開されています。それらを変更すると、あなたに依存する他のクラスを壊すことがあります。
二つ目は、変数を露光するとき、それは他のクラスは、あなたの値を変更することを可能にするということです。彼らはあなたのプログラムを壊す可能性がある場合、あなたの内部の値を変更し、そして奇妙な予期しない動作を作成する場合。あなたは1つのあなたのクラス、および内部値の正確なパフォーマンスに依存しているシステムを作成する場合は、もはやそのシステムに頼ることはできませんよりも、変更されています。サブクラス化は、これはより複雑になります。お使いのシステムでは、期待されるアクションを実行するために、特定の種類のクラスに依存する場合があります。それをサブクラス化することで、同じタイプのように見えるが、期待のアクションを実行しない新しいクラスを作成することが可能です。
あなたが保護された機能のgetArea()を持つクラスの正方形を持っている場合は、たとえば、あなたは、正方形の面積を返すことを期待しています。しかし、新しいクラスは、正方形の延在することができ、クラスの長方形が正方形拡張言います。今rectangeはのgetArea()をオーバーライドすることができますが、それは、正方形のその機能に依存して何かを壊すかもしれタイプの広場のままです。あなたのクラスの決勝を作ることによって、あなたはこれがあなたのシステムで発生したことがないことを主張している。
この種類のソースコードを見てから誰かを防ぐことはできません「セキュアコーディング」が、それは将来的にあなたのコードは、より信頼性が高く、使いやすくするのに役立ちます。
ただ、他の人がすでに言ったことに追加します。私はメンバーprivate
を作る場合、私は(それが可能であるが、それはここでのポイントに加えてです)、それをアクセスするために他の人のために、それは「不可能」を作るが、より重要なのは、私は、彼らがに頼るべきではないということ、これは実装の詳細であることをユーザーに伝えます。
ただ想像、読むために4。あなたは必ず物事がきちんと実行させる方法はありません、どちらのスレッドは、それが一瞬に保持し、それが成功し、そのオブジェクトのプロパティを変更しなかったデータを知ることができます。
あなたは同期アクセスを処理する責任を負うことになるコードの特別な作品をプログラムする必要はないでしょう、あなたはまだそのプロパティをしないようにアクセスして、あなたのプログラムの中で680クラスの残りの部分をチェックする必要があるため、まだそれが何のコードが正しく動作しますguarranteeになります直接アクセスます。
要するに、あなたは大きな問題であり、およびデバッグは、スレッドがしたデータがchagnedれたときに知らないあなた以来の悪夢であり、そのことが起こったなどどこから
あなたがカプセル化されていない場合は何が起こっているかのちょうど1つのシナリオ...
良いことは、あなたのコードは、あなたがシステムの定期的なクラッシュや成功しデバッグのためのマイナーなチャンスをお支払いいただきますおそらく無視できる性能向上を達成したスタックにはあまり負荷があり、1%速く動作します。
「セキュア コーディング」という用語は、C、Java、Ruby、アセンブリ言語など、セキュリティ上の脆弱性を明確に回避しようとするソフトウェアの構築を指します。おそらく、安全な言語システムを選択した後の最も中心的な部分は、適切なプログラミング慣行を守ることです。プログラムが不明確であれば、それが信頼に値する可能性はほとんどありません。
Java については、次の 2 つの注目すべきガイドがあります。
- Java プログラミング言語バージョン 2.0 のセキュア コーディング ガイドライン。 2 年前に更新されており、更新が必要です。
- CERT Sun Microsystems Securecoding Standard for Java。 CERT と Sun の両方でサポートされている新しい Wiki で、重要だと思われる内容はすべて更新できます。これは、Sun のガイドラインよりもはるかに広い視野を持っています。たとえば、Sun のガイドラインではすべての配列境界がチェックされるため、整数オーバーフローについてはあまり考慮されていませんが、Wiki ではプログラム エラーが発生する可能性があるため考慮されています。
Java には、セキュア コーディングの 2 つの異なるモードがあります。
1 つは、コードが持つすべての権限を持っていない可能性のあるコードを扱っていることです。たとえば、ライブラリを作成している場合やコードに署名している場合は、これを行う必要があります。悪意のあるコードが意図しない方法でアクセス許可を悪用することは不可能である必要があります。これは難しいですね!
より一般的には、信頼できないデータのみを扱うプログラムを扱うことになります。たとえば、Web サーバー (XSS や SQL インジェクションを考えてください) や、信頼できないファイルを扱うデスクトップ アプリケーション プログラム (通常、問題はバッファ オーバーフローが発生する C コードにあります。本物の C++ の方が優れています)。状況によっては、サービス拒否 (DoS) が重大な問題になる可能性があります。
一部重複する部分があります。たとえば、インタープリターはインタープリター コードの権限で実行され、非常に「強力」である可能性があります。