2017-11-10 10 views
0

実際にHTTPサーバーとして機能し、ローカルホストからの接続のみを受け付けるTCPサービスを開発しました。このクライアントマシンのブラウザで実行されるJavaScriptの一部のWebアプリケーションは、AJAXを使用してこのサービスにリクエストして、JavaScriptアプリケーション(ハードウェアリソースへのアクセスなど)から通常禁止されるいくつかの高度な処理を実行できます。ファイン。TCPサービスへのアクセスを現在のユーザーセッションに限定する

複数のユーザーが同じマシンにログオンしている場合(高速ユーザー切り替えを使用する場合、またはこのシステムをWindowsサーバーで使用する場合など)、TCPサービスの複数のインスタンスが実行されている必要があります。私はそれを指定された範囲内の動的TCPポートにバインドし、JavaScriptからポーリングして、バインドされているポートを見つけることができます。しかし、クライアントが同じユーザーセッションに対応するTCPサービスインスタンスに接続することを保証する方法を理解できません。

ローカルサービスから、同じユーザーセッションに属するピアだけが接続できることを確認するにはどうすればよいですか。 (クライアントアプリケーションと私のサービスが同じマシン上で動作していることが分かっている)

私はいくつかのアイデアがありますが、実際には何も分かりません。peer PIDを推測し、クライアントプロセスが動作しているセッションを確認してください(ProcessIdToSessionIdを使用して)オンにします。しかし、それは少し複雑に思えます。または、同じセッション(またはユーザー)からのプロセスのみが接続できるようにWSASetSocketSecurityソースを作成します(SOCKET_SECURITY_SETTINGS構造体をどのように埋める必要がありますか?)。

アイデアを歓迎します。主なターゲットはウィンドウですが、答えが他のプラットフォーム(linux、mac OS)に対処すればもっと幸せになれます。

答えて

0

要するに、ソケットを特定のセッションに制限することはできません。確かにポータブルな方法ではありません。ソケットには、バインディングに対する細かい制御レベルがありません。

あなたが実際に行うことができる最も簡単なことは、各リスニングサーバーを、各セッションに固有の異なるIP /ポートのペアにバインドすることです。

少なくとも、WindowsではアクティブなTCP接続(GetTcpTable2()とフレンド)を列挙することができます。 accept()がクライアント接続されたら、そのソケットのIP /ポートペア(getsockname()getpeername())を取得し、それらのペアを含むシステムテーブルの対応するエントリを見つけて所有プロセスIDを見つけ、そのプロセスのセッションIDを照会します(ProcessIdToSessionId())、それを受け入れたサーバープロセスとは異なるセッションに属している場合は、クライアントソケットを切断します。

+0

私は各セッションごとに異なるポートを受信して​​いるサーバーを持っていても大丈夫です。これはすでにそうです。問題は、JavaScriptから、同じセッションに属するサーバーがどのポートにバインドされているかを推測することです。ブラウザで実行されているJavaScript(OSセッションに関する情報の取得は不可能)から多くを行うことはできないため、問題を解決する方法はサーバー側からの可能性が高いと考えました。しかし、クライアント側から問題全体を解決する方法があれば、私はOKです。 – dim

+0

@dimソケットはセッションにバインドされていません。 Javascriptがランダムなポートを発見する唯一の方法は、成功するまですべての可能なポートを試すことです。それ以外の場合、サーバーはJavascriptがアクセスできるポートを公開する必要があります。私は別のアプローチを提案します。セッション固有のサーバーはまったく使用しないでください。グローバルに実行される1つのサーバーを使用し、すべてのセッションを同じサーバーに接続してから、クライアント情報を使用してセッションを識別し、クライアントのセッションにないデータへのアクセスを制限します。 –

関連する問題