gpt4 book ai didi

php - PHP中的原始套接字DNS请求

转载 作者:行者123 更新时间:2023-12-03 12:00:29 25 4
gpt4 key购买 nike

<?php

$domain = 'www.google.com';
$dns = '8.8.8.8';
$timeout = 2;

$data = rand(10, 77) . "\0\0\0\0\1\0\0\0\0\0";
$data .= pack('n', '1') . pack('n', '0') . pack('n', '0') . pack('n', '0');

foreach (explode('.', $domain) as $bit) {
$l = strlen($bit);
$data .= chr($l) . $bit;
}

$data .= "\0\0" . pack('n', '2') . pack('n', '1');

$errno = $errstr = 0;
$fp = fsockopen('udp://' . $dns, 53, $errno, $errstr, $timeout);
if (!$fp || !is_resource($fp)) return $errno;

socket_set_timeout($fp, $timeout);
fwrite($fp, $data);

var_dump ( fread($fp, 8192) );
fclose($fp);

这是我一直试图开始工作的代码。这是dns查找 http://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/的C实现的摘要。我看不到我在PHP中错过的东西。

至于使用dns_get_records,这是可行的,但是它没有超时,这对我来说是非常糟糕的,因为我将要处理许多查找/秒。这是我的解决方案 $lookup = shell_exec('dig "' . $cleaned_host . '." -t ANY +nomultiline +nocomments +nonssearch +tcp +nostats +qr +time=1');,但是即使进行了改进,性能仍然是dns_get_records速度的两倍以上,这对我的情况非常不利。因此,我尝试与DNS服务器进行原始套接字连接,并假设其速度将与dns_get_records的速度相同。

一种替代方法是通过ini_set(例如default_socket_timeout)限制dns_get_records函数,但我找不到任何可以使用的函数。

更好的解决方案(将与脚本的其余部分一起使用)将是获取cURL dns缓存。

最佳答案

通常,您未能发现的是C代码使用了9个单独的位域,这些域将DNS header 标志打包到一个16位单字段中,而您尝试附加9个单独的字节。

您应该只在随机查询ID之后添加pack('n', 0x0100),以便设置RD(需要递归)位。

另外,您应该仅在域名后附加一个\0来表示结尾的“根”标签,或者确保您提供的每个域名都已经有一个结尾点,以便explode函数可以为您工作。此代码有效:

$domain = 'www.google.com.';
$dns = '8.8.8.8';
$timeout = 2;

$data = pack('n6', rand(10, 77), 0x0100, 1, 0, 0, 0);

foreach (explode('.', $domain) as $bit) {
$l = strlen($bit);
$data .= chr($l) . $bit;
}

$data .= pack('n2', 2, 1); // QTYPE=NS, QCLASS=IN

不要忘了引用 RFC 1035来学习如何正确解码响应!

关于php - PHP中的原始套接字DNS请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24965134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com