¿Cómo puedo conectarme a un servicio oculto de Tor usando cURL en PHP?
Estoy intentando conectarme a un servicio oculto de Tor usando el siguiente código 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);
Cuando lo ejecuto, aparece el siguiente error:
No se pudo resolver el nombre del host
Sin embargo, cuando ejecuto el siguiente comando desde mi línea de comando en Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Recibo una respuesta como se esperaba.
La documentación de PHP cURL dice esto:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Creo que la razón por la que funciona desde la línea de comandos es porque Tor (el proxy) está resolviendo el nombre de host .onion, que reconoce. Al ejecutar el código PHP anterior, supongo que cURL o PHP están intentando resolver el nombre de host .onion y no lo reconocen. He buscado una manera de decirle a cURL/PHP que permita que el proxy resuelva el nombre de host, pero no puedo encontrarla.
Hay una pregunta de desbordamiento de pila muy similar: la solicitud de cURL que usa el proxy calcetines5 falla cuando se usa PHP, pero funciona a través de la línea de comando .
Es necesario configurar la CURLOPT_PROXYTYPE
opción paraCURLPROXY_SOCKS5_HOSTNAME
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
CURLPROXY_SOCKS5_HOSTNAME
se define a partir de PHP 5.6.10 . Si está utilizando una versión anterior, puede utilizar explícitamente su valor 7
:
curl_setopt($ch, CURLOPT_PROXYTYPE, 7);
Utilizo Privoxy y cURL para extraer páginas Tor:
<?php
$ch = curl_init('http://jhiwjjlqpyawmpjx.onion'); // Tormail URL
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, "localhost:8118"); // Default privoxy port
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_exec($ch);
curl_close($ch);
?>
Después de instalar Privoxy, debe agregar esta línea al archivo de configuración ( /etc/privoxy/config
). Tenga en cuenta el espacio y '.' al final de la línea.
forward-socks4a / localhost:9050 .
Luego reinicie Privoxy.
/etc/init.d/privoxy restart
Intenta agregar esto:
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);