- PR -

ASP.NET セッション変数

投稿者投稿内容
ts12_
会議室デビュー日: 2005/09/05
投稿数: 10
投稿日時: 2005-09-05 23:58
いつも参考にさせて頂いております。

古い環境で申し訳ないのですが、Win2000Server + VS.NET2002
にて開発したASP.NETアプリケーションについて知恵をお借りしたく。

ログイン画面にてテキストボックスに入力したユーザIDを
セッション変数に記憶し、そのセッション変数を利用してDBアクセスしております。
(SQL文のWhere句に使用している)

ところが、ごくたまにそのセッション変数の中身が変わってしまう
という現象が発生してしまいました。
例をあげると、ユーザ「A」でログインして操作中、ある時突然セッション変数の
ユーザIDが「B」に変わってしまうのです。

カットオーバー後2年近くそのような現象はなかったのですが、
ここ数ヶ月で何回か発生しております。
原因の見当もつかず途方にくれているのですが、心当たりのある方、もくしくは
こんな調べ方すれば何か分かるかもしれないという情報があれば大変助かります。

よろしくお願い致します。
グータラ犬
会議室デビュー日: 2003/12/19
投稿数: 2
投稿日時: 2005-09-06 01:08
ASP.NETで書かれたプログラムでグローバル変数使っていませんか?
グローバル変数を使っている場合、同時にアクセスした他の人の
情報に置き換わることがあります。

[ メッセージ編集済み 編集者: グータラ犬 編集日時 2005-09-06 01:09 ]

