- - PR -
使用しているマシンで絶対にユニークなもの
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-06 19:35
1つの画面でログイン・ログアウト処理するプログラムを作ってます。
(VS.NET2003 ASP.NET VB.NET) そのプログラムではPage_Load時にクッキーがあればログイン、 なければログアウトの表示になります。 使うテーブルは ID, PW, TimeのフィールドがありユーザーがログインしたらTimeに 入った"yyyyMMdd hh:mm:ss"を入れてます。 それと同時にクッキーを作成します(ID,PW,Timeを記録してます)。 ログインするとき既にTimeに値があるIDでは入れなくしてます。 ログアウトではTimeを消すようにしています。 それと同時にクッキーを消してます。 文章だと分かりにくいと思いますが、クッキーとTime(ログインする時間)で制御 してます。 今原因不明の現象でクッキーが消えてるのにTime値が消えてない事が起きてます。 update LOGIN set Time = '' where ID = cookie("ID")が発動しない? この状態でプログラムを走らせるとクッキーがないのでログイン画面になる、 でも入るとTime値があるのでエラーで入れない・・・訳です。 ここで考えたのがTimeフィールドに時間じゃなくてマシンでユニークなものを 入れれば解決するのではないかと。 Aというマシンがクッキーが無くてもTimeにAと分かる情報が入ってればログイン 可能にすればいいので! ここまで考えがまとまってるのですが・・・ マシンでユニークになりそうなものってあるのでしょうか? | ||||||||||||||||||||||||
|
投稿日時: 2005-07-06 19:54
設計に根本的な誤りがあります。まずCookieはユーザーの操作により任意のタイミングで削除することが出来ます。またユーザーが複数のPCを有していた場合、別のPCからログインした場合にはCookieが無い場合もあるでしょう。
こんな設計では運用方法によほど制限や規制を加えない限り、アカウントがロックされてログインする事が出来なくなるでしょう。 またCookieには寿命を設定しておくのが一般的です。もちろん、無期限のCookieを作ることも出来ます。原因不明との事ですが、単に保持期限が過ぎたために削除されているのではないですか? またセッションの管理に予測可能なユーザーIDや日時を保存して利用するのはセッションハイジャックの恐れがあります。乱数で生成した十分なデータ長を持つ予測不可能な値を使うのが常識です。同じ理由でクライアントPCが持つユニークな情報を利用するのも避けるべきことです。 なお、クライアントに固有の情報を取得する手段はありません。仮に取得できると、セキュリティホール呼ばわりされること請け合いです。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-06 20:16
http://www.atmarkit.co.jp/channel/aspnet/aspnet.html
↑ ご参考 まぁ、既出の問題です。 _________________ | ||||||||||||||||||||||||
|
投稿日時: 2005-07-07 17:19
ASP.NETには個人情報を取得する手段がないみたいですね・・・
今日1日調べた感じでJavaScriptにこんなやり方がありました。 function func() { var objWSH_NW = new ActiveXObject("WScript.Network"); var U_name = objWSH_NW.UserName; document.forms[0].TextBox1.value = U_name; } 確かにこれだとWindowsのログイン名が取得できます。 でもActiveXObject("WScript.Network")を実行すると、 「オートメーションサーバーはオブジェクトを作成できません。」が発生します。 セキュリティでActiveXを有効にすれば回避できるのですが ログインする人のマシン環境を指定させたくないのが本音です。 もう少しASP.NETでできないか粘ってみます・・・^^; | ||||||||||||||||||||||||
|
投稿日時: 2005-07-07 17:40
どもです。がると申します。
んっと…ちょっと色々突っ込んでしまいますが。セキュリティ的に 結構かなめになる部分なので。
この時点でちょっと危険です。せめても「値を見てその値によって 動作を変える」のが最低限必要か、と。
えっと…なにはともあれ「CookieにIDとかパスワードとか入れちゃ駄目」 です(苦笑 Cookieって、基本的に「平文で毎回サーバとクライアント間で やり取りされまくる」文字列です。 簡単にクラックが可能です。 「社内のLANでしか使わないから」とかいって後で痛い目にあった ケースも多々見ています。 とりあえず設計をやり直したほうがよいと思うです。ハイ。 比較的セキュアで実装もさほど難しくない一例を挙げておきます。 参考になればよいのですが。
余談。ユニークなセッションIDの作り方。 「正しい」やり口としては ・DBの機能を使ってKEYを昇順に取得 って手段があります。 個人的には「重いのであまり使わない」のですが :-P DBMSによって手法は異なりますがまぁぐぐれば情報は出てくると思います。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-07 17:53
System.Guid.NewGuid() メソッドとか(Insider.NET 会議室 なので)。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-07 18:29
何で用意されているセッションIDやForm認証を使用しないのですか?何か事情があるのでしょうか。
みつけたらその方法を公開する前にMSにひっそりと教えてあげてください。 んで、パッチが出るまでその方法は公開しないほうがいいです。
ソレモヤバイデスヨ 私ならとりあえず自分のアカウントでログインしてからクッキーのSessionID見て-1してそれをセットしてつなげてみます。 SessionIDは完全な(セキュリティを考慮されている安全な)乱数使わないとだめです。それもちゃんと長いやつ。 というかこの辺語りだすと注意しなければならないことが大量にあるので、用意されているものを使うのが普通です。自分でやればやっただけセキュリティホールを生み出す可能性があがります。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-07 22:14
どっちもヤバイですよー。最初の返答でも書きましたが予測可能な値をセッションIDに使ってはいけません。ブルートフォースで片っ端から試すと、簡単にセッションIDを割り出されてしまいますよ。これをセッションハイジャック脆弱性といます。 GUIDは72bitのMACアドレスと日時から割り出される128bitの値です。MACアドレスは固定ですので、実質50bitしかない上、発行日時をある程度しぼれば組み合わせの数は高が知れています。 第3回 気を付けたい貧弱なセッション管理
粘っても無駄です。クライアントの情報を勝手にサーバー側で参照できたら、それはWEBブラウザのセキュリティホールです。ASP.NETも、HTTPの仕組みの上で動作している以上は逃げられません。 事前にクライアント側でVBScriptで参照できるようにCOMコンポーネントをインストールしてもらうとか、署名つきActiveX使う(警告画面表示されるけど)とかすれば実現できます。方法は多々ありますが、何れもクライアント側の事前設定や、操作なしに取得する事は出来ません。 [ メッセージ編集済み 編集者: 甕星 編集日時 2005-07-07 22:21 ] |