2012-04-05 11 views
6

これは、Webフォームオーバーデータソートの初心者のパターンの質問です。私はExposing database IDs - security risk?を読んで、これは時間の無駄だと思っていますが、待ちます...データベースIDをUIに公開する

私はビジネスロジックライブラリを参照しているMVCプロジェクトと、それを参照するNHibernate SQLリポジトリのアセンブリを持っています。何かが私の手を動かしてコントローラのコードベースからそれらのリポジトリを直接参照すると、何がうまくいかなかったのか分かります。しかし、これらのコントローラがデータベースレコードIDを持つURLパラメータで話す場合、だけがと思われますか?

(MVCアクションによって)消耗していないIDは考えられません。私はしません私は今までデータベースの同じ行に対応する2つのUIエンティティを必要と思います。コントローラーがIDを解釈するつもりはありません。サロゲート・キーを使用すると、差異はゼロになります。しかし、私はこの問題を抱えています。なぜなら、合理的な設計についての前提は、層スキップ依存関係よりも優れていないからです。

ビジネス・ロジック・アセンブリのみを参照し、そのセッションの意味しか持たないBLオブジェクトおよびGUIDのみで、アセンブリがデータベースIDを使用してトランザクションを持続する間、Webアプリケーションをどのように作成しますか?

答えて

3

必要に応じてIDをハッシュすることができます。セッションIDを塩として使用する。それは文脈によって異なります。あなたがカタログページを簡単にコピー可能にしたい公共のショッピングサイト。ユーザーアカウント管理者はIDを暗号化しても問題ありません。そのため、ユーザーは他のユーザーのアカウントをハッキングすることはできません。

私はこのことをあいまいさではないと考えています。悪意のあるユーザーが1つの侵害されたアカウントを持っている場合、そのユーザーとしてログインしている間に設定されたすべてのフォームフィールド、URL ID、およびCookie値を見ることができます。その後、別のユーザーとしてログインしてアクセス許可をエスカレートするときにそれらを使用することができます。しかし、セッションIDを塩として使用してそれらを保護することによって、そのデータをロックしているので、1つのセッションでのみ有用です。ページはブックマークできません。彼らはあなたの保護を理解できましたか?おそらく。しかし、おそらく彼らは別のサイトに移動するだろう。車のドアをロックしても、車に乗りたい人は車の中にいるわけではありませんが、誰でもやります。

+0

あなたは私に多くのことを考えさせました。どのようにマッピングを実装するのか、そしてどこにそれを格納するのかについての提案はありますか? 「セッション」は本当にASPの中で最高の場所ですか? –

+0

"マッピング"?あなたが探しているものではっきりしない。フィールド保護?私はちょうどあなたが取る暗号化機能を行う提案:FieldName、FieldValue、SessionID。それから解読するときに解読するために3つをすべて供給する必要もあります。だから、別のセッションの誰かがその価値をまったくハイジャックすることはできません。 URLパラメータのために必要なものでなければなりません。セッションレスページのサポートが必要な場合は、セッションIDの代わりにハードコードされた値を使用できます。セキュアではなく、セッションレスページでは機密情報にアクセスしないでください。 –

+0

私はあなたの答えの要点、セッションと塩分けしています。マッピングをまったく保存/管理する必要はありません。これは最高です。ありがとうございました。 –

3

私はセキュリティの専門家ではありませんが、商品ID、ユーザーIDなどの特定のIDをユーザーに公開するのに問題はありません。その製品IDを表示することは問題ではありません。

トランザクションIDのようにユーザーが直接的にやりとりしないシステムの内部にあるものは、ユーザーに表示されず、何らかの形で編集することを恐れず、情報ではないためですそれらに有用である。

フォームでは、「mysite.com/messages/view/5」というアクションポイントがあります。ここでは5が表示されます。 これらの操作のすべてでは、簡単なデータベースチェックを行い、ログインしているユーザーがメッセージの所有者と同じであることを確認することにより、ユーザーがそのユーザーにアクセスできるようにします(変更または削除する機能は必要です)。

