2009-08-15 10 views
1

ASP.NET MVCアプリケーションに保護されたメンバーエリアがあるとします。生成された一部のURLには機密データが含まれています。たとえば、Accounts/123,123はアカウント番号などの機密データです。後でユーザーのマシンが侵害された場合、攻撃者はアカウント/ 123にアクセスできませんでしたが、これは保護されるためですが、ブラウザの履歴を見るだけでユーザーのアカウント番号を取得しています。私がこれを避けるために見ることができる唯一の方法は、保護された領域であってもURL内の機密データを使用しないことです。ASP.NET MVCで保護されたメンバーエリア(URLに機密データあり)

私は、機密データがインデックス、詳細、編集に使用されるIDであるシーンを考えていました。解決策は、機密データを表す別のフィールドをテーブルに追加することです。 URLで使用されます。

別の方法がありますか?

答えて

7

私は、URLに機密データを使用せず、複数のアカウント番号を仮定すると、現在のセッションのみを保持するように、ユーザーセッションに保存されたアカウント番号を保持します。あなたの編集を見た後


EDIT:

あなたが本当にクライアントを考慮にこのシナリオを取るページのURLを介して任意のアイデアを持つことなく、このへの安全なアプローチをしたい場合。

  • ユーザーは
  • アカウントページに記載されている複数のアカウントを持っている
  • 「ID」は、現在のセッションIDを使用して暗号化されたアカウント
  • リンクをユーザーがクリックすると、リンクに彼を取ります/アカウント/ 10912ljlkj2308s

あなたのアカウントIDは表示されなくなり、暗号化キーはそのセッションとそのIDにのみ適しています。許可されたセッションIDは必ずしも一意であるとは限りませんが、これは履歴/キャッシュ内の「ビューア」にとって大きな妨げになります。

+0

私はどのようにしてIDを復号化、暗号化します – Danny

+0

それは少し明確にするために私の質問を更新しましたか? – Danny

+0

暗号化は本当にうまくいくでしょう –

0

機密データを要求するのにHTTP GETを使用しないでください。代わりにHTTP POSTを使用してください。あなたのActionResultに[AcceptVerbs(HttpVerbs.Post)]を入れてください。

同様の注意点として、AJAXリクエストで使用するデータを取得するためにHTTP GETを使用しないでください。subtle JSON vulnerabilityがあります。

+0

私の質問が少しはっきりするように更新しました – Danny

0

私は同様の問題を抱えていましたが、まだ最高のソリューションを考えていましたが、Tomのソリューションを実装しました。側面の問題は、URLがmvcにとって「フレンドリー」でなければならないということです。 /が許可されているため、HtmlEncodeは機能しません。 Base64では、以下のヘルパーメソッドと連携して動作します。

public static string Base64ToUrlFriendlyBase64(string value) 
{ 
    return value.Replace("/", "_").Replace("+", "-"); 
} 

public static string UrlFriendlyBase64ToBase64(string value) 
{ 
    return value.Replace("_", "/").Replace("-", "+"); 
} 
関連する問題