【问题标题】:How to check if client is connected to another port in C#如何检查客户端是否连接到C#中的另一个端口
【发布时间】:2015-02-19 04:32:53
【问题描述】:

我用 C# 编写了一个程序,服务器正在侦听端口 9000 和 9001。客户端必须使用用户名连接到 9000 端口。如果用户名正确,则它必须连接到 9001 才能发送消息,但必须保持连接到 9000 端口。我做了这部分,但我不知道如何检查连接到 9001 端口的客户端是否与正在侦听 9000 端口的客户端相同。

如何判断连接到9001的客户端是否是9000端口用户名正确的客户端?

【问题讨论】:

  • Socket.RemoteEndPoint 将是相同的。
  • 客户端是指IP地址还是创建第一个连接的进程?您可能知道,一台设备(UNIX、Windows)可以启动多个进程来做同样的事情。如果是第一种情况,那么您可以检查 IP,但是,在第二种情况下,您需要传递客户端必须在端口 9001 使用的唯一(整数或密码)令牌。这只是其他技术中的一个想法。
  • @HansPassant:IP 地址可能相同(但具有多个网络适配器的计算机可以为每个连接使用不同的适配器),但端口不会是相同的。此外,在 NAT 路由器后面,您甚至可以处理不同的客户端计算机,它们似乎都来自同一个 IP 地址。
  • 一场地震可能会将加利福尼亚倾倒到太平洋中,使 IP 数据包通过朝鲜路由器重新路由,取而代之的是微笑的金正恩的数字化照片。那么,最好回显一个加密的令牌。
  • @HansPassant:我真的不明白你的意思。你是说你从未听说过有两个不同的客户端从同一个 IP 地址连接到同一个 FTP 服务器吗?您是说您认为客户端 可以 使用与第一次连接相同的端口进行第二次连接吗?你似乎暗示这里的任何担忧都是荒谬和想象的,但事实并非如此。而且“Socket.RemoteEndPoint 将是相同的”甚至根本不是 true。端点的 IP 地址可以是,但端口肯定不会

标签: c# sockets port


【解决方案1】:

您无法从连接本身确定连接到端口 9001 的远程端点与连接到端口 9000 的远程端点相同。您必须通过端口 9000 上的连接发出某种令牌,因为客户端显示在端口 9001 上进行身份验证。

请注意,如果您没有在连接上使用加密,那么这本身并不会真正提供太多的安全性。假设网络上没有敌对实体,这将是一种关联两个端口上的连接的方法。但是任何时候监视连接的人都可以简单地拦截令牌并使用它自己连接到第二个端口。

请参阅 FTP 规范并浏览网络以了解与 FTP 相关的安全问题,尤其是其PASV 模式。在“主动”模式下,FTP 连接到客户端正在侦听的端口;但这与各种防火墙、代理和 NAT 路由器(所有这些都倾向于干扰或完全阻止客户端接收入站连接请求的能力)发生冲突。

FTP 规范通过引入“被动”(PASV) 模式“解决”了这个问题,但这会产生您将在此处遇到的相同基本问题:服务器只是告诉客户端使用哪个端口数据连接,攻击者可以监视或预测此响应(因为 FTP 服务器中的非随机行为),并在客户端之前自己连接到端口。

这是我发现的一篇有趣的文章,讨论了与 FTP PASV 模式相关的安全问题,在您的场景中与此类似:PASV security and PORT security

因此,在处理此问题时,您首先需要确定所需的安全级别。坦率地说,如果您需要真正安全的连接,您应该在为该用户使用的每个连接上对用户进行身份验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2012-11-12
    • 2015-08-04
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多