PHP UDP 读取 DNS 推送通知

PHP UDP Read DNS Push Notification

提问人:Firehawk 提问时间:7/1/2023 最后编辑:Firehawk 更新时间:7/2/2023 访问量:24

问:

我正在尝试编写一个必须接收“DNS 推送通知”的 PHP 脚本,RFC8490

我想阅读域名、序列号的软件包,但我不知道是否存在其他信息以及所有其他信息。

收到 UDP 包时没有任何问题:

socket_recvfrom($socket, $udpData, 2048, 0, $remoteAddress, $remotePort);

现在我想获取可读信息$updData,我已经设法使用以下脚本获取域名:

// Unpack the UDP data
    $unpackedData = unpack('ntransaction_id/nflags/nqdcount/nancount/nnscount/narcount', $udpData);

    // Extract the domain name from the UDP data
    $pointer = 12; // Start position of the domain name in the UDP data

    // Iterate over the labels in the domain name
    while ($udpData[$pointer] !== "\x00") {
        $labelLength = ord($udpData[$pointer]);
        $label = substr($udpData, $pointer + 1, $labelLength);
        $domainName .= $label . '.';
        $pointer += $labelLength + 1;
    }
    $domainName = rtrim($domainName, '.');

还没有找到如何获取DNS推送通知的序列号,如果其他我想获取这些序列号。

有人可以帮我解决这个问题吗?

我到处寻找解决方案,但直到现在还没有找到。

串行应适用于:

// Skip the domain name to reach the Answer section
$pointer += strlen(substr($udpData, $pointer)) + 5;

// Extract the serial number from the Answer section
$serialNumber = unpack('N', substr($udpData, $pointer + 20, 4))[1];

// Output the serial number
echo "Serial Number: " . $serialNumber . "\n";

但这不起作用,无法从通知中获取正确的序列号。

示例数据:

$udpData = 'O5gkAAABAAEAAAAACnRlc3Rkb21laW4CbmwAAAYAAcAMAAYAAQAAAAAANARuczAxCGlzcGNsb3VkwBcGbm90aWZ5BmlzcHdlYsAXeJWZ4wAAqMAAABwgACTqAAAABwg=';
$udpData=base64_decode($udpData);
php dns udp 通知

评论

0赞 hakre 7/1/2023
您应该为示例提供输入数据,因为网络交互性是不可重现的(当您询问 SO 上的代码时,请为实际编程问题创建一个最小的可重现示例)。
0赞 Firehawk 7/1/2023
如何将$udpData保存到可以作为示例数据生成的字符串中?
0赞 hakre 7/1/2023
将其编码为 base64:使用 base64_encode() 函数 php.net/manual/en/function.base64-encode.php,然后var_export() 它。这样,你就可以很容易地把它变成一个只需要base64_decode()的变量——配对函数——然后就很容易把它作为一个例子(和一个测试用例)。(字符串在 PHP 中是二进制的,以防万一,如果您想知道,这与 unpack() 等兼容)

答: 暂无答案