- - PR -
ASP.NET セッション変数
1|2|3|4
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-05 23:58
いつも参考にさせて頂いております。
古い環境で申し訳ないのですが、Win2000Server + VS.NET2002 にて開発したASP.NETアプリケーションについて知恵をお借りしたく。 ログイン画面にてテキストボックスに入力したユーザIDを セッション変数に記憶し、そのセッション変数を利用してDBアクセスしております。 (SQL文のWhere句に使用している) ところが、ごくたまにそのセッション変数の中身が変わってしまう という現象が発生してしまいました。 例をあげると、ユーザ「A」でログインして操作中、ある時突然セッション変数の ユーザIDが「B」に変わってしまうのです。 カットオーバー後2年近くそのような現象はなかったのですが、 ここ数ヶ月で何回か発生しております。 原因の見当もつかず途方にくれているのですが、心当たりのある方、もくしくは こんな調べ方すれば何か分かるかもしれないという情報があれば大変助かります。 よろしくお願い致します。 | ||||
|
投稿日時: 2005-09-06 01:08
ASP.NETで書かれたプログラムでグローバル変数使っていませんか?
グローバル変数を使っている場合、同時にアクセスした他の人の 情報に置き換わることがあります。 [ メッセージ編集済み 編集者: グータラ犬 編集日時 2005-09-06 01:09 ] [ メッセージ編集済み 編集者: グータラ犬 編集日時 2005-09-06 01:10 ] | ||||
|
投稿日時: 2005-09-06 02:01
こんにちわ。
2年も正常に動いていたものが、今更こんな障害が出てしまうとなかなか原因を突き止め辛いですね。頑張って下さい。 さて、もう少し情報を下さい。 例えば、 何故、今この現象に気づきましたか? 同時に約何ユーザがアクセスしますか? もし出してよければ、ユーザIDをセッションに入れている周辺コードを提示できますか? 等。 これらを出しても、私が分かるとは限りませんが…、誰かが分かるかもしれません^^; よろしくお願いします。 | ||||
|
投稿日時: 2005-09-06 10:21
C#だったらstatic、VB.NETだったらModuleを使ってたりすると、そのあたりが
あやしいですね。 ただこの場合、2年も現象がでなかったのはその間同時に使われることがなく、 最近になってはじめて複数の人が同時に使うようになった、ということに なってしまいますが。。。 まぁ、囚人さんがおっしゃってるとおり情報が少ないので、もうちょっと 詳しく書き込んでみてください。 | ||||
|
投稿日時: 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」がログインして いたかどうかは不明なのですが…。 | ||||
|
投稿日時: 2005-09-06 22:55
unibon です。こんにちわ。
(なんとなくですが、 @ITクラブ Cafe 会議室 > 脆弱性を見つけた時の対応は? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23258&forum=3 を思い出しました。) フレームワークやミドルウェアのバグでセッションがすりかわるということは、理論的にはありうるかもしれませんが、こういうのはほとんどはアプリケーションの側のバグであることが多いです。すなわち、アプリケーションのコードの中に、(分かってみれば)些細なケアレスミスがあることが原因である可能性が高いと思います。 とはいえやっぱりフレームワーク側(ASP.NET 等)も疑いたくなりますよね。 あるいは、いたずら心や悪意のあるユーザーにクラックされていることも可能性としては残りますね。SQLインジェクションとかになっていないでしょうか。 しかし、まずはとりあえずはアプリケーションのコードで、とくに認証部分を中心に再度見直されたほうが早く切り分けできるかもしれません。
変だと思われる点は2点ありますよね。「セット部分」が動く回数が1回を超えているらしいこと、と、「セット部分」で別のユーザーIDがセットされていること。と思ったのですが、「セット部分」は何回動いているのでしょうか?1回しか動いてなくて、そのときにすでに別のユーザーIDがセットされてしまっているのではないかな、とも思います。 が、やっぱり具体的なコードがないとなんとも言えないですね。が、掲示板でデバッグ、というのも難しいですよね... | ||||
|
投稿日時: 2005-09-06 23:13
NAL-6295です。 こんばんわ。 Module内で利用しているSQL文を格納する変数はメソッド内の変数ですか? それとも、Module内に定義している変数ですか? もし、後者であるならば、その現象が発生する条件としては充分です。 それともう一つ、Session("<セッション変数名>")にアクセスしている箇所でブレイクしてウォッチして見てみてください。 あと、本題とは関係ありませんが、引用にあるようなSQL文の構築の仕方だとSQL挿入の問題が発生する可能性があります。 上記のような文字列連結によるSQL文の構築を行う場合は、条件文に使う入力値を適切にエスケープしてあげてください。もしくはパラメタライズドクエリを利用する事をお勧めします。 | ||||
|
投稿日時: 2005-09-07 10:06
Module内に変数を定義していませんか?
それはsharedが付いていなくても静的変数になります。 |
1|2|3|4
次のページへ»