Próbuję połączyć się z usługą ukrytą Tora za pomocą następującego kodu 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);
Po uruchomieniu pojawia się następujący błąd:
Nie można rozpoznać nazwy hosta
Jednak po uruchomieniu następującego polecenia z wiersza polecenia w systemie Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Otrzymuję odpowiedź zgodnie z oczekiwaniami
Dokumentacja PHP cURL mówi:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Uważam, że powodem, dla którego działa z wiersza poleceń, jest to, że Tor (proxy) rozwiązuje nazwę hosta .onion, którą rozpoznaje. Kiedy uruchamiam powyższy kod PHP, domyślam się, że cURL lub PHP próbuje rozwiązać nazwę hosta .onion i nie rozpoznaje go. Szukałem sposobu, aby cURL / PHP pozwolił proxy rozpoznać nazwę hosta, ale nie mogę znaleźć sposobu.
Istnieje bardzo podobne pytanie o przepełnienie stosu, żądanie cURL przy użyciu proxy socks5 kończy się niepowodzeniem podczas korzystania z PHP, ale działa przez wiersz poleceń .
forward-socks5 / localhost:9150 .
Spróbuj dodać to:
źródło
TL; DR: Ustaw,
CURLOPT_PROXYTYPE
aby użyć,CURLPROXY_SOCKS5_HOSTNAME
jeśli masz nowoczesny PHP, w7
przeciwnym razie wartość i / lub poprawCURLOPT_PROXY
wartość.Jak prawidłowo wywnioskowałeś, nie możesz rozpoznać
.onion
domen za pomocą normalnego systemu DNS, ponieważ jest to zarezerwowana domena najwyższego poziomu przeznaczona specjalnie do użytku przez Tora, a takie domeny z założenia nie mają adresów IP, na które można by mapować.Użycie
CURLPROXY_SOCKS5
spowoduje skierowanie polecenia cURL do wysłania ruchu do serwera proxy, ale nie zrobi tego samego w przypadku rozpoznawania nazw domen. Żądania DNS, które są wysyłane, zanim cURL spróbuje ustanowić faktyczne połączenie z witryną Onion, nadal będą wysyłane do normalnego systemu rozpoznawania nazw DNS w systemie. Te żądania DNS z pewnością się nie powiodą, ponieważ normalny system rozpoznawania nazw DNS w systemie nie będzie wiedział, co zrobić z.onion
adresem, chyba że on również specjalnie przekieruje takie zapytania do Tora.Zamiast tego
CURLPROXY_SOCKS5
musisz użyćCURLPROXY_SOCKS5_HOSTNAME
. Możesz także użyćCURLPROXY_SOCKS4A
, ale SOCKS5 jest znacznie bardziej preferowany. Każdy z tych typów proxy informuje cURL, aby przeprowadzał zarówno wyszukiwanie DNS, jak i faktyczny transfer danych przez proxy. Jest to wymagane do pomyślnego rozwiązania dowolnej.onion
domeny.Istnieją również dwa dodatkowe błędy w kodzie w pierwotnym pytaniu, które nie zostały jeszcze naprawione przez poprzednich komentujących. To są:
Oto poprawny kod w całości z komentarzami wskazującymi zmiany.
Możesz także
CURLOPT_PROXYTYPE
całkowicie pominąć ustawienie , zmieniającCURLOPT_PROXY
wartość tak, aby zawierałasocks5h://
prefiks:źródło