+0

はい、データベースIDを公開しないように難読化するURLは、あいまいさによるセキュリティの単なるフォームです。あなたのセキュリティのために難読化されたURLに頼るべきではありません。アプリケーションに適した他の形式のアクセス許可管理を積極的に実装する必要があります。 –

+0

あなたはそれに頼るべきではありません。しかし、ハッカーにとっても簡単にする必要はありません。 –

+0

私は間違いなく、これらの行に沿って健全性チェックを正確に実行しました。行5のすべてを表示しています。私の問題は、主に、私のビューモデルが私のBLオブジェクトに1-1、ORMエンティティに1-1があることが、私が慣例を作りたくないことの偶然であることです。 –

0

ほとんどのシステムでIDが実装の詳細に過ぎないと言う人がいますが、ドメインエンティティを一意に識別する方法が必要であり、その識別子のIDを生成する可能性が最も高いと考えられます。 IDがであることは、データベースによってが生成されたことを意味します。一度生成されると、ドメインエンティティの属性になります。したがって、エンティティを参照する必要がある場合はいつでも、それを使用することができます。

2

パラメータを改ざんするとデータが変更される可能性がありますので、非常に注意してください。これらのIDを公開する際には、「誰が何idsにアクセスできるか」に関するルールをアプリケーションに非常に慎重に組み込む必要があります。

たとえば、OrderIdに基づいて注文を更新する場合は、次のようにloadおよび更新のwhere句に含めます。 where order.orderid = passedInOrderId and Order。CustomerId =

私はここに利用できるMVCで保存されたIDSを支援する拡張機能を開発しました:

http://mvcsecurity.codeplex.com/

また、私はこれについての私のセキュリティコースで少し話で:あなたが暗号化できるHack Proofing your ASP.NET MVC and Web Forms Applications

+0

あなたのcodeplexプロジェクトは、ここで使用する手法と非常によく似ています。しかし、マシンキーは使用しません。データベースバックアップされたセッションのキーを使用するので、すべての異なるティアボックスで動作します。私は、完全なユーザーアクセスの検証を見逃すバグは決してないと思っているすべての人に、むしろ驚いています。それは現実の世界ではありません。 –

+0

良い提案です。実際のIDで動作するBLの権限/役割チェックを行います。 –

1

これらの回答以外にも、わかりやすいIDを使用するとよい場合があります。そのため、ユーザーは必要な情報のURLをハックすることができます。たとえば、www.music.com \ artist \ acdcまたはwww.music.com \ arist \ smashing-pumpkinsなどです。ユーザーにとって意味があり、ユーザーがページからURLを通じて理解できる情報を増やすことができれば、すべての方がより優れています。特に、マーケットセグメントが若くてテクノロジーに精通している場合は、IDを活用してください。これはまたあなたのSEOを高めるでしょう。 私はそれが使用されていないときは、それをエンコードすると言うでしょう。顧客IDをセッションに対してチェックしないで、顧客ベース全体を公開するのは、開発者一人だけの間違いです。

もちろん、あなたの単体テストはそれを捕らえるべきです!

+0

これは、有益でわかりやすく、一時的で無意味であると考えるべきもう一つのことですが、私はDBから継承されたと感じています。いずれの種類のマッピングを実際に実装する方法についての提案はありますか?ユーザーフレンドリーのためのDBの列だけで、私は思うだろう –

+0

ああ、私は参照してください。スワッシュカボチャの1456789へのマッピングを意味しています。私はそれがdbの別の列でなければならないと思います。しかし、私が見ているMVCの例のほとんどは、アイデンティティintsをちょうど使用しています。問題は、1456789が自動生成保証されたユニークであることです。他の意味のあるフィールドの1つでしようとするものは、ユニークではないかもしれません。ユニークでない場合は、クエリ用に使用するのは良いことではありません。あなたがホットメール、スワッシュ・パンプキン、スマッシング・パンプキンなどのようなことをしない限り、 –

関連する問題