J'essaie de me connecter à un service caché Tor en utilisant le code PHP suivant:
$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);
Lorsque je l'exécute, j'obtiens l'erreur suivante:
Impossible de résoudre le nom d'hôte
Cependant, lorsque j'exécute la commande suivante à partir de ma ligne de commande dans Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Je reçois une réponse comme prévu
La documentation PHP cURL dit ceci:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Je crois que la raison pour laquelle cela fonctionne à partir de la ligne de commande est que Tor (le proxy) résout le nom d'hôte .onion, qu'il reconnaît. Lors de l'exécution du code PHP ci-dessus, je suppose que cURL ou PHP essaie de résoudre le nom d'hôte .onion et ne le reconnaît pas. J'ai cherché un moyen de dire à cURL / PHP de laisser le proxy résoudre le nom d'hôte, mais je ne trouve pas de moyen.
Il y a une question de débordement de pile très similaire, la demande cURL utilisant le proxy socks5 échoue lors de l'utilisation de PHP, mais cela fonctionne via la ligne de commande .
forward-socks5 / localhost:9150 .
Essayez d'ajouter ceci:
la source
TL; DR: paramétré
CURLOPT_PROXYTYPE
pour utiliserCURLPROXY_SOCKS5_HOSTNAME
si vous avez un PHP moderne, la valeur7
sinon, et / ou corriger laCURLOPT_PROXY
valeur.Comme vous l'avez correctement déduit, vous ne pouvez pas résoudre les
.onion
domaines via le système DNS normal, car il s'agit d' un domaine de premier niveau réservé spécifiquement pour une utilisation par Tor et ces domaines par conception n'ont aucune adresse IP à mapper.L'utilisation
CURLPROXY_SOCKS5
dirigera la commande cURL pour envoyer son trafic vers le proxy, mais ne fera pas de même pour la résolution des noms de domaine. Les requêtes DNS, qui sont émises avant que cURL ne tente d'établir la connexion réelle avec le site Onion, seront toujours envoyées au résolveur DNS normal du système. Ces demandes DNS échoueront sûrement, car le résolveur DNS normal du système ne saura pas quoi faire avec une.onion
adresse à moins qu'il ne transmette également spécifiquement ces requêtes à Tor.Au lieu de
CURLPROXY_SOCKS5
, vous devez utiliserCURLPROXY_SOCKS5_HOSTNAME
. Alternativement, vous pouvez également utiliserCURLPROXY_SOCKS4A
, mais SOCKS5 est de loin préféré. L'un ou l'autre de ces types de proxy informe cURL d'effectuer à la fois ses recherches DNS et son transfert de données réel via le proxy. Cela est nécessaire pour résoudre avec succès n'importe quel.onion
domaine.Il y a également deux erreurs supplémentaires dans le code de la question d'origine qui n'ont pas encore été corrigées par les commentateurs précédents. Ceux-ci sont:
Voici le code correct dans son intégralité, avec des commentaires pour indiquer les changements.
Vous pouvez également omettre
CURLOPT_PROXYTYPE
complètement le paramètre en modifiant laCURLOPT_PROXY
valeur pour inclure lesocks5h://
préfixe:la source