2011-08-04 8 views
0

私はjQueryの$.ajax()を使ってJavaScriptから呼び出すWebサービス(ASP.NET 2.0)を持っています。私はセキュリティのためにセッションキーがこのような状況でノンスとしてよく使われると言われました。 Webサービスはそのパラメータの1つとしてキーを受け取り、現在のセッションキーと一致する場合にのみデータを返します。WebサービスセキュリティのASP.NETセッションキー?

これは、すべてのPage_Load(つまり、すべてのポストバック)で非表示フィールドの値を現在のSessionIDに設定してから、javascriptでパラメータとして渡すようにしています。しかし、Webサービスの現在の鍵(Context.Session.SessionID)と同じ鍵ではありません。

これは解決することは可能ですか、これを別の方法で行う必要がありますか?

EDIT:要求されたとおりに非表示フィールドにセッションを設定するコード。 (すなわちif (!Page.IsPostBack)に包まれていない。あなたはセッション状態を使用するまで

+0

:ここ

String GetCSRFToken() { String token = (String)Session["CSRFToken"]; if(token == null) { token = GenerateLongRandomString(); Session["CSRFToken"] = token; } return token; } void AssertValidCSRFToken(String token) { if(token != GetCSRFToken()) { throw new Exception("Invalid Request!") } } 

は、この種の攻撃を防ぐ上でより多くの情報を持つ別の質問へのリンクありすべてのPage_Load(つまり、すべてのポストバック)に " – shashi

+0

@sassyboy - done。 –

答えて

2

Asp.netは、実際にリクエストごとに新しいセッションIDを生成していない任意の条件の下で、た.ascxコントロールのPage_Loadにあります

hfSession.Value = Context.Session.SessionID; 

いくつかの値を格納する。これは、値が異なる理由である可能性があります。試してみて、セッションに何かを保存します。新しいセッションIDは、セッションまで、ページのロードが実際に割り当てられているたびに生成され、おそらく

Session["SessionID"] = Context.Session.SessionID; 
hfSession.Value = Context.Session.SessionID; 
+1

それはそうしました。ありがとう! –

0

を。だから、実際に何もセッションに割り当てていない場合は、各ページの読み込み時にSessionIDが変更されます。

2

私は、あなたがクロスサイトスクリプト要求偽造(CSRF)を防止しようとしていると思います。セッションIDは実際にはCookieとして送信され、攻撃者はこれを設定できます。セッションID自体を使用するのではなく、Session変数に格納されたランダムに生成された番号を使用する必要があります。あなたは現在のセッションIDに隠しフィールドの値を設定する」ためのコードを投稿できる

CSRF Validation Token: session id safe?

+0

良い点。私は将来このサイトでSSLを要求しますが、それが起こらない場合は乱数を使用するように変更します。 –

関連する問題