将对TCP服务的访问限制为当前用户会话



我开发了一个TCP服务,它实际上充当HTTP服务器,只接受来自localhost的连接。一些基于JavaScript的应用程序在该客户端机器上的浏览器中执行,然后可以使用AJAX向该服务发出请求,以执行一些JavaScript应用程序通常禁止的高级功能(如访问一些硬件资源)。好的

问题是,如果多个用户登录在同一台计算机上(使用快速用户切换,或者如果该系统在windows服务器上使用,…),则应该有多个TCP服务实例在运行。我可以将它绑定到给定范围内的动态TCP端口,并从JavaScript中进行一些轮询,以找到它绑定到的端口。但我不太清楚如何保证客户端最终连接到与同一用户会话对应的TCP服务实例。

如何通过本地服务确保只有属于同一用户会话的对等方才能连接?(知道客户端应用程序和我的服务在同一台机器上运行是夸夸其谈的)

我有一些想法,但没有什么明显的:尝试猜测对等PID,并检查客户端进程正在哪个会话上运行(使用ProcessIdToSessionId)。但这似乎有点复杂。或者,可以制作一些WSASetSocketSecurity酱汁,以确保只有来自同一会话(或用户)的进程才能连接(那么,我应该如何填写SOCKET_SECURITY_SETTINGS结构?)。

欢迎提出任何想法。主要目标是windows,但如果答案指向其他平台(linux、macOS),我会更高兴。

简而言之,不能将套接字限制在特定会话中。当然不是以任何便携的方式。套接字对其绑定没有那么好的控制级别。

真正可以做的最简单的事情是将每个侦听服务器绑定到每个会话唯一的不同IP/端口对。

否则,至少在Windows上,可以枚举活动的TCP连接(GetTcpTable2()和好友)。一旦accept()建立了客户端连接,获取该套接字的IP/端口对(getsockname()getpeername()),在包含这些对的系统表中找到相应的条目,以找到所属进程ID,查询该进程的会话ID(ProcessIdToSessionId()),然后如果客户端套接字属于与接受它的服务器进程不同的会话,则断开客户端套接字的连接。

最新更新