Estou tentando conectar-me a um serviço oculto do Tor usando o seguinte 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);
Quando o executo, recebo o seguinte erro:
Não foi possível resolver o nome do host
No entanto, quando executo o seguinte comando na minha linha de comando no Ubuntu:
curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion
Eu recebo uma resposta como esperado
A documentação do PHP cURL diz o seguinte:
--socks5-hostname
Use the specified SOCKS5 proxy (and let the proxy resolve the host name).
Eu acredito que o motivo pelo qual ele funciona na linha de comando é porque o Tor (o proxy) está resolvendo o nome de host .onion, que ele reconhece. Ao executar o código PHP acima, meu palpite é que cURL ou PHP está tentando resolver o nome de host .onion e não o reconhece. Procurei uma maneira de dizer ao cURL / PHP para permitir que o proxy resolvesse o nome do host, mas não consigo encontrar uma maneira.
Há uma pergunta muito semelhante ao Stack Overflow, a solicitação cURL usando o proxy socks5 falha ao usar o PHP, mas funciona através da linha de comando .
forward-socks5 / localhost:9150 .
Tente adicionar isto:
fonte
TL; DR: defina
CURLOPT_PROXYTYPE
para usarCURLPROXY_SOCKS5_HOSTNAME
se você tiver um PHP moderno,7
caso contrário o valor e / ou corrija oCURLOPT_PROXY
valor.Como você deduziu corretamente, não é possível resolver
.onion
domínios pelo sistema DNS normal, porque esse é um domínio de nível superior reservado especificamente para uso do Tor e esses domínios por design não têm endereços IP para os quais mapear.O uso
CURLPROXY_SOCKS5
direcionará o comando cURL para enviar seu tráfego ao proxy, mas não fará o mesmo para a resolução de nomes de domínio. As solicitações de DNS, que são emitidas antes que o cURL tente estabelecer a conexão real com o site Onion, ainda serão enviadas ao resolvedor de DNS normal do sistema. Essas solicitações de DNS certamente falharão, porque o resolvedor de DNS normal do sistema não saberá o que fazer com um.onion
endereço, a menos que também esteja encaminhando especificamente essas consultas para o Tor.Em vez de
CURLPROXY_SOCKS5
, você deve usarCURLPROXY_SOCKS5_HOSTNAME
. Como alternativa, você também pode usarCURLPROXY_SOCKS4A
, mas o SOCKS5 é muito preferido. Qualquer um desses tipos de proxy informa ao cURL para realizar suas pesquisas de DNS e sua transferência de dados real via proxy. Isso é necessário para resolver com êxito qualquer.onion
domínio.Há também dois erros adicionais no código na pergunta original que ainda precisam ser corrigidos pelos comentaristas anteriores. Esses são:
Aqui está o código correto na íntegra, com comentários para indicar as alterações.
Você também pode omitir
CURLOPT_PROXYTYPE
totalmente a configuração alterando oCURLOPT_PROXY
valor para incluir osocks5h://
prefixo:fonte