Estoy tratando de 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 de host
Sin embargo, cuando ejecuto el siguiente comando desde mi línea de comandos 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. Cuando ejecuto el código PHP anterior, supongo que cURL o PHP está tratando de resolver el nombre de host .onion y no lo reconoce. He buscado una manera de decirle a cURL / PHP que permita que el proxy resuelva el nombre de host, pero no puedo encontrar una manera.
Hay una pregunta de desbordamiento de pila muy similar, la solicitud cURL que usa el proxy socks5 falla cuando se usa PHP, pero funciona a través de la línea de comando .
forward-socks5 / localhost:9150 .
Intenta agregar esto:
fuente
TL; DR: se establece
CURLOPT_PROXYTYPE
para usarCURLPROXY_SOCKS5_HOSTNAME
si tiene un PHP moderno, el valor de lo7
contrario, y / o corrige elCURLOPT_PROXY
valor.Como dedujo correctamente, no puede resolver
.onion
dominios a través del sistema DNS normal, porque este es un dominio de nivel superior reservado específicamente para su uso por Tor y tales dominios por diseño no tienen direcciones IP para asignar.El uso
CURLPROXY_SOCKS5
dirigirá el comando cURL para enviar su tráfico al proxy, pero no hará lo mismo para la resolución de nombres de dominio. Las solicitudes de DNS, que se emiten antes de que cURL intente establecer la conexión real con el sitio de Onion, aún se enviarán al sistema de resolución de DNS normal del sistema. Estas solicitudes DNS seguramente fallarán, porque el.onion
solucionador DNS normal del sistema no sabrá qué hacer con una dirección a menos que, también, esté enviando específicamente tales consultas a Tor.En lugar de
CURLPROXY_SOCKS5
, debes usarCURLPROXY_SOCKS5_HOSTNAME
. Alternativamente, también puede usarCURLPROXY_SOCKS4A
, pero SOCKS5 es muy preferido. Cualquiera de estos tipos de proxy informa a cURL para realizar sus búsquedas de DNS y su transferencia de datos real a través del proxy. Esto es necesario para resolver con éxito cualquier.onion
dominio.También hay dos errores adicionales en el código en la pregunta original que aún no han sido corregidos por los comentaristas anteriores. Estos son:
Aquí está el código correcto completo, con comentarios para indicar los cambios.
También puede omitir la configuración
CURLOPT_PROXYTYPE
por completo cambiando elCURLOPT_PROXY
valor para incluir elsocks5h://
prefijo:fuente