Я пытаюсь подключиться к скрытому сервису Tor, используя следующий код PHP:
$url = 'http://jhiwjjlqpyawmpjx.onion/'
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:9050/");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);
print_r($output);
print_r($curl_error);
Когда я запускаю его, я получаю следующую ошибку:
Не удалось разрешить имя хоста
Однако, когда я запускаю следующую команду из моей командной строки в Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Я получаю ответ, как и ожидалось
Документация PHP cURL гласит:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Я считаю, что причина, по которой он работает из командной строки, заключается в том, что Tor (прокси-сервер) разрешает имя хоста .onion, которое он распознает. Когда я запускаю код PHP выше, я предполагаю, что cURL или PHP пытаются определить имя хоста .onion и не распознают его. Я искал способ сказать cURL / PHP, чтобы прокси разрешил имя хоста, но я не могу найти способ.
Существует очень похожий вопрос переполнения стека: запрос cURL с использованием прокси socks5 не выполняется при использовании PHP, но он работает через командную строку .
forward-socks5 / localhost:9150 .
Попробуйте добавить это:
источник
TL; DR: установите
CURLOPT_PROXYTYPE
для использования,CURLPROXY_SOCKS5_HOSTNAME
если у вас есть современный PHP, в7
противном случае значение и / или исправьтеCURLOPT_PROXY
значение.Как вы правильно поняли, вы не можете разрешить
.onion
домены через обычную систему DNS, потому что это зарезервированный домен верхнего уровня, специально предназначенный для использования Tor, и такие домены по своей конструкции не имеют IP-адресов для сопоставления.Использование
CURLPROXY_SOCKS5
будет направлять команду cURL для отправки своего трафика на прокси, но не будет делать то же самое для разрешения доменного имени. Запросы DNS, которые отправляются до того, как cURL попытается установить фактическое соединение с сайтом Onion, будут по-прежнему отправляться обычному преобразователю DNS системы. Эти DNS-запросы, несомненно, будут терпеть неудачу, потому что обычный системный DNS-распознаватель не будет знать, что делать с.onion
адресом, если он также не будет специально направлять такие запросы в Tor.Вместо этого
CURLPROXY_SOCKS5
вы должны использоватьCURLPROXY_SOCKS5_HOSTNAME
. Кроме того, вы также можете использоватьCURLPROXY_SOCKS4A
, но SOCKS5 гораздо предпочтительнее. Любой из этих типов прокси информирует cURL о выполнении поиска DNS и фактической передачи данных через прокси. Это необходимо для успешного разрешения любого.onion
домена.В исходном вопросе есть также две дополнительные ошибки в коде, которые еще не были исправлены предыдущими комментаторами. Эти:
Вот правильный код в полном объеме, с комментариями, чтобы указать изменения.
Вы также можете
CURLOPT_PROXYTYPE
полностью пропустить настройку , изменивCURLOPT_PROXY
значение, включивsocks5h://
префикс:источник