2012-02-11 14 views
10

Ok, ecco quello che mi serve. Ho un web crawler basato su PHP. http://rz7ocnxxu7ka6ncv.onion/ Ora, il mio problema è che il mio ragno che effettivamente esegue la scansione delle pagine deve farlo su una porta SOCKS 9050. Il fatto è che devo tunnelare la sua connessione attraverso Tor in modo che possa risolvere .onion domini, che è quello che sto indicizzando. (Solo termina con .onion.) Io chiamo questo script dalla riga di comando usando php crawl.php e aggiungo i parametri appropriati per eseguire la scansione della pagina. Ecco cosa penso: Esiste un modo per forzare l'utilizzo di Tor? O posso forzare la mia INTERA MACCHINA a scavare un tunnel attraverso Tor, e come? (Come forzare tutto il traffico attraverso 127.0.0.1:9050) forse se imposto le impostazioni del proxy globale, php le rispetterebbe?Tor Web Crawler

Se una delle mie soluzioni funziona, come dovrei farlo? (Istruzioni passo passo, per favore, sono un noob.)

Voglio solo creare il mio motore di ricerca Tor. (Non consiglio i miei motori di ricerca p2p - non è quello che voglio per questo- so che esistono, ho fatto i miei compiti.) Ecco la fonte del crawler se sei interessato a dare un'occhiata a: Forse qualcuno con un il cuore gentile può modificarlo per utilizzare 127.0.0.1:9050 per tutte le richieste di scansione? http://pastebin.com/kscGJCc5

+0

"Forse se imposto le impostazioni del proxy globale, php le rispetterebbe?" dubbia. Non 'fopen ($ url)'. Usa cURL con 'CURLOPT_PROXY'. Non sono sicuro di come funzionerebbero le ricerche DNS. –

+0

Come faccio? Sono un totale noob in questo. – user1203301

risposta

9

A meno che non manchi qualcosa la risposta è sì, e here is some documentation sul sito Tor. Le istruzioni sono piuttosto specifiche. Anche se non ho impostato Tor come proxy, è qualcosa che ho considerato, questo è il posto in cui iniziare.

MODIFICA: È dead simple per configurare Tor su Linux e utilizzarlo come proxy come suggerisce la documentazione.

sudo apt-get install tor 
sudo /etc/init.d/tor start 

netstat -ant | grep 9050 # verify Tor is running 

Ora, dopo guardando attraverso il codice PO vediamo le chiamate verso file_get_contents. Mentre il metodo più semplice da utilizzare in un primo momento file_get_contents diventa ingombrante quando si desidera iniziare a parametrizzare la richiesta perché è necessario utilizzare stream contexts.

Il primo suggerimento è quello di passare a curl, ma ancora una volta, più lettura su come funziona SOCKS w/HTTP è probabilmente per rispondere veramente a questa domanda ... Ma per rispondere alla domanda tecnicamente, come inviare una richiesta HTTP a un proxy Tor SOCKS su localhost, di nuovo facile ..

<?php 
$ch = curl_init('http://google.com'); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 
curl_setopt($ch, CURLOPT_PROXY, 'https://127.0.01:9050/'); 
curl_exec($ch); 
curl_close($ch); 

Ma cosa ci dice Tor?

HTTP/1.0 501 Tor non è un proxy HTTP

Content-Type: text/html; charset = iso-8859-1

Fondamentalmente, learn more circa CALZINI & HTTP. Un'altra opzione è quella di google around per i client PHP SOCKS. Un'ispezione rapida rivela a library che afferma che può inviare richieste HTTP su SOCKS.

EDIT:

Va bene, 1 altri Cambia!I secondi dopo aver terminato il mio ultimo post, ho trovato un modo per farlo. This article ci mostra come impostare qualcosa chiamato Privoxy, che converte le richieste SOCKS in richieste HTTP. Mettilo davanti a Tor e blamo, inviamo richieste HTTP proxy attraverso Tor!

+0

No, quello non funziona per me .... – user1203301

+2

Sembra che tu abbia qualche lettura da fare ... – quickshiftin

+1

ho letto quell'articolo centinaia di volte nell'ultima settimana. Non funziona, fidati di me. – user1203301

-1

Basta fare Possiedi un proxy HTTP:

<?php 

/** 
* Proxy script that performs any HTTP request requested. 
*/ 

// Check key 
$key = 'YOUR_API_KEY'; 
if($_GET['key'] != $key) die; // Check for the API key 

