- PR -

使用しているマシンで絶対にユニークなもの

投稿者投稿内容
くー
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 86
投稿日時: 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と分かる情報が入ってればログイン
可能にすればいいので!
ここまで考えがまとまってるのですが・・・
マシンでユニークになりそうなものってあるのでしょうか?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-07-06 19:54
設計に根本的な誤りがあります。まずCookieはユーザーの操作により任意のタイミングで削除することが出来ます。またユーザーが複数のPCを有していた場合、別のPCからログインした場合にはCookieが無い場合もあるでしょう。

引用:

KUMAさんの書き込み (2005-07-06 19:35) より:
ID, PW, TimeのフィールドがありユーザーがログインしたらTimeに
入った"yyyyMMdd hh:mm:ss"を入れてます。
それと同時にクッキーを作成します(ID,PW,Timeを記録してます)。

ログインするとき既にTimeに値があるIDでは入れなくしてます。


こんな設計では運用方法によほど制限や規制を加えない限り、アカウントがロックされてログインする事が出来なくなるでしょう。

またCookieには寿命を設定しておくのが一般的です。もちろん、無期限のCookieを作ることも出来ます。原因不明との事ですが、単に保持期限が過ぎたために削除されているのではないですか?

またセッションの管理に予測可能なユーザーIDや日時を保存して利用するのはセッションハイジャックの恐れがあります。乱数で生成した十分なデータ長を持つ予測不可能な値を使うのが常識です。同じ理由でクライアントPCが持つユニークな情報を利用するのも避けるべきことです。

なお、クライアントに固有の情報を取得する手段はありません。仮に取得できると、セキュリティホール呼ばわりされること請け合いです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-06 20:16
http://www.atmarkit.co.jp/channel/aspnet/aspnet.html

ご参考

 まぁ、既出の問題です。
_________________
くー
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 86
投稿日時: 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でできないか粘ってみます・・・^^;
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-07 17:40
どもです。がると申します。
んっと…ちょっと色々突っ込んでしまいますが。セキュリティ的に
結構かなめになる部分なので。

引用:

KUMAさんの書き込み (2005-07-06 19:35) より:
そのプログラムではPage_Load時にクッキーがあればログイン、
なければログアウトの表示になります。


この時点でちょっと危険です。せめても「値を見てその値によって
動作を変える」のが最低限必要か、と。

引用:

使うテーブルは
ID, PW, TimeのフィールドがありユーザーがログインしたらTimeに
入った"yyyyMMdd hh:mm:ss"を入れてます。
それと同時にクッキーを作成します(ID,PW,Timeを記録してます)。


えっと…なにはともあれ「CookieにIDとかパスワードとか入れちゃ駄目」
です(苦笑
Cookieって、基本的に「平文で毎回サーバとクライアント間で
やり取りされまくる」文字列です。
簡単にクラックが可能です。
「社内のLANでしか使わないから」とかいって後で痛い目にあった
ケースも多々見ています。
とりあえず設計をやり直したほうがよいと思うです。ハイ。

比較的セキュアで実装もさほど難しくない一例を挙げておきます。
参考になればよいのですが。

コード:
用意するテーブル
ID用テーブル(
  ID
  パスワード
  PRIMARY KEY は ID
);

セッションID用テーブル(
  ID
  セッションID
  有効期限(これはなくてもよし。あったほうが安全ですが)
  PRIMARY KEY は セッションID
);



コード:
ログイン時の挙動
・ID用テーブルでIDとパスワードをチェック
・OKなら「ユニークなセッションIDを作成」
・セッションID用テーブルにINSERTする
・Cookieに「セッションIDを」書き込む



コード:
認証時の挙動
・CookieからセッションIDを取得
・セッションID用テーブルから情報取得
・テーブルになければ認証エラー
・(有効期限を見るならここで)
・テーブルにあって有効期限がOKなら認証OK



コード:
ログアウト時の挙動
・セッションIDテーブルから該当セッションIDのレコードを削除



余談。ユニークなセッションIDの作り方。
「正しい」やり口としては
・DBの機能を使ってKEYを昇順に取得
って手段があります。
個人的には「重いのであまり使わない」のですが :-P
DBMSによって手法は異なりますがまぁぐぐれば情報は出てくると思います。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-07-07 17:53
引用:

がるがるさんの書き込み (2005-07-07 17:40) より:

余談。ユニークなセッションIDの作り方。


System.Guid.NewGuid() メソッドとか(Insider.NET 会議室 なので)。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-07-07 18:29
何で用意されているセッションIDやForm認証を使用しないのですか?何か事情があるのでしょうか。

引用:


セキュリティでActiveXを有効にすれば回避できるのですが
ログインする人のマシン環境を指定させたくないのが本音です。
もう少しASP.NETでできないか粘ってみます・・・^^;



みつけたらその方法を公開する前にMSにひっそりと教えてあげてください。
んで、パッチが出るまでその方法は公開しないほうがいいです。

引用:


余談。ユニークなセッションIDの作り方。
「正しい」やり口としては
・DBの機能を使ってKEYを昇順に取得
って手段があります。
個人的には「重いのであまり使わない」のですが
DBMSによって手法は異なりますがまぁぐぐれば情報は出てくると思います。



ソレモヤバイデスヨ
私ならとりあえず自分のアカウントでログインしてからクッキーのSessionID見て-1してそれをセットしてつなげてみます。
SessionIDは完全な(セキュリティを考慮されている安全な)乱数使わないとだめです。それもちゃんと長いやつ。

というかこの辺語りだすと注意しなければならないことが大量にあるので、用意されているものを使うのが普通です。自分でやればやっただけセキュリティホールを生み出す可能性があがります。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-07-07 22:14
引用:

がるがるさんの書き込み (2005-07-07 17:40) より:
余談。ユニークなセッションIDの作り方。
「正しい」やり口としては
・DBの機能を使ってKEYを昇順に取得
って手段があります。
個人的には「重いのであまり使わない」のですが
DBMSによって手法は異なりますがまぁぐぐれば情報は出てくると思います。



引用:

きくちゃんさんの書き込み (2005-07-07 17:53) より:
System.Guid.NewGuid() メソッドとか(Insider.NET 会議室 なので)。



どっちもヤバイですよー。最初の返答でも書きましたが予測可能な値をセッションIDに使ってはいけません。ブルートフォースで片っ端から試すと、簡単にセッションIDを割り出されてしまいますよ。これをセッションハイジャック脆弱性といます。

GUIDは72bitのMACアドレスと日時から割り出される128bitの値です。MACアドレスは固定ですので、実質50bitしかない上、発行日時をある程度しぼれば組み合わせの数は高が知れています。

第3回 気を付けたい貧弱なセッション管理

引用:

シルバーさんの書き込み (2005-07-07 17:19) より:
もう少しASP.NETでできないか粘ってみます・・・^^;


粘っても無駄です。クライアントの情報を勝手にサーバー側で参照できたら、それはWEBブラウザのセキュリティホールです。ASP.NETも、HTTPの仕組みの上で動作している以上は逃げられません。
事前にクライアント側でVBScriptで参照できるようにCOMコンポーネントをインストールしてもらうとか、署名つきActiveX使う(警告画面表示されるけど)とかすれば実現できます。方法は多々ありますが、何れもクライアント側の事前設定や、操作なしに取得する事は出来ません。

[ メッセージ編集済み 編集者: 甕星 編集日時 2005-07-07 22:21 ]

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