- PR -

クライアント情報の取得

投稿者投稿内容
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-07-01 14:13
こんにちは。

掲題の件でお知恵を拝借できれば、と思います。
<やりたいこと>
ログインしているユーザ毎に対して、
表示させるサイト画面を制御したい。
ただし、「ログイン」などの機能は使用しない。

<試したこと>
Request.ServerVariables("XXX")
で、クライアントの情報を取得して、内部で判定しようと思いました。
最初に IP アドレスを取得し、ネットワーク部でグループ分けをして、
判定を行おうと思いました。
Request.ServerVariables("REMOTE_ADDR")

しかし、IP アドレスだと、ちゃんと体系たてて
登録していないので今回は使えないと判断しました。
※ IP アドレスは別の部署が管理しているので。。。

その後、「マシン名」 or 「ログインユーザID」で判断可能だと思いましたので、
Request.ServerVariables("REMOTE_HOST")
Request.ServerVariables("REMOTE_USER")
を実行したのですが、結果はブランクとなってしまいました。

調べてみると
1.
REMOTE_HOST
要求を出したホストの名前です。サーバーがこの情報を持っていない場合、
サーバーは REMOTE_ADDR を設定してこの変数を空のままにします。

2.
REMOTE_USER
ユーザーから送信された、マップされていないユーザー名文字列です。
これは、サーバーにインストールされている認証フィルタによって
変更された名前ではなく、ユーザーから実際に送信された名前です。

1. はサーバがマシン名の情報を持っていない ( DNS ではない? ) ので
ブランクかな、と。

2. に関してはユーザが送信した内容だから取得出来ると思ったのですが、
やはりブランクになっています。

<質問>
1.
「REMOTE_HOST」「REMOTE_USER」が取得出来ない理由は何故でしょうか?

2.
「REMOTE_HOST」「REMOTE_USER」情報を取得する為にはどうしたらよいでしょうか?

3.
上記 2 つ以外で、クライアントを判断する方法
( ドメイン名取得や IP アドレスからの逆引きなど ) でアイデアがありましたら
お知恵を拝借したいと思います。

宜しくお願いいたします。

<追記>
すいません、環境書いていませんでした。
Windows 2000 Server
IIS
</追記>


[ メッセージ編集済み 編集者: 小僧 編集日時 2005-07-01 14:15 ]

[ メッセージ編集済み 編集者: 小僧 編集日時 2005-07-01 14:18 ]
あつしfx
大ベテラン
会議室デビュー日: 2002/04/08
投稿数: 104
お住まい・勤務地: XPできるところ
投稿日時: 2005-07-08 13:16
サーバ変数についてはWebでけんさくしてみると良いのでは?
ただ、ブラウザ側で出さないようだったらダメですよね。

ネットワークやクライアントの想定がわからないのでなんとも言えませんが、
最初にログイン、以後自動ログインが通常だと思います。

個々のブラウザを判別したいならクッキーを使うのが一番だとも思います。


_________________
http://aglabo.com/ @Homepage
http://furukawa-select.com/mt/ @Blog
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-08 14:12
どもです。がると申します。
前提部分への突っ込みなので大変に恐縮ではあるのですが。
引用:

掲題の件でお知恵を拝借できれば、と思います。
<やりたいこと>
ログインしているユーザ毎に対して、
表示させるサイト画面を制御したい。
ただし、「ログイン」などの機能は使用しない。


んっと…「なぜ」ログインなどの機能を使用したくないのでしょうか?
おっしゃってる
・ログインしているユーザ毎に対して、表示させるサイト画面を制御したい。
っていう実装は、まず九分九厘「ログイン機能」を用いるもの
なのですが。
# 制御用パラメタがシンプルにまとまるなら、直接Cookieに書き込むってのも手ですが

引用:

最初に IP アドレスを取得し、ネットワーク部でグループ分けをして、
判定を行おうと思いました。
Request.ServerVariables("REMOTE_ADDR")

しかし、IP アドレスだと、ちゃんと体系たてて
登録していないので今回は使えないと判断しました。
※ IP アドレスは別の部署が管理しているので。。。


そうですねぇ。よっぽどなにか強固な管理をしているのであればともかく、
大抵の場合、IPで判断は極端に危険です。

