メソッドレベルのセキュリティが必要な理由


14

現実の世界では、なぜメソッドレベルのセキュリティを実装する必要があるのですか?

ユーザーがユーザーインターフェイスにアクセスする(したがって、メソッドに直接アクセスできない)Webアプリケーションまたはデスクトップアプリケーションがあります。

それでは、アクセスメソッドは、ここで直接どこに現れますか?

編集:私は春のセキュリティで実験しているので、この質問をし、メソッドにアクセスするためのユーザーの承認を見ています。

何かのようなもの :

 @ROLE_ADMIN
public void update() {
      //update
}

1.セキュリティの問題を考えずにコードを再利用する2. Webサービスと簡単に統合する3.上位層のセキュリティメカニズムを信頼しない場合にセキュリティを確保する
Erkan Erol

回答:


23

適切に設計されたアプリケーションでは、バックエンドとフロントエンドは切断されます。バックエンドセキュリティシステムは、特定のフロントエンドがセキュリティを正しく処理することを想定できないため、それ自体を処理する必要があります。


あなたは質問に答えませんでした:なぜメソッドレベルなのですか?
コーディズム

@Codism-彼は答えました。B / c何も想定できません。誰かがどのようにそこにたどり着いたかに関係なく、メソッドレベルb / cで承認チェックを行います。適切な権限があることを確認する必要があります。
ジョセフラスト

@JosephLust:回答とコメントは、あらゆるレベルのあらゆるセキュリティシステムに適用できます。元々の質問は、特にメソッドレベルでの理由を尋ねていました。
コーディズム

1
これは利用可能な最低レベルであり、AOPまたはAspectJを使用して簡単に適用できるためです。これが他のすべてのセキュリティ実装に当てはまるとは思わない。
ジョセフラスト

5

コントローラーのアクションへのロールベースのアクセスについて話していると思います。つまり、MVCアーキテクチャでは、Controllerクラスの各メソッドは個別のアクションです。私が使用したほとんどのMVCフレームワークでは、メソッドレベルとクラスレベルの両方で特権を割り当てることができます。つまり、クラスレベルで属性/注釈を適用でき、そのコントローラーのすべてのアクションに対応するロールが必要になります。

ロールベースのアクセスのよりきめ細かい制御に関しては、次のことを考慮してください。

  • リソース周辺のすべてのアクションをグループ化すると便利です。つまり、記事、アカウントなどの作成/読み取り/更新/削除(CRUD)アクション。これにより、RESTスタイルAPIの作成と保守が容易になります。
  • 多くのシステムには、読み取りアクションの場合とは異なる、作成/更新/削除アクションに必要な資格情報/役割があります。
  • すべてのユーザーアカウントアクションが1つのコントローラーにある場合、誰でもログインできるようにしますが、特定のユーザーのみが新しいアカウントを作成したり、役割を割り当てたりできます。

好むと好まざるとにかかわらず、Ruby on Railsが数年前に電波を放ったとき、ほぼすべてのMVCフレームワークが基本的な設計アプローチをコピーしました。以前は、アクションは個別のクラスでしたが、アクションロジックは小さく、焦点が絞られる傾向があるため、クラスのオーバーヘッド全体が過剰になります。コントローラのメソッドをページのアクションにマッピングすることは、実際には非常に理にかなっています。多くの人がどの役割がどの機能を実行できるかをきめ細かく制御する必要があることを知ってください。


3

メソッドレベルのセキュリティは、主に次の2つの理由で役立ちます。

  • セキュリティの別のレイヤーとして(他のレイヤーに加えて)

  • メソッドレベルでアクセス許可を持つ方が便利または論理的である場合は、異なるユーザーが同じ「直接」アクションを実行できる場合を考慮してください(クライアントセキュリティは関係ありません)。しかし、場合によっては、それらのアクションが制限したい動作をトリガーする可能性があります-この場合、メソッドレベルのセキュリティが関連するソリューションになる場合があります。


0

Mike Wiesnerは、SpringSourceのプレゼンテーションであるSpring Security 3 / 3.1で、Tomcatや他の多くのサーブレットコンテナに、ユニコードでエンコードされたときに「../」を正しく認識できないバグがあることを思い出させました。単純な等価テストはJavaで失敗しますが、ファイルシステムの上位ディレクトリに変換されます。

セキュリティは難しく、複数のレベルのセキュリティがあり、回避の試みをブロックする可能性が向上します。メソッドレベルのセキュリティはクラス内で直接コード化されているため、AOP拡張後、メソッドを呼び出すときは、常にセキュリティチェックを前に呼び出します。


-2

ここで、パブリック、プライベート、および保護されたメソッドについて話していると思いますか?

もしそうなら、それらはセキュリティの目的のために存在しません。これらは、ソフトウェアを適切にモジュール化することを容易にするために存在します。(彼らがそれで成功するかどうかは、私が他の人に任せる議論です。しかし、それは彼らの目的のビジョンです。)

ライブラリを配信すると、後で別のバージョンのライブラリを配信し、プライベートとしてマークされたものを必要なだけ変更することができます。対照的に、もし私がそれらのものをプライベートとマークしていなかったら、誰かがどこかに直接アクセスしている可能性があるので、ソフトウェアの内部を変更することはできません。確かに、理論的には、文書化されたAPIを使用しないのは彼らのせいです。しかし、クライアントは、私のソフトウェアのアップグレードがソフトウェアを壊したという私のせいだと感じます。彼らは言い訳を望んでおらず、それを直したいのです。しかし、最初にアクセスを許可しない場合、私のAPIはAPIとして意図されたパブリックメソッドであり、問​​題は回避されます。

あなたが話している可能性のある2番目にありそうなことは、Javaのセキュリティモデルです。あなたがそれについて話しているなら、それが存在する理由は、Javaの元々のビジョンは、サードパーティのプログラム(ブラウザなど)の内部で対話的に動作するために、おそらく信頼できないアプレットを送信する人々に関係していたからです したがって、セキュリティモデルは、悪意のあるアプレットからユーザーを保護することを目的としていました。したがって、心配して保護するセキュリティ上の脅威は、ロードされる可能性のある他のソフトウェアと対話しようとする信頼できないアプレットです。


2
あなたは彼がパブリック、プライベートの話をして保護されますが、ユーザーはAOPと役割を持っているかどうかをチェックについてではありません、それを取得できませんでした
stivlo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.