- PR -

ASP.NET セッション変数

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-09-09 00:50
unibon です。こんにちわ。
引用:

ts12_さんの書き込み (2005-09-08 23:23) より:
また、この件はお客様からの報告により発覚したのですが、
私自身は現象を目の当たりにした事はありません。


引用:

ts12_さんの書き込み (2005-09-08 23:23) より:
ちなみに、そのお客様が遭遇した際は、遠く離れた営業所のユーザIDに
突然変わってしまったそうです。


「セッション変数の中身が変わってしまう」ということを確認されたわけではなく推測なのですよね?
私も推測になりますが、セッションがすりかわっているのではなく、DB (やその他オブジェクト) にアクセスする際に別のレコードを読み書きしているのではないでしょうか?
だんだん推測ばかりになりますが、ありがちなのは、たとえば SQL の SELECT の WHERE を使って1レコードに絞り込んだつもりで、1レコードしかないからという前提で最初にフェッチしたレコードを表示に使った場合などです。ここで、たとえば、選択条件の指定がまずくて1レコードに絞り込めずに、実際には複数レコードが選択されていてたまたま先頭のレコードをフェッチしたら違うレコードだったとかいうことがあります。
ユーザーが目にする画面では、ユーザーが自身のユーザー名を知ることができる表示はありますか?それとも検索結果の表示から間接的にユーザー名が分かるにすぎないのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-09-10 00:17
引きずってますね。

 ところで、セッション管理は、何でやってますか?
また、クッキーはどうなってます?

 たとえば、クッキーレスでやっていて、お客さんの誰かがログインした後のページを「お気に入り」に登録しちゃってると、「セッションハイジャック」が起こる可能性があるんじゃないかな?と思いました。


理由:
クッキーレスだと、セッション ID が URL の一部になる
セッション ID は、有効なセッション ID が重ならないことは保証されているが、すでに無効になっているものと重ならないことは、保証されていない

_________________
ts12_
会議室デビュー日: 2005/09/05
投稿数: 10
投稿日時: 2005-09-10 01:26
ご返答ありがとうございます。
全てのご意見が勉強になります。

お客様が見る画面には自分のユーザ名を確認できる部分があります。
現象が発生した際に、お客様はその状態をPrintScreenで記録して
くれていまして、そこにははっきりと他人のユーザ名が表示されています。

以前に書いたテキストボックスにセッション変数の値をセットしている
というのが、上記のユーザ名を表示する部分です。
セッション変数の中身が変わってしまうというのは確かに推測なのですが、
このユーザ名の表示が変わる事が私の推測の根拠です。


セッション管理について、Web.configの該当部分は以下のとおりです。
<sessionState
mode="InProc"
 ・
 ・
cookieless="false"
 ・
 ・
/>
よって、URLにセッションIDが含まれている事はありません。
実機でも確認致しました。


…今は出口のない迷路のような状態でも、分かってみればきっと
単純な事なのかもしれませんね。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-09-10 01:47
引用:

ts12_さんの書き込み (2005-09-10 01:26) より:

お客様が見る画面には自分のユーザ名を確認できる部分があります。
現象が発生した際に、お客様はその状態をPrintScreenで記録して
くれていまして、そこにははっきりと他人のユーザ名が表示されています。




NAL-6295です。

なんとなく、分かった気がする。
間違っていたらすいません。
セッションに保持しているのはユーザIDですよね。
で、モジュール内でクエリを実行して、ユーザ名を持ってきている。
で、そのクエリ文字列を格納している変数はモジュール内に持っているためShared扱いである。
そのため、タイミングでは違う結果セットを取得してしまうことがあり、違う人の名前が表示される。
あくまで、セッションの中にあるユーザIDは変わっていない。

という事では無いですか?


[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-09-10 01:48 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-10 02:30
引用:

セッションに保持しているのはユーザIDですよね。
で、モジュール内でクエリを実行して、ユーザ名を持ってきている。


あれ?そう言えば…。
引用:

TextBox1.Text = Session("<セッション変数名>").ToString
・・・
SQL文 = "SELECT * FROM <テーブル名>"
SQL文 &= " WHERE ログインユーザ = " & HttpContext.Current.Session("<セッション変数名



セッションに持っているのは一体何…? WHERE 句の「ログインユーザ」というのはID?それとも名前?
名前で検索??なわけないですよね。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-09-10 19:54
まさか、コネクションをShared(static)で扱っているとか。

[ メッセージ編集済み 編集者: todo 編集日時 2005-09-10 19:55 ]
ts12_
会議室デビュー日: 2005/09/05
投稿数: 10
投稿日時: 2005-09-11 11:44
ご返答ありがとうございます。

セッション変数の内容についてですが、
ユーザIDとユーザ名の両方があります。
ログイン時に、入力されたユーザIDからユーザ名を
取得し、セッション変数にセットしております。
これは最初に前提としてはっきり書かなければ
いけなかった事ですね。
無用な混乱をさせてしまいまして大変申し訳
ありません。

セッション変数は他にもユーザの所属営業所コード、
所属営業所名、アプリケーション内での権限コード等
がありますが、全てセッション変数にセットする
部分はユーザIDと同じ箇所(ログイン直後)で行っております。

ですので、DBを検索する部分ではユーザIDを使用し、
テキストボックスにはユーザ名を表示しております。
ユーザIDはDB検索やDB登録などで多数使用しておりますが、
ユーザ名の使用用途はテキストボックスに表示する
だけになります。


「コネクションをShared(static)で…」とのご指摘に
ついてですが、コネクションは各Webフォーム内で
SqlConnectionをインスタンス化して持っております。
Module関数へは参照渡しで引数に指定しております。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-09-11 12:05
引用:

ts12_さんの書き込み (2005-09-11 11:44) より:
ご返答ありがとうございます。

ですので、DBを検索する部分ではユーザIDを使用し、
テキストボックスにはユーザ名を表示しております。
ユーザIDはDB検索やDB登録などで多数使用しておりますが、
ユーザ名の使用用途はテキストボックスに表示する
だけになります。



つまり、ユーザIDをもとにDBに問い合わせを行って、ユーザ名を
取得し、セッションに登録しているのですよね。
で、過去に、
引用:

「SQL文」はModule内で定義された変数です。
よって、後からアクセスした人の結果が返ってくる
という部分は納得できました。



と、おっしゃっている。
ですので、

セッションに保持しているのはユーザIDですよね。
で、モジュール内でクエリを実行して、ユーザ名を持ってきている。
で、そのクエリ文字列を格納している変数はモジュール内に持っているためShared扱いである。
そのため、タイミングでは違う結果セットを取得してしまうことがあり、違う人の名前が表示される。
あくまで、セッションの中にあるユーザIDは変わっていない。


と、予測したのですが。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-09-11 12:06 ]

スキルアップ/キャリアアップ(JOB@IT)