Ich versuche, mit dem folgenden PHP-Code eine Verbindung zu einem versteckten Tor-Dienst herzustellen:
$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);
Wenn ich es ausführe, wird folgende Fehlermeldung angezeigt:
Hostname konnte nicht aufgelöst werden
Wenn ich jedoch den folgenden Befehl über meine Befehlszeile in Ubuntu ausführe:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Ich bekomme wie erwartet eine Antwort
In den PHP cURL- Dokumentationen heißt es:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Ich glaube, der Grund, warum es über die Befehlszeile funktioniert, ist, dass Tor (der Proxy) den .onion-Hostnamen auflöst, den er erkennt. Wenn Sie den obigen PHP-Code ausführen, vermute ich, dass cURL oder PHP versucht, den .onion-Hostnamen aufzulösen, und ihn nicht erkennt. Ich habe nach einer Möglichkeit gesucht, cURL / PHP anzuweisen, dass der Proxy den Hostnamen auflösen soll, aber ich kann keinen Weg finden.
Es gibt eine sehr ähnliche Frage zum Stapelüberlauf : Die cURL-Anforderung mit dem socks5-Proxy schlägt bei Verwendung von PHP fehl, funktioniert jedoch über die Befehlszeile .
forward-socks5 / localhost:9150 .
Versuchen Sie Folgendes hinzuzufügen:
quelle
TL; DR: Wird
CURLOPT_PROXYTYPE
verwendet,CURLPROXY_SOCKS5_HOSTNAME
wenn Sie ein modernes PHP haben, den Wert7
anderweitig und / oder denCURLOPT_PROXY
Wert korrigieren .Wie Sie richtig festgestellt haben, können Sie
.onion
Domains nicht über das normale DNS-System auflösen , da dies eine reservierte Top-Level-Domain ist, die speziell für die Verwendung durch Tor vorgesehen ist und solche Domains keine IP-Adressen haben, denen sie zugeordnet werden können.Mit
CURLPROXY_SOCKS5
wird der Befehl cURL angewiesen, seinen Datenverkehr an den Proxy zu senden, bei der Auflösung von Domänennamen jedoch nicht . Die DNS-Anforderungen, die ausgegeben werden, bevor cURL versucht, die tatsächliche Verbindung mit der Onion-Site herzustellen, werden weiterhin an den normalen DNS-Resolver des Systems gesendet. Diese DNS-Anforderungen werden sicherlich fehlschlagen, da der normale DNS-Resolver des Systems nicht weiß, was mit einer.onion
Adresse zu tun ist, es sei denn, er leitet solche Anfragen speziell an Tor weiter.Stattdessen
CURLPROXY_SOCKS5
müssen Sie verwendenCURLPROXY_SOCKS5_HOSTNAME
. Alternativ können Sie auch verwendenCURLPROXY_SOCKS4A
, aber SOCKS5 wird sehr bevorzugt. Jeder dieser Proxy-Typen weist cURL an, sowohl die DNS-Suche als auch die tatsächliche Datenübertragung über den Proxy durchzuführen. Dies ist erforderlich, um eine.onion
Domain erfolgreich aufzulösen .Es gibt auch zwei zusätzliche Fehler im Code in der ursprünglichen Frage, die von früheren Kommentatoren noch korrigiert werden müssen. Diese sind:
Hier ist der korrekte Code mit Kommentaren zur Angabe der Änderungen.
Sie können die Einstellung auch
CURLOPT_PROXYTYPE
ganz weglassen, indem Sie denCURLOPT_PROXY
Wert so ändern , dass er dassocks5h://
Präfix enthält:quelle