C++ UDP套接字:recvfrom和接收地址
BSD/POSIX套接字API <代码> RevOf()/Cuth>调用(通过C代码或C++程序员通过<代码> < /Cord>头文件)提供源地址“OUT”参数,<代码> StutoSockAdDR*SrCyADDR< /COD>,它存储了发送收到的数据报的远程服务器的IP地址。 对于将UDP数据报发送到某个远程端点,然后接收响应(例如,DNS解析器)的任何应用程序,始终确保任何接收到的数据报与上次发送的数据报来自同一IP地址是否被视为必要的安全预防措施(即上一次C++ UDP套接字:recvfrom和接收地址,c++,c,security,udp,C++,C,Security,Udp,BSD/POSIX套接字API RevOf()/Cuth>调用(通过C代码或C++程序员通过 < /Cord>头文件)提供源地址“OUT”参数, StutoSockAdDR*SrCyADDR< /COD>,它存储了发送收到的数据报的远程服务器的IP地址。 对于将UDP数据报发送到某个远程端点,然后接收响应(例如,DNS解析器)的任何应用程序,始终确保任何接收到的数据报与上次发送的数据报来自同一IP地址是否被视为必要的安全预防措施(即上一次sendtocall中使用的地址?) 换句话说,如果我们
sendto
call中使用的地址?)
换句话说,如果我们调用sendto
并将数据报发送到某个地址,我们是否应该始终确保相应的recvfrom
调用来自同一地址
考虑到如果远程服务器位于防火墙后面,或者某个具有多个IP地址的分布式系统的一部分,则响应数据报可能合法地来自不同的IP,这似乎是不可行的
但是,如果我们不验证接收到的数据报是否与上次
sendto
调用的地址来自同一IP地址,那么如何防止攻击者截获数据报,然后向客户端发送恶意数据报呢?一些NAT支持UDP打孔,这也正是您提到的IP验证,所以它需要在应用程序中没有必要这样做
对于自定义协议,您可能希望在有效负载中实现某种序列号,以进一步提高安全级别。一些NAT支持UDP打孔,也可以完全执行您提到的IP验证,因此无需在应用程序中执行此操作
对于自定义协议,您可能希望在有效负载中实现某种序列号,以进一步提高安全级别。您如何知道接收到的数据包是应答?通常使用接收到的数据包的源地址和端口来完成 但是,无法验证UDP数据包中的源地址。发送方可以放置他们想要的任何源地址。因此,只有当您信任internet上浮动的所有数据包时,检查才足够,这显然是不可行的
因此,您需要一些额外的机制:随机cookie、序列号等。您如何知道接收到的数据包是一个应答?通常这是使用接收到的数据包的源地址和端口来完成的 但是,无法验证UDP数据包中的源地址。发送方可以放置他们想要的任何源地址。因此,只有当您信任internet上浮动的所有数据包时,检查才足够,这显然是不可行的
因此,您需要一些额外的机制:随机cookie、序列号等。在一般情况下,任意接收的数据报不是对先前请求的响应。您必须过滤,例如通过
connect(),
以确保您只处理响应。在一般情况下,任意接收的数据报不是对上一个请求的响应。您必须过滤,例如通过connect(),
以确保您只处理响应
对于向某个远程端点发送UDP数据报,然后接收响应的任何应用程序(例如,DNS解析器)
你可以使用一个随机的出站端口号
始终确保任何接收到的数据报来自与上次发送的数据报相同的IP地址(即前一个sendto呼叫中使用的地址),这是否被视为必要的安全预防措施
换句话说,如果我们调用sendto并向某个地址发送数据报,我们是否应该始终确保相应的recvfrom调用来自同一地址
不仅是为了安全,也是为了功能。如果您有多个出站连接,您需要知道每个连接对应哪些UDP应答。这可以通过远程端的IP地址和端口组合来实现
考虑到一项回应,这似乎不可行
如果
远程服务器位于防火墙后面,或某些分布式系统的一部分
具有多个IP地址
远程系统应通过接收回复的同一接口发送回复。否则,它将是“非标准”的,无法与您的应用程序或其他需要接收和回复UDP数据包的应用程序一起工作
但是,如果我们不验证接收到的数据报是否来自同一IP
地址作为上次sendto呼叫的地址,需要防止什么
一些攻击者拦截数据报,然后发送恶意消息
向客户端发送数据报
什么都没有。如果攻击者可以MITM UDP连接,那么他们可以拦截和更改任何他们想要的。他们可以只向您的服务发送带有伪造IP地址的UDP数据包
如果需要保持数据包的完整性和机密性,则需要实现某种加密。例如,如果需要支持数据报,请检查
对于向某个远程端点发送UDP数据报,然后接收响应的任何应用程序(例如,DNS解析器)
你可以使用一个随机的出站端口号
始终确保任何接收到的数据报来自与上次发送的数据报相同的IP地址(即前一个sendto呼叫中使用的地址),这是否被视为必要的安全预防措施
换句话说,如果我们调用sendto并向某个地址发送数据报,我们是否应该始终确保相应的recvfrom调用来自同一地址
不仅是为了安全,也是为了功能。如果您有多个outboun