引用:

その後、「マシン名」 or 「ログインユーザID」で判断可能だと思いましたので、


えっと…ブラウザごときの通信で「ログインユーザID」なんか取得されたら
セキュリティ的にえらいことになってしまいます(苦笑

引用:

3.
上記 2 つ以外で、クライアントを判断する方法
( ドメイン名取得や IP アドレスからの逆引きなど ) でアイデアがありましたら
お知恵を拝借したいと思います。


素直にログイン機能の実装から入ってみてはいかがでしょう?

背景がわからないのでなんとも、という部分はあるのですが。
・業務なのか学習なのか(他部署という話からして多分前者。
 でも確定ではない)
・LANなのかThe Internet接続も見越しているのか(もっとも
 「LANだから甘くていい」という思想には大いに反対意見を
 持っておりますが)
などなど。

ただ、いずれにしてもただでさえセキュリティ関連の話でうるさくなって
いる昨今、もうちょっと「セキュアな」つくりというか設計をすることを
強くお勧めしてみたり :-P
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-07-08 15:19
あつしfx様、がるがる様、回答ありがとうございます。
まとめてレスをさせて頂きます。

> 最初にログイン、以後自動ログインが通常だと思います。
私もそう思っているのですが、そうすると開発工数がかかる ( 当たり前ですが )
& ユーザインターフェースが変わるので影響が大きい、と判断して
最初の投稿のような内容になりました。

> えっと…ブラウザごときの通信で「ログインユーザID」なんか取得されたら
> セキュリティ的にえらいことになってしまいます(苦笑
そうですよね。。。
しかし、色々と調べていたら
Request.ServerVariables("REMOTE_USER") ' リモート端末のユーザ名
とありましたので、勝手に「ログインユーザID」が取得出来る、と
思ってしまいました。
ちなみに、個人的には IP アドレスが取得出来る事に驚きましたが。。。 ( 普通の事? )

> 背景がわからないのでなんとも、という部分はあるのですが。
えーと、背景としては
・社内システム ( 本番運用しています )
・イントラネットで使用 ( 「LANだから甘くていい」とは思っていません、一応 )
となります。

どのようなシステムか、と言いますと、
例えば自社の社員情報が見れるシステムがあります。
普通の社員は「閲覧」だけ、偉い人は「閲覧 & 更新」が出来る、
というような感じです。
で、 ( 本当はそんな訳ありませんが ) 普通の人のマシン名は
NORMALXXXX
という感じで、偉い人は
EXECUTIVEXXXX
というマシン名と決まっています。
( XXXX は連番 )
( ユーザ ID も同じような感じ )

なんとかこの情報を取得して、 ASP で動的に HTML を生成する際に
「偉い人がアクセスしたら、更新が出来る画面へのリンクを表示する」という
挙動にしたいなぁ、と。
( いや、分かっているつもりですよ、
ログイン機能をつけるのが普通だっていう事は。。。
後、 URL 直接指定したら更新画面が出るじゃん、とかって言う事も。。。 )

で、色々と考えた挙句、以下のようにしようかな、と。
1.
IP アドレスが取得出来るので、その IP に対して
ping -a IP アドレス
を実行。

2.
ping の結果で、マシン名が取れたらマシン名の頭をチェックして
→ NORMAL だったら「普通の人」
→ EXECUTIVE だったら「偉い人」
→ 取れなかったら「普通の人」
と判断する。

3.
判断した値でリンクを表示する/しないを制御。
( 喧々囂々たる非難を浴びそうですが。。。 )

> もうちょっと「セキュアな」つくりというか設計をすることを
> 強くお勧めしてみたり
私もそう思うのですが、中々現実は。。。
という状況です。

アドバイス、ありがとうございました。

PS
ちなみに、色々なキーワードでぐーぐるさんに聞いてみたのですが、
Request.ServerVariables("REMOTE_HOST")
Request.ServerVariables("REMOTE_USER")
ってどういう状況で情報が取れるのでしょうか?
→ というか、何故私の環境では取得出来ないのでしょうか?
基本的な事が理解出来ていない???
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-07-08 16:35
REMOTE_ADDR、REMOTE_HOST、REMOTE_USER などは、CGIで規定されている変数です。

IPアドレスからクライアントのDNS名が逆引きできなかった場合や、ウェブサーバがDNS逆引きをしない設定になっている場合、REMOTE_HOSTには値が入りません。

REMOTE_USERは、HTTPレベルのでの認証(basic auth とか digest auth)をしたときに、そのユーザ名が入ります。

認証を使わない場合は、クライアントのIPアドレスしか識別に使える情報はないでしょう。

おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2005-07-08 16:36
工数が少なければ、ログイン機能でもOKなんですね?

アプリケーションに組み込まずにウェブサーバー側で
BASIC認証などの機能を使ってみては?
ひら
ぬし
会議室デビュー日: 2005/03/04
投稿数: 260
投稿日時: 2005-07-08 17:38
引用:

小僧さんの書き込み (2005-07-08 15:19) より:

NORMALXXXX
という感じで、偉い人は
EXECUTIVEXXXX
というマシン名と決まっています。



書き込みから類推するに、このマシン名とは、DNSで解決される名前ではなく、
NETBIOS名(*1)である、またログインユーザIDというのは、認証ページで入力される
ユーザIDではなくWindowsログインのときに入力するログイン名であると
見受けますがいかがでしょうか?

(*1)Windows2000であれば、デスクトップのマイコンピュータを右クリックし、
ネットワークIDボタンで設定する値です

「LANだから甘くていい」という前提条件になってしまいますが、そこを大目に
見てもらうとすると、ブラウザをIEに限定するのであれば取得方法はあります。
(*注:当然ながら非推奨です。あくまでそのような方法もあるという事で*)

<HTML>
<BODY>
<FORM NAME="Form1">
<INPUT TYPE="Button" NAME="Button1" VALUE="GET">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
Set WSH = CreateObject("WScript.Network")
str = "ComputerName=" & WSH.ComputerName & vbCrLf
str = str & "UserDomain =" & WSH.UserDomain & vbCrLf
str = str & "UserName =" & WSH.UserName
MsgBox str
</SCRIPT>
</FORM>
</BODY>
</HTML>

(セキュリティ確認のメッセージがうっとおしいのですが・・・)

小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-07-08 18:07
スフレ様、おっきー様、ひら様、アドバイスありがとうございます。

まとめレスで失礼します。

> 認証を使わない場合は、クライアントのIPアドレスしか識別に使える情報はないでしょう。
ありがとうございます。
上記記載がどこにもなかったので、「何でだろう???」とずっと疑問に思っていました。

> 工数が少なければ、ログイン機能でもOKなんですね?
前提条件としてはそうなのですが、他にも色々と制約が。。。
・サーバは他のアプリケーションもおいてあるので、設定はあまり変えたくない

・何より余計な手間が増える嫌がられる ( 全社員 ( 4000人? ) が使用出来るシステムなので )
( いや、ログインは大事な機能なんですけどね。 PC に詳しく無い人もやっぱりいるので。。。 )

・これは想定なのですが、ログイン機能の追加、って事は「このセッションの ID のユーザ名は○○」などの情報を
持ちまわる必要があるんですよね?
その機能 ( 持ち回る ) が現在無いので、そうすると全ページに情報持ち回りロジックを書くのかなぁ、と。。。
( 認識違っていますか? )

なので、個人的にもログイン機能はつけたいのですが、実現は難しそうです。

> 書き込みから類推するに
推測の通りです。
そして、使用されているブラウザは IE で統一されています。

「LANだから甘くていい」と思ってはいませんが、それは私レベルの話なので(苦笑)
「簡単に実現出来ればそれでいいんじゃん?」と言われてしまいそうな雰囲気だったりもします。

そして、ご提示頂いたので確かにクライアントのマシン名などは取れました!
が、これは「ボタン押下後のアクション」ですよね?
一番最初のトップページに遷移した際、クライアントの情報が欲しいのです。
( URL 直接指定で遷移した場合など )

で、URL 直接指定で遷移すると、 ( 当然だと思うのですが ) サーバの情報が取られます。。。
根本的に何か勘違いしていますか???

貴重なお時間を使ってアドバイスして頂き、非常に感謝しています。
宜しくお願いいたします。

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