[ メッセージ編集済み 編集者: グータラ犬 編集日時 2005-09-06 01:10 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-06 02:01
こんにちわ。

2年も正常に動いていたものが、今更こんな障害が出てしまうとなかなか原因を突き止め辛いですね。頑張って下さい。

さて、もう少し情報を下さい。
例えば、
何故、今この現象に気づきましたか?
同時に約何ユーザがアクセスしますか?
もし出してよければ、ユーザIDをセッションに入れている周辺コードを提示できますか?
等。

これらを出しても、私が分かるとは限りませんが…、誰かが分かるかもしれません^^;
よろしくお願いします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2005-09-06 10:21
C#だったらstatic、VB.NETだったらModuleを使ってたりすると、そのあたりが
あやしいですね。
ただこの場合、2年も現象がでなかったのはその間同時に使われることがなく、
最近になってはじめて複数の人が同時に使うようになった、ということに
なってしまいますが。。。

まぁ、囚人さんがおっしゃってるとおり情報が少ないので、もうちょっと
詳しく書き込んでみてください。
ts12_
会議室デビュー日: 2005/09/05
投稿数: 10
投稿日時: 2005-09-06 21:59
ご返答ありがとうございます。
返答が遅くなりまして申し訳ありません。

コードを簡略化して書きますと、
セッション変数への記憶↓
Session("<セッション変数名>") = <テキストボックス名>.Text

セッション変数の利用↓
SQL文 = "SELECT * FROM <テーブル名>"
SQL文 &= " WHERE ログインユーザ = " & Session("<セッション変数名>").ToString

このような感じです。

アドバイス頂いたようなグローバル変数
(もしくはApplication変数)は使用しておりません。

現象はユーザからの指摘にて分かりました。
(ですので、指摘がなかっただけで現象が起きていた可能性はあります)
アプリケーションの総ユーザ数は350名程度で、
同時使用数は最大でも50程度です。

Moduleは確かに使用しているのですが、該当セッション変数に
値をセットするのはログイン直後の一度だけ、以後その部分は
通りません。かつ、セット部分のコードはフォーム内(コード
ビハインド部分)に書いてありますので、コードでセッション変数を
上書きしてしまっている事はないと思います。

逆にセッション変数を利用している部分については、Module内でも
該当セッション変数を利用しております。
その際のコードは↓のような感じです。
SQL文 = "SELECT * FROM <テーブル名>"
SQL文 &= " WHERE ログインユーザ = " & HttpContext.Current.Session("<セッション変数名>").ToString
この際にセッション変数が他のものを使用してしまい、検索結果が
変わっているとしても、そのあとに、
<テキストボックス名>.Text = Session("<セッション変数名>").ToString
のようにセッション変数をフォーム内で直接テキストボックスに
セットしている部分でも「B」となっていますので、セッション変数の
値そのものが変わってしまっていると考えております。
Module内でセッション変数を使用すると入れ替わってしまうような
事があるのでしょうか…?


なお、変わってしまったセッション変数「B」は、
実際に登録されている有効なユーザです。
「A」から「B」に変わる際に「B」がログインして
いたかどうかは不明なのですが…。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-09-06 22:55
unibon です。こんにちわ。

(なんとなくですが、
@ITクラブ Cafe 会議室 > 脆弱性を見つけた時の対応は?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23258&forum=3
を思い出しました。)

フレームワークやミドルウェアのバグでセッションがすりかわるということは、理論的にはありうるかもしれませんが、こういうのはほとんどはアプリケーションの側のバグであることが多いです。すなわち、アプリケーションのコードの中に、(分かってみれば)些細なケアレスミスがあることが原因である可能性が高いと思います。
とはいえやっぱりフレームワーク側(ASP.NET 等)も疑いたくなりますよね。
あるいは、いたずら心や悪意のあるユーザーにクラックされていることも可能性としては残りますね。SQLインジェクションとかになっていないでしょうか。
しかし、まずはとりあえずはアプリケーションのコードで、とくに認証部分を中心に再度見直されたほうが早く切り分けできるかもしれません。

引用:

ts12_さんの書き込み (2005-09-06 21:59) より:
Moduleは確かに使用しているのですが、該当セッション変数に
値をセットするのはログイン直後の一度だけ、以後その部分は
通りません。かつ、セット部分のコードはフォーム内(コード
ビハインド部分)に書いてありますので、コードでセッション変数を
上書きしてしまっている事はないと思います。


変だと思われる点は2点ありますよね。「セット部分」が動く回数が1回を超えているらしいこと、と、「セット部分」で別のユーザーIDがセットされていること。と思ったのですが、「セット部分」は何回動いているのでしょうか?1回しか動いてなくて、そのときにすでに別のユーザーIDがセットされてしまっているのではないかな、とも思います。
が、やっぱり具体的なコードがないとなんとも言えないですね。が、掲示板でデバッグ、というのも難しいですよね...
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-09-06 23:13
引用:

ts12_さんの書き込み (2005-09-06 21:59) より:
逆にセッション変数を利用している部分については、Module内でも
該当セッション変数を利用しております。
その際のコードは↓のような感じです。
SQL文 = "SELECT * FROM <テーブル名>"
SQL文 &= " WHERE ログインユーザ = " & HttpContext.Current.Session("<セッション変数名>").ToString
この際にセッション変数が他のものを使用してしまい、検索結果が
変わっているとしても、そのあとに、
<テキストボックス名>.Text = Session("<セッション変数名>").ToString
のようにセッション変数をフォーム内で直接テキストボックスに
セットしている部分でも「B」となっていますので、セッション変数の
値そのものが変わってしまっていると考えております。


NAL-6295です。
こんばんわ。

Module内で利用しているSQL文を格納する変数はメソッド内の変数ですか?
それとも、Module内に定義している変数ですか?
もし、後者であるならば、その現象が発生する条件としては充分です。

それともう一つ、Session("<セッション変数名>")にアクセスしている箇所でブレイクしてウォッチして見てみてください。

あと、本題とは関係ありませんが、引用にあるようなSQL文の構築の仕方だとSQL挿入の問題が発生する可能性があります。
上記のような文字列連結によるSQL文の構築を行う場合は、条件文に使う入力値を適切にエスケープしてあげてください。もしくはパラメタライズドクエリを利用する事をお勧めします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-09-07 10:06
Module内に変数を定義していませんか?
それはsharedが付いていなくても静的変数になります。

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