// Check URL 
$url = isset($_GET['url']) ? trim(base64_decode($_GET['url'])) : ''; 
if(!$url || !filter_var($url, FILTER_VALIDATE_URL)) die; // Incorrect URL 

class MyCurl { 

    /** 
    * CURL resource link 
    * 
    * @var resource 
    */ 
    protected $resource; 

    /** 
    * Constructor 
    * 
    * @param String $host 
    * @return MyCurl 
    */ 
    public function __construct($url = 'localhost'){ 
     $this->resource = curl_init(); 
     $this->setUrl($url); 
     $this->setOptions(array(
//   CURLOPT_RETURNTRANSFER => TRUE, 
      CURLOPT_AUTOREFERER => TRUE, 
      CURLOPT_FOLLOWLOCATION => TRUE, 
      CURLOPT_REFERER => 'http://www.google.com/', 
      CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
      CURLOPT_SSL_VERIFYHOST => FALSE, 
      CURLOPT_SSL_VERIFYPEER => FALSE, 
     )); 
    } 

    /** 
    * Set URL for the next request 
    * 
    * @param String $url 
    */ 
    public function setUrl($url = 'localhost') { 
     $this->setOption(CURLOPT_URL, $url); 
    } 

    /** 
    * Sets option to the CURL resource. 
    * See http://www.php.net/manual/en/function.curl-setopt.php for option description 
    * 
    * @param int $name Option identifier 
    * @param mixed $value Option value 
    * @return Crawler_Curl Returns itself for sugar-code 
    */ 
    public function & setOption($name, $value){ 
     curl_setopt($this->resource, $name, $value); 
     return $this; 
    } 

    /** 
    * Sets multiple CURL options at once 
    * 
    * @param array $options Associative array of options 
    * @return Crawler_Curl Returns itself for sugar-code 
    */ 
    public function & setOptions($options){ 
     curl_setopt_array($this->resource, $options); 
     return $this; 
    } 

    /** 
    * Set User-Agent header of the browser 
    * 
    * @param String $useragent Defaults to Mozilla browser 
    */ 
    public function setUserAgent($useragent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0') { 
     $this->setOption(CURLOPT_USERAGENT, $useragent); 
    } 

    /** 
    * Get curl request info 
    * 
    * @array 
    */ 
    public function info() { 
     return curl_getinfo($this->resource); 
    } 

    /** 
    * Return sent headers if CURLINFO_HEADER_OUT option was enabled 
    * 
    * @return String Headers 
    */ 
    public function headersSent() { 
     return curl_getinfo($this->resource, CURLINFO_HEADER_OUT); 
    } 

    /** 
    * Executes CURL request 
    * 
    * @return mixed Returns CURL execution result 
    */ 
    public function execute(){ 
     return curl_exec($this->resource); 
    } 

    /** 
    * Cleans CURL connection 
    */ 
    function __destruct(){ 
     curl_close($this->resource); 
    } 

} 

$curl = new MyCurl($url); 
$curl->execute(); 
+3

Questo non risponde alla domanda. –

+0

In realtà mi piace perché alcuni possono avere accesso a molti posti che eseguono php invece di avere accesso a uno dedicato/VPS dove possono installare privoxy. Se hai una dozzina di account di hosting con diversi IP, puoi configurare la tua piccola rete proxy. – JaseC

2

bisogna intercettare la richiesta DNS lookup dallo script php configurando tor con la direttiva "dnsport". quindi devi configurare un "trasporto" per tor e un "indirizzo di rete virtuale". ora cosa succede quando lo script php esegue una ricerca dns-tor è che vede una richiesta di un indirizzo di cipolla e risponde con un indirizzo IP dall'intervallo "virtualnetworkaddress". ora devi reindirizzare il traffico verso questo indirizzo all'indirizzo definito con "trasporto". leggere il manuale "torrc" su "automaphostonresolve", "virtualnetworkaddress", "dnsport" e "transport".

+1

Aggiungere un esempio sarebbe fantastico, mettere tutto questo per un utente inesperto potrebbe essere più difficile che vedere un esempio. – nKn

1

Penso che sia semplice come eseguire la richiesta della riga di comando con l'opzione usewithtor o torify. Per esempio:

$ usewithtor crawl.php

e lo script sarà in grado di interagire con i siti .onion. Avendo costruito un crawler per Tor da solo, sicuramente non userei questa strada per l'uso di produzione, io invece uso Python, PySocks e altre librerie di crawler invece di CURL. Speriamo che questo risponda alla tua domanda e ti dia qualche spunto per altre strategie di implementazione che vanno avanti.

Grazie