Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UDP套接字:recvfrom和接收地址_C++_C_Security_Udp - Fatal编程技术网

C++ UDP套接字:recvfrom和接收地址

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中使用的地址?) 换句话说,如果我们

BSD/POSIX套接字API <代码> RevOf()/Cuth>调用(通过C代码或C++程序员通过<代码> < /Cord>头文件)提供源地址“OUT”参数,<代码> StutoSockAdDR*SrCyADDR< /COD>,它存储了发送收到的数据报的远程服务器的IP地址。 对于将UDP数据报发送到某个远程端点,然后接收响应(例如,DNS解析器)的任何应用程序,始终确保任何接收到的数据报与上次发送的数据报来自同一IP地址是否被视为必要的安全预防措施(即上一次
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