Come posso connettermi a un servizio nascosto Tor usando cURL in PHP?


366

Sto cercando di connettermi a un servizio nascosto Tor utilizzando il seguente codice 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 lo eseguo, viene visualizzato il seguente errore:

Impossibile risolvere il nome host

Tuttavia, quando eseguo il seguente comando dalla mia riga di comando in Ubuntu:

curl -v --socks5-hostname localhost:9050 http://jhiwjjlqpyawmpjx.onion

Ricevo una risposta come previsto

La documentazione PHP cURL dice questo:

--socks5-hostname
Use  the  specified  SOCKS5 proxy (and let the proxy resolve the host name).

Credo che il motivo per cui funziona dalla riga di comando sia perché Tor (il proxy) sta risolvendo il nome host .onion, che riconosce. Quando eseguo il codice PHP sopra, suppongo che cURL o PHP stiano cercando di risolvere il nome host .onion e non lo riconoscono. Ho cercato un modo per dire a cURL / PHP di consentire al proxy di risolvere il nome host, ma non riesco a trovare un modo.

C'è una domanda Stack Overflow molto simile, la richiesta cURL che usa il proxy socks5 fallisce quando si usa PHP, ma funziona attraverso la riga di comando .

Risposte:



21

Uso Privoxy e cURL per raschiare pagine 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);
?>

Dopo aver installato Privoxy è necessario aggiungere questa riga al file di configurazione ( /etc/privoxy/config). Nota lo spazio e '.' a fine linea.

forward-socks4a / localhost:9050 .

Quindi riavviare Privoxy.

/etc/init.d/privoxy restart

Questo funziona! Testato su Windows 10 e CentOS 6, anche se Tor utilizza Socks 5 invece di Socks 4, usa questo:forward-socks5 / localhost:9150 .
David Refoua,

ho bisogno di TOR e Privoxy entrambi per far funzionare tutto questo? grazie

8

Prova ad aggiungere questo:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

5

TL; DR: impostato CURLOPT_PROXYTYPEper l'uso CURLPROXY_SOCKS5_HOSTNAMEse si dispone di un PHP moderno, il valore 7altrimenti e / o il CURLOPT_PROXYvalore corretto .

Come correttamente dedotto, non è possibile risolvere .oniondomini tramite il normale sistema DNS, poiché si tratta di un dominio di primo livello riservato specificamente utilizzato da Tor e tali domini di progettazione non hanno indirizzi IP su cui mappare.

L'utilizzo CURLPROXY_SOCKS5indirizzerà il comando cURL per inviare il proprio traffico al proxy, ma non farà lo stesso per la risoluzione dei nomi di dominio. Le richieste DNS, che vengono emesse prima che cURL tenti di stabilire la connessione effettiva con il sito Onion, verranno comunque inviate al normale risolutore DNS del sistema. Queste richieste DNS falliranno sicuramente, perché il normale risolutore DNS del sistema non saprà cosa fare con un .onionindirizzo a meno che anch'esso non stia specificatamente inoltrando tali richieste a Tor.

Invece di CURLPROXY_SOCKS5, devi usare CURLPROXY_SOCKS5_HOSTNAME. In alternativa, puoi anche usare CURLPROXY_SOCKS4A, ma SOCKS5 è molto preferito. Uno di questi tipi di proxy informa cURL di eseguire sia le sue ricerche DNS sia il suo effettivo trasferimento di dati tramite il proxy. Questo è necessario per risolvere con successo qualsiasi .oniondominio.

Ci sono anche altri due errori nel codice nella domanda originale che devono ancora essere corretti dai commentatori precedenti. Questi sono:

  • Punto e virgola mancante alla fine della riga 1.
  • Il valore dell'indirizzo proxy è impostato su un URL HTTP, ma il suo tipo è SOCKS; questi sono incompatibili. Per i proxy SOCKS, il valore deve essere una combinazione di nome IP e nome dominio e numero porta senza uno schema / protocollo / prefisso.

Ecco il codice corretto per intero, con commenti per indicare le modifiche.

<?php
$url = 'http://jhiwjjlqpyawmpjx.onion/'; // Note the addition of a semicolon.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:9050"); // Note the address here is just `IP:port`, not an HTTP URL.
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME); // Note use of `CURLPROXY_SOCKS5_HOSTNAME`.
$output = curl_exec($ch);
$curl_error = curl_error($ch);
curl_close($ch);

print_r($output);
print_r($curl_error);

Puoi anche omettere CURLOPT_PROXYTYPEcompletamente l' impostazione modificando il CURLOPT_PROXYvalore per includere il socks5h://prefisso:

// Note no trailing slash, as this is a SOCKS address, not an HTTP URL.
curl_setopt(CURLOPT_PROXY, 'socks5h://127.0.0.1:9050');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.